作者:方來
來源:淺談 WebRTC 的 Audio 在進入 encoder 之前的處理流程
數據採集
數據採集主要由 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,能夠起到減少近端噪音的作用。
「視頻雲技術」你最值得關注的音視頻技術公眾號,每週推送來自阿里雲一線的實踐技術文章,在這裡與音視頻領域一流工程師交流切磋。