WebRTC AudioProcessing 3A: AEC AGC ANC 初探

WebRTC

WebRTC 為瀏覽器、手機應用提供了實時語音、視頻對話API,於2011年6月1日開源並在Google、Mozilla、Opera支持下被納入萬維網聯盟的W3C推薦標準[1]。

本文簡略示範 WebRTC Audio Processing 模塊的 Acoustic Echo Cancelling(AEC)、Automatic Gain Control(AGC)、Active Noise Control(ANC,也被稱為noise cancellation、noise suppression)的使用方式,俗稱 3A。

全部代碼放在 codingmath/webrtc-audio-examples · GitHub

cd codingmath/webrtc-audio-examplesbash run.sh

下載、編譯、安裝 webrtc-audio-processing

if [ ! -d webrtc-audio-processing ];then git clone git://anongit.freedesktop.org/pulseaudio/webrtc-audio-processingfiif [ ! -d webrtc-audio-processing/release ];then cd webrtc-audio-processing mv RELEASE release.txt >/dev/null ./autogen.sh --prefix=`pwd`/release && make -j && make install && cd -fi

使用 CMake 編譯示例代碼

mkdir bin; cd bin; cmake ../; make; cd -

AEC AGC ANC

#include "webrtc/modules/audio_processing/include/audio_processing.h"

頭文件定義了 AudioProcessing 類,含有 3A 演算法的 method,具體的實現分別放在

modules/audio_processing/├── aec│ └── include├── aecm│ └── include├── agc│ └── legacy├── ns (noise_suppression) # e.g. anc│ └── include

調用邏輯:Create AudioProcessing class -> Enable 相應方法 -> ReadFrame-ProcessFrame-WriteFrame,代碼詳見 src/webrtc_audio_processing.cc 。

// Usage example, omitting error checking:webrtc::AudioProcessing* apm = webrtc::AudioProcessing::Create();apm->high_pass_filter()->Enable(true);if (std::string(argv[1]) == "-anc") { apm->noise_suppression()->Enable(true);} else if (std::string(argv[1]) == "-agc") { apm->gain_control()->Enable(true); apm->gain_control()->set_analog_level_limits(0, 255);} else if (std::string(argv[1]) == "-aec") { webrtc::EchoCancellation *echo_canell = apm->echo_cancellation(); is_echo_cancel = true; echo_canell->enable_drift_compensation(false); echo_canell->Enable(true);} else { delete apm; return usage();}webrtc::AudioFrame *frame = new webrtc::AudioFrame();while (ReadFrame(wav_in, frame)) { num_frame += 1; apm->ProcessStream(frame); WriteFrame(wav_out, frame);}

使用 sox 添加 whitenoise 到 data/speech_16k.wav 生成 data/addednoise.wav,使用WebRTC 的 ANC 進行降噪處理:

藍色是乾淨音頻,綠色為加噪音頻。

在譜圖上可以看到加噪音頻 whitenoise 帶來的噪點。

============= WebRTC ANC =============WebRTC ANC 0: ANC: level 0WebRTC ANC 1: ANC: level 1WebRTC ANC 2: ANC: level 2WebRTC ANC 3: ANC: level 3

依次為四個 level 的降噪結果,可以不同 level 設置 ANC 結果有一定差異;

與乾淨數據的譜圖對比,ANC 的也損失掉了一部分原始信息。WebRTC noise suppression 具體實現分析見[2]。

AEC 的實現似乎沒有什麼效果。

波形展示、譜圖分析使用軟體 Sonic Visualiser。

[1]. zh.wikipedia.org/wiki/W

[2]. WebRTC之noise suppression演算法

推薦閱讀:

宋冬野的人聲混音是如何做到那樣厚實而有磁性的?
如何正確地錄製一場演唱會現場音頻?
很想翻唱的一首歌找不到伴奏怎麼辦?
高頻激勵器和提升高頻EQ的效果有何區別?
音頻採樣中如果出現摩爾紋,聽起來會是什麼效果?

TAG:WebRTC | 音频处理 |