Appearance
降噪与前处理
前处理不是简单“把声音变干净”,而是为后面的唤醒、识别和通话创造更稳定的输入。它要在三个目标之间取舍:保留目标人声、压制干扰、控制延迟和失真。
语音设备里常说的 3A 通常指 AEC、ANS/NS、AGC:
| 模块 | 全称 | 解决的问题 | 简化理解 | | --- | --- | --- | | AEC | Acoustic Echo Cancellation | 消除设备自己播放产生的回声 | 把“自己放出来的声音”从麦克风里减掉 | | ANS / NS | Automatic Noise Suppression / Noise Suppression | 抑制环境噪声 | 判断哪些频段更像噪声并压低 | | AGC | Automatic Gain Control | 自动控制语音响度 | 小声拉高,大声压住 |
3A 的顺序很关键。多数语音设备会先做 AEC,再做 ANS,最后做 AGC。原因是:如果先做 AGC,残留回声和噪声也会被一起放大;如果先做 ANS,回声可能被当作环境噪声处理,破坏 AEC 需要的线性关系。
3A 的输入输出
| 阶段 | 输入 | 输出 | 关键依赖 |
|---|---|---|---|
| AEC | 麦克风信号 + 播放参考 | 回声被压低的语音 | 参考完整、延迟稳定、双讲保护 |
| ANS | AEC 后的语音 | 噪声被压低的语音 | 噪声估计、语音保真、场景覆盖 |
| AGC | ANS 后的语音 | 响度稳定的语音 | 目标响度、增益上下限、攻击释放时间 |
3A 的目标不是让波形“看起来漂亮”,而是让后级模型更稳定。对唤醒和 ASR 来说,最重要的是语音特征保留;对通话来说,还要兼顾自然度和听感疲劳。
AEC 回声消除
AEC 解决的是“设备把自己说的话又听进去”。智能音箱播放音乐时唤不醒、会议终端对方听到回声、TTS 播报时 ASR 误识别,通常都要先看 AEC。
原理
扬声器播放的声音会经过喇叭、外壳、桌面、墙面和空气反射后进入麦克风。AEC 拿到播放参考后,尝试学习这条回声路径,生成一个“估计回声”,再从麦克风信号里减掉。
这类算法常用自适应滤波思路。滤波器不是固定的,因为用户移动设备、房间变化、音量变化都会改变回声路径。残留回声越大,滤波器越需要继续更新。
关键输入
| 输入 | 为什么重要 |
|---|---|
| 麦克风信号 | 包含近端人声、噪声和真实回声 |
| 播放参考 | 告诉 AEC 系统刚才到底播放了什么 |
| 延迟关系 | 参考和麦克风必须能对齐,否则估计回声错位 |
| 双讲判断 | 用户说话和系统播放同时存在时,不能把用户声音消掉 |
关键参数和机制
| 项 | 作用 | 调不好会怎样 |
|---|---|---|
| 回声尾长 | 覆盖房间和结构回声持续时间 | 太短会留长尾回声,太长会增加算力和收敛压力 |
| 延迟估计 | 对齐播放参考和麦克风回声 | 错位后抵消失败,甚至引入新的残留 |
| 收敛速度 | 滤波器适应回声路径变化的速度 | 太慢跟不上环境变化,太快可能误学近端人声 |
| 双讲检测 | 判断用户是否正在插话 | 弱则误消人声,强则回声残留增加 |
| 非线性处理 NLP | 压制线性 AEC 后的残留回声 | 过强会让近端语音断续、发闷 |
典型失效
| 现象 | 根因 | 判断方式 |
|---|---|---|
| 播放音乐时唤不醒 | 残留回声压过唤醒词 | 看 AEC 前后唤醒置信度和 ERLE |
| 会议里对方听到回声 | 参考缺失或延迟漂移 | 对齐播放参考和麦克风录音 |
| 用户插话被压掉 | 双讲保护弱 | 播放时近端说话,听近端是否被切碎 |
| 大音量下效果突然变差 | 扬声器或功放非线性失真 | 看波形削顶和 THD+N |
AEC 调试顺序
- 先确认播放参考是否完整,包含音乐、提示音、TTS、系统音效。
- 再确认参考和麦克风信号的延迟是否稳定。
- 单独测试远端单讲,只看回声衰减。
- 测试近端单讲,确认没有误处理人声。
- 测试双讲,确认用户插话不会被消掉。
- 最后测试大音量播放,因为非线性失真通常在大音量下暴露。
ANS / NS 噪声抑制
ANS 解决的是环境噪声。它通常在短时频谱上工作:把音频切成很多小时间片和小频率片,判断每一小块更像语音还是噪声,再决定保留、压低或平滑。
这里的难点不是“把非语音全删掉”,而是“在噪声和语音重叠时尽量保住语音”。语音中的辅音、气声、字头本来就短而弱,过强降噪很容易把这些信息一起压掉。
常见路线
| 路线 | 思路 | 特点 |
|---|---|---|
| 频谱减法 | 估计噪声谱,再从当前频谱中扣掉 | 简单、低算力,容易产生音乐噪声 |
| 维纳滤波 | 根据语音和噪声能量比例计算抑制增益 | 比频谱减法平滑,但依赖估计质量 |
| 统计模型 | 根据噪声平稳性和语音概率动态调整 | 传统通话系统常见 |
| 深度学习降噪 | 模型直接估计语音掩码或干净语音 | 复杂噪声效果更强,但算力和数据要求高 |
噪声类型
| 噪声 | 算法难度 | 原因 |
|---|---|---|
| 风扇、空调、底噪 | 较低 | 频谱稳定,容易估计 |
| 键盘、关门、碗筷声 | 中等 | 时间上突发,容易误伤辅音 |
| 音乐、电视声 | 较高 | 结构复杂,和语音频段重叠 |
| 其他人说话 | 很高 | 与目标语音特征接近 |
| 风噪 | 很高 | 低频强、随机性强,结构防风更重要 |
关键参数
| 参数 | 作用 | 取舍 |
|---|---|---|
| 抑制强度 | 噪声压低多少 | 太弱噪声残留,太强语音失真 |
| 噪声更新速度 | 噪声模型多久适应新环境 | 太慢跟不上,太快会把语音学成噪声 |
| 语音保护 | 对疑似语音区域少处理 | 保护强则噪声残留,保护弱则吞字 |
| 低频处理 | 控制风噪、震动、空调低频 | 过强会让声音变薄 |
| 后平滑 | 减少音乐噪声和闪烁感 | 过强会让语音拖尾 |
过度降噪的副作用
降噪强度越高,不一定识别率越高。过强的 NS 会造成音乐噪声、字头丢失、辅音变弱和语音断续。对 ASR 来说,目标是保留可识别特征;对通话来说,还要兼顾自然度和听感疲劳。
AGC 自动增益
AGC 控制响度,让远处小声和近处大声都落在可用范围。它像自动音量旋钮,但不能替代硬件增益设计。
| 参数 | 作用 | 取舍 |
|---|---|---|
| 目标响度 | 希望语音达到的平均电平 | 太高会放大噪声,太低会影响识别 |
| 攻击时间 | 音量变大时多久压下来 | 太慢会削顶,太快会不自然 |
| 释放时间 | 音量变小时多久拉上去 | 太快会把静音噪声拉高 |
| 最大增益 | 最多能放大多少 | 过大容易把底噪变成明显噪声 |
AGC 为什么容易出问题
AGC 位于 3A 后段,它看到的是 AEC 和 ANS 处理后的结果。如果前面残留了回声或噪声,AGC 可能把这些残留一起放大。很多“降噪后底噪忽大忽小”“安静时噪声被拉起来”“远处说话忽然变闷”的问题,都和 AGC 策略有关。
| 现象 | 常见原因 | 调整方向 |
|---|---|---|
| 静音时底噪被拉高 | AGC 在非语音段继续增益 | 联动 VAD,限制静音增益 |
| 近处大声破音 | 攻击时间太慢或前级已削顶 | 降低前级增益,缩短攻击时间 |
| 远处小声听不清 | 最大增益不足或目标响度太低 | 提高增益上限,但同时检查噪声 |
| 声音忽大忽小 | 攻击/释放时间不平衡 | 放慢释放,避免频繁抽动 |
| ASR 置信度波动 | AGC 改变语音动态太剧烈 | 固定目标响度并减少增益抖动 |
3A 之间的冲突
3A 不是三个互不相关的开关。它们会互相影响。
| 冲突 | 表现 | 处理 |
|---|---|---|
| AEC 残留被 AGC 放大 | 播放时背景里总有系统自己的声音 | 先修 AEC,再调 AGC |
| ANS 过强影响 AEC 双讲 | 用户插话被压碎或断续 | 降低 ANS 强度,确认双讲保护 |
| AGC 把噪声抬高 | 安静处底噪明显 | AGC 联动 VAD,限制非语音增益 |
| AEC NLP 过强像降噪 | 回声少了但人声也被切断 | 降低 NLP 或改善回声路径 |
| ANS 和 AGC 共同造成抽吸感 | 噪声随人声一涨一落 | 放慢 AGC 释放,增加 ANS 平滑 |
3A 调试流程
- 先关掉 ANS 和 AGC,只验证 AEC。
- AEC 稳定后打开 ANS,比较噪声下降和语音失真。
- 最后打开 AGC,观察响度稳定性和底噪是否被抬高。
- 每一步都保留原始麦克风、播放参考、AEC 输出、ANS 输出和 AGC 输出。
- 指标要同时看 ERLE、SNR、语音失真、唤醒率、WER 和主观听感。
3A 之外的增强模块
波束形成
波束形成利用多个麦克风之间的时间差、相位差和能量差,把目标方向的声音增强,把其他方向的声音压低。它不是“凭空变清楚”,而是利用空间信息做取舍。
| 前提 | 出错后果 |
|---|---|
| 阵列几何准确 | 麦克风位置、间距、方向不对,主瓣会指错方向 |
| 多路同步稳定 | 各路采样不同步,时间差和相位差就不可信 |
波束形成通常放在 AEC 后、ANS 前后结合使用。远场阵列设备不能只靠 ANS 硬压噪声,空间增强往往更关键。
VAD 端点检测
VAD 判断“现在是不是有人声”。它影响唤醒、ASR 起止点、录音切片和降噪控制。
VAD 不是只看能量。安静场景里能量阈值有效,但车噪、电视声和多人背景会让能量判断失效。更稳的 VAD 会结合频谱形状、语音周期性、上下文连续性和模型置信度。
| 问题 | 表现 | 调整方向 |
|---|---|---|
| 起点太晚 | 第一个字被吞 | 增加前置缓存,降低起始阈值 |
| 终点太早 | 句尾被截断 | 增加尾部静音,放宽结束判断 |
| 太敏感 | 噪声触发识别 | 增加连续帧确认或提高阈值 |
| 太保守 | 轻声、儿童声漏掉 | 补充低音量和儿童样本 |
模块顺序怎么定
| 场景 | 推荐思路 |
|---|---|
| 有播放的设备 | 先保证 AEC,再做 BF、NS、AGC、VAD |
| 远场阵列设备 | 阵列校准和 BF 很关键,单靠 NS 不够 |
| 通话会议 | AEC 和双讲保护优先,不能只追求降噪强度 |
| 纯近场识别 | 轻量 NS、AGC、VAD 即可,避免过处理 |
| 车载 | 路噪模型、座位方向和 AEC 要一起调 |
验收标准
前处理验收不能只听一段音频。至少要分场景看:
| 指标 | 看什么 |
|---|---|
| ERLE | 回声消除是否有效 |
| 双讲保真 | 播放时用户插话是否被保留 |
| SNR 改善 | 噪声是否被压低 |
| 语音失真 | 字头、辅音、尾音是否被破坏 |
| WER / 唤醒率 | 前处理是否真的帮助后级模型 |
| 延迟 | 帧长和模型是否影响实时交互 |
总结
3A 是语音前处理的主干。AEC 先处理系统回声,ANS 再压环境噪声,AGC 最后控制响度。调试时要按顺序逐个验证,不能把 3A 当成三个独立开关一起拉满。真正稳定的效果来自完整参考、可靠延迟、适度降噪、受控增益和分阶段录音回放。
