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

简介: 在 WebRTC 中,Audio 数据在被送入编码器之前,有 2 大部分需要特别关注,一是数据采集,二是 Audio Processing。

作者:方来
来源:浅谈 WebRTC 的 Audio 在进入 encoder 之前的处理流程

数据采集

数据采集主要由 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 的性能。
image.png

原始语音

image.png

AGC 后的语音,Legacy AGC 本身没有降噪功能,噪音和语音同时放大的。

3.NS

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

image.png
夹杂 white noise 的录音

image.png
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。

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

「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

image.png

相关文章
|
9月前
|
机器学习/深度学习 算法 网络协议
开源上新|通义语音处理技术ClearerVoice-Studio
开源上新|通义语音处理技术ClearerVoice-Studio
|
Web App开发 监控 算法
详解 WebRTC 高音质低延时的背后 — AGC(自动增益控制)
本文将结合实例全面解析 WebRTC AGC 的基本框架,一起探索其基本原理、模式的差异、存在的问题以及优化方向。
详解 WebRTC 高音质低延时的背后 — AGC(自动增益控制)
|
存储 C++ 容器
C++ 第九节——map/set(用法+底层原理+模拟实现)
们需要知道的是,Map和Set的底层都是红黑树。
1044 1
C++ 第九节——map/set(用法+底层原理+模拟实现)
|
网络协议 Linux 网络安全
Iptables深度解析:四表五链与动作参数
Iptables深度解析:四表五链与动作参数
1248 0
|
编解码
RTP传输AAC
RTP传输AAC
308 1
|
Web App开发 Android开发 ice
【Android App】给App集成WebRTC实现视频发送和接受实战(附源码和演示 超详细)
【Android App】给App集成WebRTC实现视频发送和接受实战(附源码和演示 超详细)
1407 1
|
Web App开发 机器学习/深度学习 算法
AliAGC 自动增益控制算法:解决复杂场景下的音量问题
极大改善不同环境、设备、场景下音量不统一的问题
11000 1
AliAGC 自动增益控制算法:解决复杂场景下的音量问题
|
Web App开发 机器学习/深度学习 存储
深入浅出 WebRTC AEC(声学回声消除)
为什么会议、聊天和直播连麦等不能用 RTMP 做?必须用 WebRTC?因为 WebRTC 中的音频处理是非常关键的技术,详细可以看这个文章,公式有点多,但别怕,都是简单代数,能看懂的。
深入浅出 WebRTC AEC(声学回声消除)
|
架构师 Java 测试技术
软件设计实践:如何使用UML完成一个设计文档?
软件设计实践:如何使用UML完成一个设计文档?UML 建模可以很复杂,也可以很简单,简单掌握类图、时序图、组件图、部署图、用例 图、状态图、活动图这 7 种模型图,根据场景的不同,灵活在需求分析、概要设计和详细设计阶段绘制对应的模型图,可以实实在在地做好软件建模,搞好系统设计,做一个掌控局面、引领技术团队的架构师。
453 1
软件设计实践:如何使用UML完成一个设计文档?
|
开发工具 vr&ar 图形学
【AR隔空手势交互】Unity中基于Manomotion实现隔空手势交互
Unity开发,基于Manomotion实现隔空手势交互,无硬件设备要求,支持安卓、苹果、AR Foundation开发
677 0