先把当时的情况摆出来。电话客服录音先过 RNNoise 降噪再送 Whisper,背景噪声没了,但识别率从 92% 掉到 78%,人名和订单号错得最多;原始音频直接转反而更好,录音是 8k 采样。
这类报错背后常见的原因有几处,逐个排除就行。降噪把 8k 语音的高频共振峰削掉。另一种情况是RNNoise 按 48k 训练,8k 输入重采样后失真。
另外,降噪后音量下降 12dB,VAD 把语音判成静音。少数情况下是降噪模型把弱辅音当成噪声一起滤掉。
动手时先对比降噪前后的响度
ffmpeg -i raw.wav -af volumedetect -f null - 2>&1 | grep mean_volume
接着把 8k 音频升到 48k 再降噪后降回
ffmpeg -i raw.wav -ar 48000 -af arnndn=m=rnnoise.model -ar 8000 clean.wav
两条音轨分别跑一遍转写并统计字错率
python asr_eval.py --ref ref.txt --hyp raw.txt --name raw
末了对降噪结果做一次 loudnorm 再复测
ffmpeg -i clean.wav -af loudnorm=I=-16:TP=-1.5 -ar 8000 clean_norm.wav
恢复的判定其实很直接。降噪后的字错率回到 8% 以内,人名与订单号的错误明显减少,响度与原始音频相差不超过 2dB。
这里还有个坑。降噪不是预处理越多越好,窄带语音的高频本来就少,模型很容易把辅音当噪声;先量响度和采样率,再决定要不要降噪。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
