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
與乾淨數據的譜圖對比,ANC 的也損失掉了一部分原始信息。WebRTC noise suppression 具體實現分析見[2]。
AEC 的實現似乎沒有什麼效果。
波形展示、譜圖分析使用軟體 Sonic Visualiser。
[1]. https://zh.wikipedia.org/wiki/WebRTC
[2]. WebRTC之noise suppression演算法
推薦閱讀:
※宋冬野的人聲混音是如何做到那樣厚實而有磁性的?
※如何正確地錄製一場演唱會現場音頻?
※很想翻唱的一首歌找不到伴奏怎麼辦?
※高頻激勵器和提升高頻EQ的效果有何區別?
※音頻採樣中如果出現摩爾紋,聽起來會是什麼效果?