降噪和回声消除,该放在 ASR 前面还是交给模型

2026-08-24

很多人默认”降噪总没坏处”,觉得音频听着干净了识别自然更准。这个直觉是错的。 前处理里有两件事常被打包成一句”做个降噪”,性质却完全不同:回声消除(AEC)的位置是硬约束,挪不得;而降噪是不是有用只能实测,做过头反而让识别变差。

这一篇属于语音识别四个环节的第一环。前处理的其他工作(重采样、单声道化、位深)对错清楚,唯独降噪最容易好心办坏事。

AEC 的位置为什么没得商量

回声消除针对的场景是:设备扬声器正在放声音(提示音、对方语音、音乐),麦克风又把它们收了回去。不处理,识别器就会把设备自己发的声音当成用户在说话。

对消的本质,是拿已知的播放信号去减。 AEC 需要两路输入:麦克风采到的信号,以及参考信号——设备此刻正在播放的那一路音频。有了它,算法才能估计出”播放的声音经过扬声器和房间到达麦克风之后变成了什么样”,再从麦克风信号里减掉这一份。

由此推出两条硬约束:

  • 必须在能拿到参考信号的地方做。 参考信号只存在于设备本地的音频栈里。音频一旦编码上传,服务端拿到的只有麦克风那一路混合信号,无从对消。AEC 是端上的事。
  • 必须放在最前面。 任何在它之前对麦克风信号做的非线性处理(激进降噪、增益压缩、有损编码),都会破坏两路信号的对应关系,让对消失效。

一个判断方法:设备会一边放声音一边收音(语音助手、会议终端、车机、任何支持打断的对话系统),AEC 就是必需品且必须做在采集侧;设备只收不放(纯录音转写、上传的音频文件),根本不存在回声。

降噪为什么不一定是净收益

降噪的逻辑和 AEC 完全不同——它没有参考信号,只能靠统计规律和模型去猜”哪部分是噪声”,再把那部分削掉。既然是猜,就会猜错。

削错的代价是什么?语音的可辨识性大量依赖谐波结构——浊音由基频和一串整数倍的谐波构成,元音的辨识靠共振峰形成的频谱包络。降噪在频域按”这个频点像不像噪声”做衰减时,很容易连带削掉高频谐波,让包络变形。人耳听着”干净多了”,送进识别器的特征却已经失真。

另一边,现代识别模型大多在带噪数据上训练过,本身有一定鲁棒性。模型见过的噪声它自己能应付;而降噪处理后产生的那种失真音频,反倒可能是训练时没见过的分布。

所以真实情况是一个三选一,而不是”降了总比不降好”:

情况结果
噪声类型模型没见过,降噪削得又准净收益,值得上
噪声在模型鲁棒范围内,降噪引入失真净损失,不如不做
两边都有一点打平,白花算力

哪种情况成立,取决于两个没法凭空推断的东西:你实际遇到的噪声类型,以及你所用模型的训练数据分布——后者你多半不知道细节。所以结论只能是一句朴素的话:先测再降。

先把”噪声”分成四类

笼统说”环境吵”没有可操作性。按处理路径分,至少要拆成四类:

类型例子特点该用的手段
稳态噪声空调、风扇、机箱、路噪频谱长期稳定,可估计传统降噪最擅长,收益相对确定
非稳态噪声键盘、关门、翻纸突发、短促、频谱多变难估计,容易误伤语音;配合 VAD 的最短语音时长过滤更有效
串音(背景人声)旁边工位说话、电视里的人声它本身就是语音降噪基本无效,见下文
混响远场、空旷会议室语音自身的延时叠加需要去混响,与降噪不是一回事

背景人声是四类里最难的。 降噪模型的训练目标是”保留语音、抑制非语音”,而背景人声落在”语音”这一侧——模型没有任何依据判断哪个人才是目标说话人。硬上降噪的结果通常是两个人都保留,或者随机削掉一部分。

这类场景该换工具:把混在一起的多路声音拆开是语音分离,搞清楚”谁在什么时候说话”是说话人分离(diarization),两者与声纹识别的区别见说话人分离和声纹识别的区别

判断表:按场景决定要不要降噪

