Rong Xiaobin
Rong Xiaobin
@shenbuguanni 非常感谢您指出这个问题,我查阅资料后发现我之前对 FLOPs 和 MACs 的理解有误,FLOPs为浮点运算次数,包括加法和乘法,而 MACs 为乘-加运算次数,所以1 MACs = 2 FLOPs,这里 ptflops 算出来的确实是 MACs。 再次感谢!
@shenbuguanni 是的,这个模块的设计不支持改变输入通道数。如果要让输出通道与输入通道不相等,则可以把主路的 1x1 conv 移到旁路,同时主路的 skip conncection 必须舍去。另外你还会看到,GTConvBlock 对于stride不为1也不支持,当然也可以通过在旁路增加卷积层来实现。事实上之前有试验过这样的版本,但性能会差,而且舍弃了 ShuffleNetV2 结构本身的简洁。对于小模型设计来说,我的观点是尽量简单,因为简单会对部署更友好。而且过于复杂的设计,即使能降低字面上的参数量与计算量,其计算速度(体现为实时率RTF)还是不能提高。 回到这个模型,如果想增加其规模,例如要输入32通道,则必须在前面的普通Conv模块那里增加通道数,例如:输入3 -> 经过第一个Conv变为16 -> 经过第二个Conv变为32。 希望能解答你的问题!
@shenbuguanni 感谢你的关注,paper已经见刊: https://ieeexplore.ieee.org/document/10448310
@shenbuguanni 我刚从DiDiSpeech的github官网看了,数据集似乎已经不开源了。
训练代码请关注我另一个项目 [SEtrain](https://github.com/Xiaobin-Rong/SEtrain),只需要修改下model等文件即可
你好! 感谢支持。低信噪比环境本身对降噪模型就是一个挑战,非常容易出现降噪不干净/过抑制的问题,对于小参数网络,问题会更显著,这是很难解决的挑战。目前对于提高小参数网络的性能和泛化性还在研究中,欢迎您持续的关注!
@gedebabin 你好!第一个问题permute两次是因为Mask类中定义了输入的mask和spec维度是(B,2,T,F) ``` class Mask(nn.Module): """Complex Ratio Mask""" def __init__(self): super().__init__() def forward(self, mask, spec): s_real = spec[:,0] * mask[:,0] - spec[:,1] * mask[:,1] s_imag = spec[:,1] * mask[:,0] +...
你好!转换到48k是需要修改模型的。对于48k数据,如果STFT沿用32ms帧长的设置,频率维度将会是769个点而不是257个点。需要考虑以下几个改动: 1. 在频谱压缩BM模块,对多少kHz以下的频带不压缩? 2. 输入的频谱通过Encoder之后,频率维度是多少?要相应地调整Bottleneck的G-DPRNN的参数; 可能还存在其它我没考虑到的修改,祝你工作顺利!
> 我尝试采用512点STFT,也就是帧长为10.6ms,频带3k以下不压缩,3k以上erb压缩频带,但是出现语音被消掉的情况,请问有什么需要注意的细节吗? 可能是512点STFT太短了,一般至少使用20ms以上的帧长。ERB压缩可能放到4k会好一点
数据集合成的方式在paper里面讲的比较清楚了,没有什么特别的地方。