淺談 WebRTC 的 Audio 在進入 Encoder 之前的處理流程

VideoCloudTech發表於2020-12-25

在 WebRTC 中,Audio 資料在被送入編碼器之前,有 2 大部分需要特別關注,一是資料採集,二是 Audio Processing。
file

作者:方來,技術專家,從事 voip 應用開發。

資料採集

資料採集主要由 Audio Device 模組進行處理,而且是平臺和配置相關。例如:

  1. Mac 電腦,使用的是 CoreAudio API,一般情況下使用預設內建的音效卡引數 fs=48kHz,stero。
  2. Windows 電腦,WebRTC 中用的是 WASAPI。根據音效卡引數不同,取樣率等引數可選的比較多,例如有的電腦 builtInAEC 開啟後,fs=16kHz,Mono,如果把音效卡的 Audio Enhancement 關閉,則輸出 fs=48kHz,stero。
  3. Android 一般使用 java 層的 AudioRecord 框架。
  4. 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 個可選的演算法:

  1. builtInAEC,一般情況下 Windows,Android 系統,builtInAEC 預設會開啟。
  2. AECM,移動端的迴音消除演算法,適用於 Android和 iOS。
  3. AEC 演算法,適用於 Windows/Mac Desktop 的迴音消除演算法。當然 AEC 也可以用在移動端,某些情況下,回聲洩露的效能比 AECM 好。不過最新的 WebRTC 已經把老的 AEC 的 code 移除了。
  4. 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 種演算法:

  1. Legacy AGC
  2. AGC2

下面簡單展示一下 Legacy AGC 的效能。
原始語音
原始語音

AGC 後的語音
AGC 後的語音,Legacy AGC 本身沒有降噪功能,噪音和語音同時放大的。

3.NS

目前 WebRTC 的 Noise Suppression 模組,能夠過濾掉比較平穩的背景噪音,例如 white nosise,空調聲等。但是 NS 模組對音量非常大的背景噪音,還有 babble noise 都是失效的,這也是我們客戶端在 Microphone 功放的情況下的“嘈雜不清”的因素之一(當然導致嘈雜還有其他的原因,例如 AEC 的效能等等)。

file
夾雜 white noise 的錄音

file
white noise 被過濾掉

4.其他增強演算法

  1. High Pass Filter,用來過濾低頻噪音,比如我們可以把 100Hz 甚至 200Hz 以下的低頻噪音過濾掉。
  2. Typing Detector,可以過濾掉鍵盤打字的聲音。
  3. Residual Echo Detector,殘留迴音探測。

優化點

  1. 採集(當然也包括播放)容易出現沒有聲音問題,所以必須對採集(音效卡驅動)端進行音效卡適配優化。

  2. AEC 區分平臺:
    A. Windows 平臺,一般 Windows 的音效卡皮膚裡面有一個“Audio Enhancement”,這個裡面有的含有 builtInAEC,預設是開啟的,通過 Windows API 關閉這個 Audio Enhancement 的幾乎不可行。有的 builtInAEC 效果比較差,這時 AEC3 必須開啟。通常情況下,builtInAEC 和 AEC3 同時開啟,以便最大程度減少回聲。
    B. Mac 電腦,預設沒有 buildInAEC,通常就直接使用 AEC3。

  3. 在 AEC 演算法中增加“near talk”,“far talk”,“double talk”, “no talk”狀態,結合這幾種狀態,採取不同的操作,例如在只有 far talk 的時候,不做 AGC,能夠起到減少近端噪音的作用。

「視訊雲技術」你最值得關注的音視訊技術公眾號,每週推送來自阿里雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。

相關文章