rnnoise会有一个pitch_filter
这是由于因为它们在生成特征时不是用频域上所有频点,而是采取bark's scale的切分频段来对不同频率的频段进行特征处理
这样的话频域上的分辨率会降低,然后导致最后在进行降噪后生成的语音会有一个现象就是oversmoothing,即你会辨别不清共振峰.
尽管bark's scale 在低频部分的频段分得很细,但是他把好几个频率都归为一个频带,就会使得生成波形很平滑(想想看,以前每个频点分别处理,现在几个频点虽然代表不同频率,但都是统一类,一起处理,就会平滑)但在语音中,过度平滑不是好处,对识别人听和识别是坏处的,所以pitch_filter就是去sharp这些共振峰的.
这个处理oversmoothing 的部分在另外一个项目也就是中科大sednn降噪的 global variance处理也能体现出来.
然后会有人问,可不可以不用barks'scale 处理,直接频点处理呢,可以,但在高频会有问题.
因为帧与帧之间在低频部分会有小部分变化,但那种变化并不是特别大,可是在高频部分变化是非常剧烈的(拿段音频做频谱分析你就能知道)
原因有两个:
1.高频部分信噪比比较低,所以噪声较大,SE处理后噪点多
2.因为高频部分是n阶谐波,基频变一点,高频变很多
如果把每个频点单独处理的话,到时候降噪可能会产生残余噪点,影响听觉感受. 这也能理解为啥mfcc高频的滤波器跨越的频率那么宽,低频滤波器很多
最后,改了rnnoise的东西能生成16k的模型,用aishell的数据进行训练和测试,asr 效果确有提高~
我把rnnoise 16k的训练方法开源出来了, 有兴趣参考 rnnoise16k