在 WebRTC 中,Audio 數據在被送入編碼器以前,有 2 大部分須要特別關注,一是數據採集,二是 Audio Processing。
java
做者:方來,技術專家,從事 voip 應用開發。算法
數據採集主要由 Audio Device 模塊進行處理,並且是平臺和配置相關。例如:框架
另外,數據採集部分,還涉及到 USB 耳機,3.5mm 耳機,藍牙耳機等外設,這些設備對音頻鏈路上後續的 Audio Processing 也是有影響的,好比增長了 Audio 採集的delay,有 Speech Enhancement 處理的耳機會修改音頻頻譜,有的耳機外設使用不當可能會致使音頻鏈路沒有聲音。ide
Audio Processing 主要包括 AEC,AGC,NS 等等:性能
從 Audio Devices 輸出的數據依次通過 AEC,NS,AGC 等音頻處理模塊。優化
在 WebRTC 中,AEC 有 4 個可選的算法:ui
通常狀況下這 4 種 AEC 算法只能選擇一種,不然會作屢次 AEC,對聲音的損傷也會增長。在不得已的狀況下,可能會用到 2 個 AEC,例如 Windows 電腦,buildInAEC 關不掉且效果差的狀況下,就必須打開 AEC3,這時是用到 2 個 AEC。編碼
在一次通話中,使用 StartAecDump 開啓 aec_dump 功能,aec_dump 將錄製 3 個文件,一個是未進入 Audio Processing 模塊的 input.wav,一個是 Speaker Render 的輸出文件 reverse.wav,一個是通過 Audio Processing 處理過的 ref_out.wav。3d
正常狀況下,input.wav - reverse.wav = ref_out.wav。code
經過這 3 個文件能夠分析迴音消除算法是否有問題。
WebRTC 的 AGC 有 2 種算法:
下面簡單展現一下 Legacy AGC 的性能。
原始語音
AGC 後的語音,Legacy AGC 自己沒有降噪功能,噪音和語音同時放大的。
目前 WebRTC 的 Noise Suppression 模塊,可以過濾掉比較平穩的背景噪音,例如 white nosise,空調聲等。可是 NS 模塊對音量很是大的背景噪音,還有 babble noise 都是失效的,這也是咱們客戶端在 Microphone 功放的狀況下的「嘈雜不清」的因素之一(固然致使嘈雜還有其餘的緣由,例如 AEC 的性能等等)。
夾雜 white noise 的錄音
white noise 被過濾掉
採集(固然也包括播放)容易出現沒有聲音問題,因此必須對採集(聲卡驅動)端進行聲卡適配優化。
AEC 區分平臺:
A. Windows 平臺,通常 Windows 的聲卡面板裏面有一個「Audio Enhancement」,這個裏面有的含有 builtInAEC,默認是打開的,經過 Windows API 關閉這個 Audio Enhancement 的幾乎不可行。有的 builtInAEC 效果比較差,這時 AEC3 必須打開。一般狀況下,builtInAEC 和 AEC3 同時打開,以便最大程度減小回聲。
B. Mac 電腦,默認沒有 buildInAEC,一般就直接使用 AEC3。