降噪和回声消除,该放在 ASR 前面还是交给模型
很多人默认”降噪总没坏处”,觉得音频听着干净了识别自然更准。这个直觉是错的。 前处理里有两件事常被打包成一句”做个降噪”,性质却完全不同:回声消除(AEC)的位置是硬约束,挪不得;而降噪是不是有用只能实测,做过头反而让识别变差。
这一篇属于语音识别四个环节的第一环。前处理的其他工作(重采样、单声道化、位深)对错清楚,唯独降噪最容易好心办坏事。
AEC 的位置为什么没得商量
回声消除针对的场景是:设备扬声器正在放声音(提示音、对方语音、音乐),麦克风又把它们收了回去。不处理,识别器就会把设备自己发的声音当成用户在说话。
对消的本质,是拿已知的播放信号去减。 AEC 需要两路输入:麦克风采到的信号,以及参考信号——设备此刻正在播放的那一路音频。有了它,算法才能估计出”播放的声音经过扬声器和房间到达麦克风之后变成了什么样”,再从麦克风信号里减掉这一份。
由此推出两条硬约束:
- 必须在能拿到参考信号的地方做。 参考信号只存在于设备本地的音频栈里。音频一旦编码上传,服务端拿到的只有麦克风那一路混合信号,无从对消。AEC 是端上的事。
- 必须放在最前面。 任何在它之前对麦克风信号做的非线性处理(激进降噪、增益压缩、有损编码),都会破坏两路信号的对应关系,让对消失效。
一个判断方法:设备会一边放声音一边收音(语音助手、会议终端、车机、任何支持打断的对话系统),AEC 就是必需品且必须做在采集侧;设备只收不放(纯录音转写、上传的音频文件),根本不存在回声。
降噪为什么不一定是净收益
降噪的逻辑和 AEC 完全不同——它没有参考信号,只能靠统计规律和模型去猜”哪部分是噪声”,再把那部分削掉。既然是猜,就会猜错。
削错的代价是什么?语音的可辨识性大量依赖谐波结构——浊音由基频和一串整数倍的谐波构成,元音的辨识靠共振峰形成的频谱包络。降噪在频域按”这个频点像不像噪声”做衰减时,很容易连带削掉高频谐波,让包络变形。人耳听着”干净多了”,送进识别器的特征却已经失真。
另一边,现代识别模型大多在带噪数据上训练过,本身有一定鲁棒性。模型见过的噪声它自己能应付;而降噪处理后产生的那种失真音频,反倒可能是训练时没见过的分布。
所以真实情况是一个三选一,而不是”降了总比不降好”:
| 情况 | 结果 |
|---|---|
| 噪声类型模型没见过,降噪削得又准 | 净收益,值得上 |
| 噪声在模型鲁棒范围内,降噪引入失真 | 净损失,不如不做 |
| 两边都有一点 | 打平,白花算力 |
哪种情况成立,取决于两个没法凭空推断的东西:你实际遇到的噪声类型,以及你所用模型的训练数据分布——后者你多半不知道细节。所以结论只能是一句朴素的话:先测再降。
先把”噪声”分成四类
笼统说”环境吵”没有可操作性。按处理路径分,至少要拆成四类:
| 类型 | 例子 | 特点 | 该用的手段 |
|---|---|---|---|
| 稳态噪声 | 空调、风扇、机箱、路噪 | 频谱长期稳定,可估计 | 传统降噪最擅长,收益相对确定 |
| 非稳态噪声 | 键盘、关门、翻纸 | 突发、短促、频谱多变 | 难估计,容易误伤语音;配合 VAD 的最短语音时长过滤更有效 |
| 串音(背景人声) | 旁边工位说话、电视里的人声 | 它本身就是语音 | 降噪基本无效,见下文 |
| 混响 | 远场、空旷会议室 | 语音自身的延时叠加 | 需要去混响,与降噪不是一回事 |
背景人声是四类里最难的。 降噪模型的训练目标是”保留语音、抑制非语音”,而背景人声落在”语音”这一侧——模型没有任何依据判断哪个人才是目标说话人。硬上降噪的结果通常是两个人都保留,或者随机削掉一部分。
这类场景该换工具:把混在一起的多路声音拆开是语音分离,搞清楚”谁在什么时候说话”是说话人分离(diarization),两者与声纹识别的区别见说话人分离和声纹识别的区别。
判断表:按场景决定要不要降噪
| 场景 | AEC | 降噪 | 说明 |
|---|---|---|---|
| 语音助手 / 智能音箱(会外放) | 必须,端侧 | 谨慎,轻档 | 要支持打断,AEC 是刚需 |
| 会议终端(多人 + 外放) | 必须,端侧 | 谨慎 | 串音靠 diarization 而非降噪 |
| 车机 | 必须,端侧 | 建议开 | 路噪是典型稳态噪声 |
| 手机 App 单人录音(不外放) | 不需要 | 先测 | 多数情况模型自己能扛 |
| 上传的历史音频文件 | 做不了 | 先测 | 参考信号早已丢失 |
| 客服电话录音(8 kHz) | 通常线路侧已做 | 谨慎 | 窄带信息本就少,再削更亏 |
| 安静环境的近场口述 | 不需要 | 不要做 | 没噪声可降,只会引入失真 |
一条保守起手式:AEC 按场景决定,降噪一律默认关,测出正收益再开。
先测再降:验证步骤清单
判断降噪是否有用,唯一可信的办法是拿数据说话。听感不算依据——人耳舒服和模型识别得准是两个目标。
- 准备一批真实音频。 从线上采集,别用公开数据集,也别在会议室模拟。做法见怎么建一个自己的 ASR 测试集。
- 打噪声标签。 每条标上属于上面四类里的哪一类(可多选)。这一步决定后面能不能分维度看,别省。
- 跑两版。 同一批音频、同一模型、同一套后处理,只留降噪这一个变量:一版原始,一版降噪后。
- 确认两版格式一致。 降噪工具有时会顺手改采样率、位深或声道数,那样你测的就不只是降噪了。格式要求见送进 ASR 的音频该是什么格式。
- 分维度出结果。 按噪声类型分组比,别只看总平均。常见结局是稳态组明显变好、安静组和串音组明显变坏,平均下来看着”差不多”——这时正确的动作是按噪声类型条件性开降噪,而不是一刀切。
- 单独看退化的样本。 把变差的那些逐条听,看是削掉了首尾字还是整句变形——这决定你该调轻档位还是整个关掉。
- 别只看平均值。 少数样本的崩溃会被平均稀释,这也是准确率被高估的常见来源。
工具链的组织方式也印证了这条边界:sherpa-onnx 的能力清单里,除语音识别与合成外还并列着语音增强、声源分离、说话人分离、VAD——这类前处理能力通常与识别分开提供。既然是可插拔的可选项,就该用测量决定用不用。
AGC 的坑
AGC(自动增益控制)常和降噪打包在同一个前处理模块里,问题更隐蔽:在静音段,AGC 会因为”信号太小”而拼命拉高增益,把底噪放大到语音的量级。
后果是 VAD 被骗——放大后的底噪看起来像有人说话,大段静音被判成语音段送进识别器,产出一堆无中生有的文字,在能量阈值型 VAD 上尤其明显(见 VAD 是什么)。
两条建议:给 AGC 设增益上限;排查”莫名多出一段转写”时,先看 AGC,再怀疑 VAD。
常见问题
问:AEC 能不能放到服务端做?
不能。参考信号只存在于设备本地的音频栈里,不会跟着麦克风音频一起上传,服务端拿到的是已经混在一起的结果,没有已知量可以去减。这是原理性限制,换算法也解决不了。
问:那用降噪把回声当噪声去掉行不行?
不行。回声在频谱上就是语音——它是设备播放出来的人声或提示音,降噪模型分不清哪段是用户说的、哪段是设备放的。这也是 AEC 和降噪必须是两个模块的原因。
问:降噪档位调轻一点,是不是就能两头兼顾?
轻档确实比激进档安全,但”轻到什么程度”仍然只能测出来。更稳的做法是按噪声类型条件开启:稳态噪声的场景开,安静和串音的场景关。
问:远场混响也算噪声吗?降噪能处理吗?
混响是语音自身经多路径反射后的延时叠加,不是外来噪声源,针对加性噪声设计的降噪对它基本无能为力,需要的是去混响。工程上更划算的常是先改物理条件——麦克风离说话人近些。
相关阅读
本文讲的是语音前处理的通用原理,不绑定某一个具体实现。 各家系统的降噪、AEC、AGC 模块行为差异很大,请以你所用系统的官方文档为准。 我们没有对文中方案做过性能实测,因此不给准确率、增益、阈值一类的数字——文中所有取舍都建议你用自己的数据测出来。