在 WebRTC 中,Audio 數據在被送入編碼器以前,有 2 大部分須要特別關注,一是數據採集,二是 Audio Processing。 java
做者:方來,技術專家,從事 voip 應用開發。算法
數據採集
數據採集主要由 Audio Device 模塊進行處理,並且是平臺和配置相關。例如:框架
- Mac 電腦,使用的是 CoreAudio API,通常狀況下使用默認內置的聲卡參數 fs=48kHz,stero。
- Windows 電腦,WebRTC 中用的是 WASAPI。根據聲卡參數不一樣,採樣率等參數可選的比較多,例若有的電腦 builtInAEC 打開後,fs=16kHz,Mono,若是把聲卡的 Audio Enhancement 關閉,則輸出 fs=48kHz,stero。
- Android 通常使用 java 層的 AudioRecord 框架。
- iOS 通常使用 AudioUnit 框架。
另外,數據採集部分,還涉及到 USB 耳機,3.5mm 耳機,藍牙耳機等外設,這些設備對音頻鏈路上後續的 Audio Processing 也是有影響的,好比增長了 Audio 採集的delay,有 Speech Enhancement 處理的耳機會修改音頻頻譜,有的耳機外設使用不當可能會致使音頻鏈路沒有聲音。性能
Audio Processing
Audio Processing 主要包括 AEC,AGC,NS 等等:優化
- AEC----Acoustic Echo Cancellation,即迴音消除。
- AGC----Automatic Gain Control,即自動增益,用來調整輸入信號的音量大小。
- NS----Noise Suppression,即噪音抑制。
從 Audio Devices 輸出的數據依次通過 AEC,NS,AGC 等音頻處理模塊。ui
1.AEC
AEC 算法選擇
在 WebRTC 中,AEC 有 4 個可選的算法:阿里雲
- builtInAEC,通常狀況下 Windows,Android 系統,builtInAEC 默認會開啓。
- AECM,移動端的迴音消除算法,適用於 Android和 iOS。
- AEC 算法,適用於 Windows/Mac Desktop 的迴音消除算法。固然 AEC 也能夠用在移動端,某些狀況下,回聲泄露的性能比 AECM 好。不過最新的 WebRTC 已經把老的 AEC 的 code 移除了。
- AEC3 算法,Google 對老的 AEC 算法的改版,目前 AEC3 已經全面替代老的 AEC 算法。
通常狀況下這 4 種 AEC 算法只能選擇一種,不然會作屢次 AEC,對聲音的損傷也會增長。在不得已的狀況下,可能會用到 2 個 AEC,例如 Windows 電腦,buildInAEC 關不掉且效果差的狀況下,就必須打開 AEC3,這時是用到 2 個 AEC。編碼
aec_dump
在一次通話中,使用 StartAecDump 開啓 aec_dump 功能,aec_dump 將錄製 3 個文件,一個是未進入 Audio Processing 模塊的 input.wav,一個是 Speaker Render 的輸出文件 reverse.wav,一個是通過 Audio Processing 處理過的 ref_out.wav。code
正常狀況下,input.wav - reverse.wav = ref_out.wav。視頻
經過這 3 個文件能夠分析迴音消除算法是否有問題。
2.AGC
WebRTC 的 AGC 有 2 種算法:
- Legacy AGC
- AGC2
下面簡單展現一下 Legacy AGC 的性能。 原始語音
AGC 後的語音,Legacy AGC 自己沒有降噪功能,噪音和語音同時放大的。
3.NS
目前 WebRTC 的 Noise Suppression 模塊,可以過濾掉比較平穩的背景噪音,例如 white nosise,空調聲等。可是 NS 模塊對音量很是大的背景噪音,還有 babble noise 都是失效的,這也是咱們客戶端在 Microphone 功放的狀況下的「嘈雜不清」的因素之一(固然致使嘈雜還有其餘的緣由,例如 AEC 的性能等等)。
夾雜 white noise 的錄音
white noise 被過濾掉
4.其餘加強算法
- High Pass Filter,用來過濾低頻噪音,好比咱們能夠把 100Hz 甚至 200Hz 如下的低頻噪音過濾掉。
- Typing Detector,能夠過濾掉鍵盤打字的聲音。
- Residual Echo Detector,殘留迴音探測。
優化點
-
採集(固然也包括播放)容易出現沒有聲音問題,因此必須對採集(聲卡驅動)端進行聲卡適配優化。
-
AEC 區分平臺: A. Windows 平臺,通常 Windows 的聲卡面板裏面有一個「Audio Enhancement」,這個裏面有的含有 builtInAEC,默認是打開的,經過 Windows API 關閉這個 Audio Enhancement 的幾乎不可行。有的 builtInAEC 效果比較差,這時 AEC3 必須打開。一般狀況下,builtInAEC 和 AEC3 同時打開,以便最大程度減小回聲。 B. Mac 電腦,默認沒有 buildInAEC,一般就直接使用 AEC3。
-
在 AEC 算法中增長「near talk」,「far talk」,「double talk」, 「no talk」狀態,結合這幾種狀態,採起不一樣的操做,例如在只有 far talk 的時候,不作 AGC,可以起到減小近端噪音的做用。
「視頻雲技術」你最值得關注的音視頻技術公衆號,每週推送來自阿里雲一線的實踐技術文章,在這裏與音視頻領域一流工程師交流切磋。