開發與維運

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

作者:方來
來源:淺談 WebRTC 的 Audio 在進入 encoder 之前的處理流程

數據採集

數據採集主要由 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 的性能。
image.png

原始語音

image.png

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

3.NS

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

image.png
夾雜 white noise 的錄音

image.png
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,能夠起到減少近端噪音的作用。

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

image.png

Leave a Reply

Your email address will not be published. Required fields are marked *