1. 程式人生 > >提綱挈領webrtc之NS(noise suppression)模塊

提綱挈領webrtc之NS(noise suppression)模塊

pre pri 情況 init def lan 數據 自測 noi

  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

提綱挈領webrtc之NS(noise suppression)模塊