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

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

作者:方来,技术专家,从事 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 的性能。
浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程_第2张图片
原始语音

浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程_第3张图片
AGC 后的语音,Legacy AGC 本身没有降噪功能,噪音和语音同时放大的。

3.NS

目前 WebRTC 的 Noise Suppression 模块,能够过滤掉比较平稳的背景噪音,例如 white nosise,空调声等。但是 NS 模块对音量非常大的背景噪音,还有 babble noise 都是失效的,这也是我们客户端在 Microphone 功放的情况下的“嘈杂不清”的因素之一(当然导致嘈杂还有其他的原因,例如 AEC 的性能等等)。

浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程_第4张图片
夹杂 white noise 的录音

浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程_第5张图片
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。

  1. 在 AEC 算法中增加“near talk”,“far talk”,“double talk”, “no talk”状态,结合这几种状态,采取不同的操作,例如在只有 far talk 的时候,不做 AGC,能够起到减少近端噪音的作用。
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

你可能感兴趣的:(浅谈 WebRTC 的 Audio 在进入 Encoder 之前的处理流程)