浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程

WebRTC 中,Audio 数据在被送入编码器之前,有 2 大部分需要特别关注,一是数据采集,二是 Audio Processing。
浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程

作者:方来,技术专{ J )家,从事 vQ z Y & k ; ( ,oip 应用开发。

数据采集

数据采集主要由 Audio Dev% 6 O 0 U Nice 模块进行处理,而9 D ] ^ M W | O且是平台和配置相关。例如:

  1. Mac 电脑,使用的是 CoreAudio API,一般情况下使用默认内置的声卡参数 fs=48kHz,st z } t p & Gero。
  2. Windows 电脑,WebRTC 中用的b E v | ) n q是 WASAPI。C H r yQ b S y据声卡参数不同,采样率等G % : f F参数N u D $ L可选的比较多,例如有的电脑 buils s ? m m F 0tInAEC 打开后 ~ 9 h C u $ 0 K,fs=16kHz,Mono,如果把声卡的 Audio Enhancement 关闭,则输出 f1 ; ` L /s=48kHz,stero。
  3. Android 一般使用 java 层的 AudioRecord 框架。E - b R 8 { g * -
  4. iOS 一般使用 AudioUnit 框架。

另外,数据采集部分,还涉及到 USB 耳机,3.5mm 耳机,蓝牙耳机等外设,这些设备对音频链路上W ^ T : ` J O b b后续的 Audio Processing 也是有影响的,比如增加了 Audio 采集的delay,有 Speech Enhancem~ I T P ~ent 处理的耳机会修改音频频谱,有的耳机外设使用不当可能会导致音频链路没有声音。

Audio Processing

Audio Processi9 Z I F Q ] E (ng 主要包括 AEC,AGC,NS 等等:

  • AEC----Acoustic Echo Cancellation,即回音消除。
  • AGC----Automatic Gain Cont, N ]rol,即自动增益,用来调整输入信号的音量k } o j R /大小。
  • NS---y k . K-Noise Suppression,即噪音抑制。

从 Audio Devices 输出的数据依次经过 AEC,NS,AGC 等q u [音频处理模块。

1.AEC

AEC 算法选择

在 WebRTC 中,AEC 有 4 个可选的算法:

  1. builtInAEC,一般情况下 Windows,Android 系统,builtInAEC 默认会开启。
  2. AECM,移动端的回音消除算法,适用于 Android和 i_ i v j q h ~ H kOS。
  3. AEC 算法,适用于 Windows/Mac Desktop 的回音消除算法。当然 AEC 也可以用在移动端,某些情况下,回声泄露的性能比 AECM 好。不过最新的 WebRTC 已经把老的 AEC 的 code 移除了。
  4. AEC3 算法,Google 对老的 AEC 算法的改版,目前 AEC3 已经全面替代老的 AEC 算法。

一般情况下这 4 种 A! | * Q s gEC 算法只能选择一种,否则会做多次 AEC,对声音的` % [ & v h损伤也会增加。在不得已的情况下,可能会用到 2 个 AEC,例如 Windows 电脑,buildInAEC 关不掉且效果差的情况下,就必须打开 AEC3,这时是用到 2 个 AEC。

aec_dump

在一次通话中,使用 StartAecDump 开启 aec_dump 功能,aec_dump 将录制 3 个文件,一个是未进入 Audio Prg F N E e I O ?ocessing 模块的 input.w H n n O $av,一个是 Speake( % [ v Ar Render 的输{ x C出文件 reverse.wav,一个是经过 Audio Processing 处理过的 ref_out.wav。

正常情况下,input.wav - reverse.wav = ref_out.wG p 9 h Wa( k 1v。

通过这 3 个文件可以分析回音消除算法是* k ` - 3 g w x U有问题

2.AGC

WebRTC 的 AGC 有 2 种算法:

  1. Legacy AGC
  2. AGC2

下面简单展示_ ) ;一下 Legacy AGC 的性能。
浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程
原始语音

浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程
AGC 后的语音,Legacy AGC 本身没有降噪功能z Y - b,噪音和语音同时放大的。

3.NS

目前 WebRTC 的 Noise Suppressio3 * Zn 模块,能够过滤掉比较8 z + E ? 6 x V平稳的背景噪音,例如 white nosise,空调声等。但是 NS 模块对音量非常大的背景噪音,还有 babble noise 都是失效的,这也是我们客户端在 Microphone 功放的情况下的“嘈杂不清} g B”的因素之一(当然导致嘈杂还有其w M y ) ` } | N他的原因,例如 AEC 的性能等等)。

浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程
夹杂 white noise 的录音

浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程
white noiseS k 9 6 E b 1 被过滤掉

4.其他增强算法

  1. High Pass Filter,用来过滤低频噪音,比如我们可以把 100Hz 甚至 200Hz 以下的低频噪音过滤掉。
  2. Typing Detector,可] y * M q以过滤掉键盘打字的声音。
  3. Residual Echo Detector,残留回音探测。

优化点

  1. 采集(当然也包括播放)容易出现没有声音问题,所以必须对采集(声卡驱动)端进行声卡适配优化。| 6 m 7 T

  2. AEC 区分平台:
    A. Windows 平台,一般 Windows 的声卡面板里面有一个“Audio Enhan@ : q o { / 3 :ceP 1 A T iment”,这个里面有的B N 含有 builtInAEC,默认是打开的,通过 Windows API 关闭这个 Audio Enhancement 的几乎不可行。有的 buio x m K 4 4 vltIK E , d RnAEC 效W k =果比较差,这时 AEC3 必须c a [ k E ~ ^打开。通常情况下,builtInAEC 和 AEC3 同时打开,以便最大程度减少回声。
    B. Mac 电脑,默认没有 buildInAEC,通常就直接使用 AEC3。

  3. 在 AEC 算法中增加“near talk”,“far talk”,“double talk”, “no talk”状态,结合这几种状态,采取不同的操作,例如在只有 far talk 的时候,不做 AGC,能够起到减少近端噪音的作用。