APM 音频处理总览 · 让你的声音干净
麦克风采的音里混着回声、噪声、忽大忽小的音量——APM(音频处理模块)是一条净化流水线,依次做回声消除、降噪、增益、检测。这一章读 audio_processing.h:ProcessStream 处理近端、ProcessReverseStream 喂入远端参考,以及处理链的各个环节。
APM 音频处理总览 · 让你的声音干净
发送侧,麦克风采到的原始音频很脏:混着扬声器传回的回声、环境噪声、忽大忽小的音量。直接发出去,对方听着难受。APM(Audio Processing Module,modules/audio_processing/) 是一条净化流水线,把脏音频洗干净再编码。它是521 个文件的大模块、WebRTC 音频的另一座高峰。这一章总览。
两个入口:近端与远端
APM 的接口(modules/audio_processing/include/audio_processing.h)有两个关键方法,理解它们是理解 APM 的钥匙:
ProcessStream 处理“近端”(你的麦克风采集),ProcessReverseStream 喂入“远端”(对方的声音,即将从你的扬声器播出)——后者是回声消除必需的参考。
ProcessStream(近端 / capture) —— 处理你麦克风采的音频。这是要净化、要发出去的主线:消回声、降噪、调增益都在这条流上。ProcessReverseStream(远端 / render) —— 喂入对方的声音(你即将播放的那段)。它不是要发出去的,而是给回声消除当参考:APM 得知道“扬声器正在播什么”,才能从麦克风采的音里识别并减掉那部分(那就是回声)。
这就是回声消除的根本前提:你必须同时知道“扬声器播了什么”(远端参考)和“麦克风采了什么”(近端),两相对照,才能算出“麦克风采的音里,哪部分是扬声器漏回来的回声”。所以 APM 必须两条流都喂——单有麦克风的音,消不了回声。下一章细说这个问题。
处理链:一道道工序
近端音频(ProcessStream)经过一条流水线,每个环节洗掉一种“脏”:
| 环节 | 洗掉什么 | 本教程 |
|---|---|---|
| 高通滤波(HPF) | 低频噪声(空调嗡嗡、风声) | 本章 |
| 回声消除(AEC3) | 扬声器传回麦克风的回声 | AEC3 章 |
| 降噪(NS) | 稳态背景噪声(风扇、白噪) | NS 章 |
| 自动增益(AGC) | 音量忽大忽小(离麦远近) | AGC 章 |
| 语音活动检测(VAD) | (不洗,而是判断)有没有人在说话 | VAD 章 |
APM 是“一道道工序”的流水线,顺序有讲究。 比如回声消除通常在降噪之前(先去掉最“结构化”的回声,再处理弥散的噪声);高通滤波在最前(先砍掉没用的低频)。每个环节都是一个可独立开关、独立调参的子模块(可在 config 里配置)。这条链把“一堆音频信号处理算法”组织成一个清晰的管线——输入脏音频,输出干净人声。这些算法(尤其AEC3)是几十年音频信号处理的结晶,也是 WebRTC 音质好的关键:同样的麦克风、同样的网络,APM 的好坏直接决定对方听你是“清晰干净”还是“回声噪声一片”。
为什么这是硬骨头
APM 之所以有 521 个文件、是硬核中的硬核:
- 实时 —— 每一帧(10ms)都要处理完,不能延迟。
- 要“猜” —— 回声消除要估计“扬声器到麦克风的声学路径”(房间大小、音量、距离都影响),这个路径看不见、还时刻在变(你动一下手机就变了)。
- 要平衡 —— 降噪去多了,人声也被削(变“电音”);增益调猛了,噪声也被放大。每个环节都是保留有用信号 vs 去除干扰的精细权衡。
这些让 APM 成为 WebRTC 里算法密度最高的部分之一。
小结与下一章
APM 是发送侧的音频净化流水线,把麦克风的脏音洗成干净人声。两个入口:ProcessStream 处理近端(你的麦克风)、ProcessReverseStream 喂入远端参考(对方的声音,给回声消除当参照——回声消除必须同时知道“播了什么”和“采了什么”)。处理链:HPF → AEC3 回声消除 → NS 降噪 → AGC 增益 → VAD 检测,每环独立可配。它实时、要“猜”看不见的声学路径、要精细权衡,是算法硬骨头。
链条里最难、最见功力的是回声消除。下一章先讲清“回声”这个问题本身。👉 回声问题。
参考资料
- [1] libwebrtc 源码.
modules/audio_processing/include/audio_processing.h(ProcessStream/ProcessReverseStream)。 - [2] libwebrtc 源码.
modules/audio_processing/audio_processing_impl.cc(处理链编排)、g3doc/。 - [3]
modules/audio_processing/(HPF/AEC/NS/AGC/VAD 各子模块)。