Noise suppression,就是大家说的降噪。这种降噪是把人声和非人声区分开来,把非人声当成噪声。
一段包含人声和噪声的音频经过该模块处理,从理论上讲,只剩下人声了。
webrtc的NS在业内还是赫赫有名的,通过实际对比测试,我们发现webrtc的降噪的确是性能和稳定性
都要高于同类开源算法。
webrtc的ns原理是这样的:把启动前50帧的数据拿来构建噪声模型,把启动前200帧的信号强度用来计
算归一化的频谱差值计算。根据这两个模型使用概率目的函数来计算出每帧的信噪比并区分出噪声和声音,
然后根据计算出的信噪比在频域使用维纳滤波器对噪声信号进行噪声消除,最后在根据降噪前后的能量比
和信号噪声似然比对降噪后的数据进行修复和调整后输出。
webrtc的NS使用分析:webrtc的降噪支持三种采样率,8k,16k和32k,其它的采样率的降噪可以通过
瞎采样来完成。降噪模式有四种:分别是,0,1,2,3 四种模式的降噪量依次增加,笔者亲自测过,一般是2比较
好,对声音损失小,降噪效果又不错。还有个比较重要的参数就是噪声估计模型宏定义,如下所示,推荐在
系统计算能力够的情况下使用第三种,效果最好。
#define PROCESS_FLOW_0 // Use the traditional method.
#define PROCESS_FLOW_1 // Use traditional with DD estimate of prior SNR.
#define PROCESS_FLOW_2 // Use the new method of speech/noise classification.
使用方法和代码调用:
初始化:申请内存,设置采样率和降噪模式。
WebRtcNs_Create(&pNS_inst);
WebRtcNs_Init(pNS_inst,nSample);
WebRtcNs_set_policy(pNS_inst,nMode);
处理主函数:针对降噪的帧进行处理,默认是10ms的帧长度。
int WebRtcNs_Process(NsHandle* NS_inst, short* spframe, short* spframe_H,
short* outframe, short* outframe_H)
linux下可以直接编译运行的代码路径: https://github.com/DyLanCao/webrtc