在 WebRTC 中,Audio 資料在被送入編碼器之前,有 2 大部分需要特別關注,一是資料採集,二是 Audio Processing。
作者:方來,技術專家,從事 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 等音訊處理模組。
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。
正常情況下,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,能夠起到減少近端噪音的作用。
「視訊雲技術」你最值得關注的音視訊技術公眾號,每週推送來自阿里雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。