场景AEC降噪说明
语音助手 / 智能音箱(会外放)必须,端侧谨慎,轻档要支持打断,AEC 是刚需
会议终端(多人 + 外放)必须,端侧谨慎串音靠 diarization 而非降噪
车机必须,端侧建议开路噪是典型稳态噪声
手机 App 单人录音(不外放)不需要先测多数情况模型自己能扛
上传的历史音频文件做不了先测参考信号早已丢失
客服电话录音(8 kHz)通常线路侧已做谨慎窄带信息本就少,再削更亏
安静环境的近场口述不需要不要做没噪声可降,只会引入失真

一条保守起手式:AEC 按场景决定,降噪一律默认关,测出正收益再开。

先测再降:验证步骤清单

判断降噪是否有用,唯一可信的办法是拿数据说话。听感不算依据——人耳舒服和模型识别得准是两个目标。

  1. 准备一批真实音频。 从线上采集,别用公开数据集,也别在会议室模拟。做法见怎么建一个自己的 ASR 测试集
  2. 打噪声标签。 每条标上属于上面四类里的哪一类(可多选)。这一步决定后面能不能分维度看,别省。
  3. 跑两版。 同一批音频、同一模型、同一套后处理,只留降噪这一个变量:一版原始,一版降噪后。
  4. 确认两版格式一致。 降噪工具有时会顺手改采样率、位深或声道数,那样你测的就不只是降噪了。格式要求见送进 ASR 的音频该是什么格式
  5. 分维度出结果。 按噪声类型分组比,别只看总平均。常见结局是稳态组明显变好、安静组和串音组明显变坏,平均下来看着”差不多”——这时正确的动作是按噪声类型条件性开降噪,而不是一刀切。
  6. 单独看退化的样本。 把变差的那些逐条听,看是削掉了首尾字还是整句变形——这决定你该调轻档位还是整个关掉。
  7. 别只看平均值。 少数样本的崩溃会被平均稀释,这也是准确率被高估的常见来源。

工具链的组织方式也印证了这条边界:sherpa-onnx 的能力清单里,除语音识别与合成外还并列着语音增强、声源分离、说话人分离、VAD——这类前处理能力通常与识别分开提供。既然是可插拔的可选项,就该用测量决定用不用。

AGC 的坑

AGC(自动增益控制)常和降噪打包在同一个前处理模块里,问题更隐蔽:在静音段,AGC 会因为”信号太小”而拼命拉高增益,把底噪放大到语音的量级。

后果是 VAD 被骗——放大后的底噪看起来像有人说话,大段静音被判成语音段送进识别器,产出一堆无中生有的文字,在能量阈值型 VAD 上尤其明显(见 VAD 是什么)。

两条建议:给 AGC 设增益上限;排查”莫名多出一段转写”时,先看 AGC,再怀疑 VAD

常见问题

问:AEC 能不能放到服务端做?

不能。参考信号只存在于设备本地的音频栈里,不会跟着麦克风音频一起上传,服务端拿到的是已经混在一起的结果,没有已知量可以去减。这是原理性限制,换算法也解决不了。

问:那用降噪把回声当噪声去掉行不行?

不行。回声在频谱上就是语音——它是设备播放出来的人声或提示音,降噪模型分不清哪段是用户说的、哪段是设备放的。这也是 AEC 和降噪必须是两个模块的原因。

问:降噪档位调轻一点,是不是就能两头兼顾?

轻档确实比激进档安全,但”轻到什么程度”仍然只能测出来。更稳的做法是按噪声类型条件开启:稳态噪声的场景开,安静和串音的场景关。

问:远场混响也算噪声吗?降噪能处理吗?

混响是语音自身经多路径反射后的延时叠加,不是外来噪声源,针对加性噪声设计的降噪对它基本无能为力,需要的是去混响。工程上更划算的常是先改物理条件——麦克风离说话人近些。

相关阅读


本文讲的是语音前处理的通用原理,不绑定某一个具体实现。 各家系统的降噪、AEC、AGC 模块行为差异很大,请以你所用系统的官方文档为准。 我们没有对文中方案做过性能实测,因此不给准确率、增益、阈值一类的数字——文中所有取舍都建议你用自己的数据测出来。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。