在 WebRTC 中,Audio 数据在被送入编码器以前,有 2 大部分须要特别关注,一是数据采集,二是 Audio Processing。 java
做者:方来,技术专家,从事 voip 应用开发。算法
数据采集
数据采集主要由 Audio Device 模块进行处理,并且是平台和配置相关。例如:框架
- Mac 电脑,使用的是 CoreAudio API,通常状况下使用默认内置的声卡参数 fs=48kHz,stero。
- Windows 电脑,WebRTC 中用的是 WASAPI。根据声卡参数不一样,采样率等参数可选的比较多,例若有的电脑 builtInAEC 打开后,fs=16kHz,Mono,若是把声卡的 Audio Enhancement 关闭,则输出 fs=48kHz,stero。
- Android 通常使用 java 层的 AudioRecord 框架。
- 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 等音频处理模块。ui
1.AEC
AEC 算法选择
在 WebRTC 中,AEC 有 4 个可选的算法:阿里云
- builtInAEC,通常状况下 Windows,Android 系统,builtInAEC 默认会开启。
- AECM,移动端的回音消除算法,适用于 Android和 iOS。
- AEC 算法,适用于 Windows/Mac Desktop 的回音消除算法。固然 AEC 也能够用在移动端,某些状况下,回声泄露的性能比 AECM 好。不过最新的 WebRTC 已经把老的 AEC 的 code 移除了。
- 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。code
正常状况下,input.wav - reverse.wav = ref_out.wav。视频
经过这 3 个文件能够分析回音消除算法是否有问题。
2.AGC
WebRTC 的 AGC 有 2 种算法:
- Legacy AGC
- AGC2
下面简单展现一下 Legacy AGC 的性能。 原始语音
AGC 后的语音,Legacy AGC 自己没有降噪功能,噪音和语音同时放大的。
3.NS
目前 WebRTC 的 Noise Suppression 模块,可以过滤掉比较平稳的背景噪音,例如 white nosise,空调声等。可是 NS 模块对音量很是大的背景噪音,还有 babble noise 都是失效的,这也是咱们客户端在 Microphone 功放的状况下的“嘈杂不清”的因素之一(固然致使嘈杂还有其余的缘由,例如 AEC 的性能等等)。
夹杂 white noise 的录音
white noise 被过滤掉
4.其余加强算法
- High Pass Filter,用来过滤低频噪音,好比咱们能够把 100Hz 甚至 200Hz 如下的低频噪音过滤掉。
- Typing Detector,能够过滤掉键盘打字的声音。
- Residual Echo Detector,残留回音探测。
优化点
-
采集(固然也包括播放)容易出现没有声音问题,因此必须对采集(声卡驱动)端进行声卡适配优化。
-
AEC 区分平台: A. Windows 平台,通常 Windows 的声卡面板里面有一个“Audio Enhancement”,这个里面有的含有 builtInAEC,默认是打开的,经过 Windows API 关闭这个 Audio Enhancement 的几乎不可行。有的 builtInAEC 效果比较差,这时 AEC3 必须打开。一般状况下,builtInAEC 和 AEC3 同时打开,以便最大程度减小回声。 B. Mac 电脑,默认没有 buildInAEC,一般就直接使用 AEC3。
-
在 AEC 算法中增长“near talk”,“far talk”,“double talk”, “no talk”状态,结合这几种状态,采起不一样的操做,例如在只有 far talk 的时候,不作 AGC,可以起到减小近端噪音的做用。
「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。