客服录音来自三个地区,同一批 2000 条里最响与最轻的相差 12dB,直接送转写后有 30% 的轻声录音识别率明显偏低,重跑一次成本翻倍。
一开始怀疑是「采样率与声道未统一,前端处理效果打折」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。录音增益不一致,轻声片段信噪比过低。还有一种是部分文件峰值削波,归一后失真更严重。
另外,归一参数按整批算,忽略了单条差异。
上来先统计每条音频的响度分布
ffmpeg -i call.wav -af loudnorm=print_format=json -f null - 2>&1 | Select-String input_i
随后按 EBU R128 统一到 -16 LUFS
ffmpeg -i call.wav -af loudnorm=I=-16:TP=-1.5:LRA=11 -ar 16000 -ac 1 -c:a pcm_s16le norm.wav
批量处理并保留原始文件
for f in raw/*.wav; do ffmpeg -y -i "$f" -af loudnorm=I=-16:TP=-1.5:LRA=11 -ar 16000 -ac 1 "norm/$(basename $f)"; done
末了对比归一前后的转写准确率
python asr_eval.py --dir norm/ --label label.csv --metric cer
改完先别撤,确认这几项。归一后轻声录音的字符错误率从 34% 降到 12%,整体批次的转写重跑率降到 4%,削波文件的失真没有加重。
提醒一点。响度归一是转写前最划算的一步,但要限峰值避免削波,批量处理必须保留原文件以便回溯。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
