在 WebRTC 中,Audio 数据在被送入编码器以前,有 2 大部分须要特别关注,一是数据采集,二是 Audio Processing。java
做者:方来,技术专家,从事 voip 应用开发。算法
数据采集主要由 Audio Device 模块进行处理,并且是平台和配置相关。例如:框架
另外,数据采集部分,还涉及到 USB 耳机,3.5mm 耳机,蓝牙耳机等外设,这些设备对音频链路上后续的 Audio Processing 也是有影响的,好比增长了 Audio 采集的delay,有 Speech Enhancement 处理的耳机会修改音频频谱,有的耳机外设使用不当可能会致使音频链路没有声音。ide
Audio Processing 主要包括 AEC,AGC,NS 等等:性能
从 Audio Devices 输出的数据依次通过 AEC,NS,AGC 等音频处理模块。优化
在 WebRTC 中,AEC 有 4 个可选的算法:ui
通常状况下这 4 种 AEC 算法只能选择一种,不然会作屡次 AEC,对声音的损伤也会增长。在不得已的状况下,可能会用到 2 个 AEC,例如 Windows 电脑,buildInAEC 关不掉且效果差的状况下,就必须打开 AEC3,这时是用到 2 个 AEC。编码
在一次通话中,使用 StartAecDump 开启 aec_dump 功能,aec_dump 将录制 3 个文件,一个是未进入 Audio Processing 模块的 input.wav,一个是 Speaker Render 的输出文件 reverse.wav,一个是通过 Audio Processing 处理过的 ref_out.wav。3d
正常状况下,input.wav - reverse.wav = ref_out.wav。code
经过这 3 个文件能够分析回音消除算法是否有问题。
WebRTC 的 AGC 有 2 种算法:
下面简单展现一下 Legacy AGC 的性能。
原始语音
AGC 后的语音,Legacy AGC 自己没有降噪功能,噪音和语音同时放大的。
目前 WebRTC 的 Noise Suppression 模块,可以过滤掉比较平稳的背景噪音,例如 white nosise,空调声等。可是 NS 模块对音量很是大的背景噪音,还有 babble noise 都是失效的,这也是咱们客户端在 Microphone 功放的状况下的“嘈杂不清”的因素之一(固然致使嘈杂还有其余的缘由,例如 AEC 的性能等等)。
夹杂 white noise 的录音
white noise 被过滤掉
采集(固然也包括播放)容易出现没有声音问题,因此必须对采集(声卡驱动)端进行声卡适配优化。
AEC 区分平台:
A. Windows 平台,通常 Windows 的声卡面板里面有一个“Audio Enhancement”,这个里面有的含有 builtInAEC,默认是打开的,经过 Windows API 关闭这个 Audio Enhancement 的几乎不可行。有的 builtInAEC 效果比较差,这时 AEC3 必须打开。一般状况下,builtInAEC 和 AEC3 同时打开,以便最大程度减小回声。
B. Mac 电脑,默认没有 buildInAEC,一般就直接使用 AEC3。