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

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

- 作者：David（道雾轩）
- 专栏：音视频与 WebRTC 详解（https://daiw.org/manual/webrtc.md）
- 最后更新：2026-07-14
- 原文：https://daiw.org/manual/webrtc/apm-overview
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

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

发送侧，麦克风采到的原始音频**很脏**：混着扬声器传回的[回声](https://daiw.org/manual/webrtc/aec3-echo-problem)、环境噪声、忽大忽小的音量。直接发出去，对方听着难受。**APM（Audio Processing Module，`modules/audio_processing/`）** 是一条**净化流水线**，把脏音频洗干净再编码。它是[521 个文件的大模块](https://daiw.org/manual/webrtc)、WebRTC 音频的另一座高峰。这一章总览。

## 两个入口：近端与远端

APM 的接口（`modules/audio_processing/include/audio_processing.h`）有两个关键方法，理解它们是理解 APM 的钥匙：

<Callout type="info">
  **`ProcessStream` 处理“近端”（你的麦克风采集），`ProcessReverseStream` 喂入“远端”（对方的声音，即将从你的扬声器播出）——后者是[回声消除](https://daiw.org/manual/webrtc/aec3-internals)必需的参考。**

  - **`ProcessStream`（近端 / capture）** —— 处理**你麦克风采的音频**。这是要净化、要发出去的主线：[消回声、降噪、调增益](https://daiw.org/manual/webrtc/apm-overview)都在这条流上。
  - **`ProcessReverseStream`（远端 / render）** —— 喂入**对方的声音**（你即将播放的那段）。它**不是**要发出去的，而是给[回声消除](https://daiw.org/manual/webrtc/aec3-internals)当**参考**：APM 得知道“扬声器正在播什么”，才能从麦克风采的音里**识别并减掉**那部分（那就是[回声](https://daiw.org/manual/webrtc/aec3-echo-problem)）。

  这就是回声消除的**根本前提**：你必须**同时**知道“扬声器播了什么”（远端参考）和“麦克风采了什么”（近端），两相对照，才能算出“麦克风采的音里，哪部分是扬声器漏回来的回声”。所以 APM 必须两条流都喂——单有麦克风的音，消不了回声。[下一章](https://daiw.org/manual/webrtc/aec3-echo-problem)细说这个问题。
</Callout>

## 处理链：一道道工序

近端音频（[`ProcessStream`](https://daiw.org/manual/webrtc/apm-overview)）经过一条**流水线**，每个环节洗掉一种“脏”：

| 环节 | 洗掉什么 | 本教程 |
| --- | --- | --- |
| **高通滤波（HPF）** | 低频噪声（空调嗡嗡、风声） | 本章 |
| **回声消除（AEC3）** | 扬声器传回麦克风的[回声](https://daiw.org/manual/webrtc/aec3-echo-problem) | [AEC3 章](https://daiw.org/manual/webrtc/aec3-internals) |
| **降噪（NS）** | 稳态背景噪声（风扇、白噪） | [NS 章](https://daiw.org/manual/webrtc/ns-vad) |
| **自动增益（AGC）** | 音量忽大忽小（离麦远近） | [AGC 章](https://daiw.org/manual/webrtc/agc) |
| **语音活动检测（VAD）** | （不洗，而是判断）有没有人在说话 | [VAD 章](https://daiw.org/manual/webrtc/ns-vad) |

<Callout type="info">
  **APM 是“一道道工序”的流水线，顺序有讲究。** 比如[回声消除](https://daiw.org/manual/webrtc/aec3-internals)通常在[降噪](https://daiw.org/manual/webrtc/ns-vad)之前（先去掉最“结构化”的回声，再处理弥散的噪声）；[高通滤波](https://daiw.org/manual/webrtc/apm-overview)在最前（先砍掉没用的低频）。每个环节都是一个可独立开关、独立调参的子模块（[可在 config 里配置](https://daiw.org/manual/webrtc/factory-and-context)）。这条链把“一堆音频信号处理算法”组织成一个清晰的管线——**输入脏音频，输出干净人声**。这些算法（尤其[AEC3](https://daiw.org/manual/webrtc/aec3-internals)）是几十年音频信号处理的结晶，也是 WebRTC 音质好的关键：同样的麦克风、同样的网络，APM 的好坏直接决定对方听你是“清晰干净”还是“回声噪声一片”。
</Callout>

## 为什么这是硬骨头

APM 之所以[有 521 个文件](https://daiw.org/manual/webrtc)、是硬核中的硬核：

- **实时** —— 每一帧（[10ms](https://daiw.org/manual/webrtc/neteq-overview)）都要处理完，不能延迟。
- **要“猜”** —— [回声消除](https://daiw.org/manual/webrtc/aec3-internals)要估计“扬声器到麦克风的声学路径”（房间大小、音量、距离都影响），这个路径**看不见、还时刻在变**（[你动一下手机就变了](https://daiw.org/manual/webrtc/aec3-internals)）。
- **要平衡** —— [降噪](https://daiw.org/manual/webrtc/ns-vad)去多了，人声也被削（变“电音”）；[增益](https://daiw.org/manual/webrtc/agc)调猛了，噪声也被放大。每个环节都是**保留有用信号 vs 去除干扰**的精细权衡。

这些让 APM 成为 WebRTC 里算法密度最高的部分之一。

## 小结与下一章

**APM** 是发送侧的音频**净化流水线**，把麦克风的脏音洗成干净人声。两个入口：**`ProcessStream`** 处理近端（你的麦克风）、**`ProcessReverseStream`** 喂入远端参考（对方的声音，给[回声消除](https://daiw.org/manual/webrtc/aec3-internals)当参照——**回声消除必须同时知道“播了什么”和“采了什么”**）。处理链：**[HPF](https://daiw.org/manual/webrtc/apm-overview) → [AEC3 回声消除](https://daiw.org/manual/webrtc/aec3-internals) → [NS 降噪](https://daiw.org/manual/webrtc/ns-vad) → [AGC 增益](https://daiw.org/manual/webrtc/agc) → [VAD 检测](https://daiw.org/manual/webrtc/ns-vad)**，每环独立可配。它实时、要“猜”看不见的声学路径、要精细权衡，是算法硬骨头。

链条里最难、最见功力的是**回声消除**。下一章先讲清“回声”这个问题本身。👉 [回声问题](https://daiw.org/manual/webrtc/aec3-echo-problem)。

## 参考资料

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