2、噪声抑制的评估指标:信噪比、分段信噪比、PESQ、STOI 等客观指标详解
做噪声抑制,最怕什么?
怕你辛辛苦苦调了一周的参数,听起来好像不错,但一换场景就翻车。
更怕你拿着算法去汇报,老板问「效果到底怎么样」,你只能回一句「我觉得还行」。
嗯,这不行。我们需要一把尺子,一把能客观衡量噪声抑制效果的尺子。今天我们就来聊聊这些尺子——信噪比、分段信噪比、PESQ、STOI,还有几个我常用的辅助指标。
核心观点:没有完美的单一指标。信噪比看能量,PESQ 看听觉质量,STOI 看可懂度。实战中,我习惯至少用三个指标联合评估,才能避免「指标好看、听感翻车」的尴尬。
2.1 信噪比(SNR)—— 最基础的尺子
信噪比,说白了就是信号能量和噪声能量的比值。公式很简单:
SNR(dB) = 10 * log10( P_signal / P_noise )
其中 P_signal 是纯净语音的能量,P_noise 是噪声的能量。
这个指标我刚开始做语音增强时用得最多。为什么?因为它直观。你降噪前 SNR 是 5 dB,降噪后变成 12 dB,看起来提升了 7 dB,好像不错?
注意:SNR 有个大坑——它对静音段非常敏感。如果一段语音里有一半时间是静音,那静音段的噪声能量会被平均进去,导致 SNR 偏低。而你的降噪算法可能只是把静音段压得很安静,语音段其实没怎么动,但整体 SNR 却「虚高」了。
我曾经在一个项目里吃过这个亏。当时用全带 SNR 评估,指标涨了 6 个 dB,兴冲冲拿去给客户听。结果客户说「背景噪声是小了,但人声怎么变闷了?」——嗯,后来才发现是静音段压得太狠,把语音段的低频也削了。
所以,SNR 可以用,但别只看它。尤其要注意:
- 计算前最好做 VAD(语音活动检测),只算语音段的 SNR
- 或者,直接用分段信噪比
2.2 分段信噪比(segSNR)—— 更精细的尺子
segSNR 和 SNR 的区别在哪?
SNR 是对整段信号算一个比值。segSNR 是把信号切成很多小段(通常是 15-30 毫秒一帧),每帧算一个 SNR,然后取平均。
segSNR = (1/N) * Σ 10 * log10( P_signal_frame / P_noise_frame )
这样做的好处很明显:它能反映出噪声抑制在时间上的均匀性。如果你的算法在某些帧处理得很好,某些帧处理得很差,segSNR 会如实反映出来,而 SNR 可能会被「平均掉」。
我的习惯:segSNR 是我做算法调优时最常用的指标。每次改一个参数,我都会跑一遍 segSNR,看看是不是所有帧都受益了。如果只有部分帧提升,其他帧反而下降,那这个参数调整可能有问题。
不过 segSNR 也有局限。它假设噪声是加性的,而且每帧独立。对于非平稳噪声(比如街道上的车流声、餐厅里的碗筷声),segSNR 的表现就不太稳定。
2.3 PESQ —— 让机器模拟人耳
PESQ(Perceptual Evaluation of Speech Quality)是 ITU-T P.862 标准定义的指标。它不是为了测「能量大小」,而是为了测「听起来怎么样」。
PESQ 的原理比较复杂,简单说就是:
- 把原始语音和处理后的语音都做听觉变换(模拟人耳的频率分辨率和响度感知)
- 比较两者的差异,包括时延、失真、噪声残留等
- 输出一个 -0.5 到 4.5 的分数,分数越高越好
我记得第一次用 PESQ 时,发现它和主观听感的相关性确实比 SNR 高很多。比如一个算法 SNR 提升了 5 dB,但 PESQ 只涨了 0.1,那大概率是算法引入了新的失真。
| PESQ 分数范围 | 主观感受 | 典型场景 |
|---|---|---|
| 4.0 - 4.5 | 几乎无失真,非常清晰 | 高质量通信、录音棚 |
| 3.0 - 4.0 | 轻微失真,可接受 | VoIP、视频会议 |
| 2.0 - 3.0 | 明显失真,影响理解 | 强噪声环境、低码率编码 |
| < 2.0 | 严重失真,难以听懂 | 极端噪声、算法失效 |
注意:PESQ 对时延敏感。如果你的算法引入了固定延迟(比如 20 ms),PESQ 会自动对齐。但如果延迟是时变的,PESQ 可能会误判。另外,PESQ 主要针对窄带(8 kHz)和宽带(16 kHz)信号,超宽带(48 kHz)需要用 POLQA。
2.4 STOI —— 可懂度的守护者
STOI(Short-Time Objective Intelligibility)是专门用来衡量「能不能听懂」的指标。它不关心音质好不好,只关心语音的包络信息是否被保留。
STOI 的计算思路:
- 把信号分成 400 ms 左右的短时帧
- 提取每帧的时频包络
- 计算原始语音和处理后语音的包络相关系数
- 输出 0 到 1 的值,0.6 以下基本听不懂,0.9 以上接近完美
我为什么喜欢 STOI?因为它诚实。有些算法为了降噪,把语音的细节也抹掉了,PESQ 可能还过得去(因为整体失真不大),但 STOI 会直接掉下来。说白了,STOI 是「可懂度」的最后一道防线。
实战建议:在评估降噪算法时,我通常用这个组合:
- segSNR 看能量提升是否均匀
- PESQ 看听觉质量是否可接受
- STOI 看可懂度是否被破坏
三个指标一起看,基本能覆盖 90% 的评估场景。
2.5 其他辅助指标
除了上面四个,还有几个我偶尔会用到的指标:
| 指标 | 全称 | 用途 | 我的评价 |
|---|---|---|---|
| CSIG | Signal Distortion | 信号失真程度 | 适合分析算法是否过度处理 |
| CBAK | Background Noise | 背景噪声残留 | 和 segSNR 互补,但更偏感知 |
| COVL | Overall Quality | 综合质量 | 和 PESQ 类似,但计算更快 |
| fwSNRseg | Frequency-weighted segSNR | 频率加权的分段信噪比 | 对低频更敏感,适合宽带信号 |
一个小技巧:如果你在做实时通信场景的降噪,建议重点关注 STOI 和 PESQ。因为用户最直接的感受是「听不听得清」和「听着累不累」。segSNR 再高,如果 STOI 掉到 0.7 以下,用户大概率会抱怨。
2.6 实战中的评估流程
最后,分享一下我现在做噪声抑制评估的流程:
- 准备测试集:至少 20 条语音,覆盖安静、嘈杂、极噪三种场景
- 跑指标:同时计算 segSNR、PESQ、STOI
- 看分布:不要只看平均值,要看每条语音的指标分布。如果某条语音的 STOI 特别低,要单独分析
- 主观验证:挑 3-5 条指标差异大的语音,自己听一遍
我曾经踩过一个坑:某个算法在测试集上 segSNR 提升了 8 dB,PESQ 涨了 0.5,STOI 也稳定在 0.85 以上。结果一上真实场景,用户反馈「声音像在水里说话」。后来才发现,测试集的噪声类型太单一,算法对非平稳噪声的鲁棒性很差。
所以,评估指标是工具,不是目的。工具再好,也要结合场景和听感来判断。