APM 音频处理总览 · 让你的声音干净

麦克风采的音里混着回声、噪声、忽大忽小的音量——APM(音频处理模块)是一条净化流水线,依次做回声消除、降噪、增益、检测。这一章读 audio_processing.h:ProcessStream 处理近端、ProcessReverseStream 喂入远端参考,以及处理链的各个环节。

作者 David更新于 第 71 篇(共 112 篇)

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 各子模块)。

本页目录