先看现象。把客服系统的 Opus 录音用 ffmpeg 批量转成 16k 单声道 wav 再送转写,错字率比直接传原始文件高了一截,尤其是爆破音和数字,怀疑重采样用了默认的低质量滤波器。

排查方向其实有限,先把可能性排一排。采样率一次性降太多,抗混叠滤波不充分。另一种情况是Opus 解码后的声道布局没处理就直接下混。

还有一种情况,音量不一致,弱音段被噪声门切掉。

另外,转写模型按 8k 电话音频训练,16k 反而失配。

动手时先看原文件的编码参数与采样率

ffprobe -v error -show_entries stream=codec_name,sample_rate,channels -of csv=p=0 call.opus

随后用高质量重采样参数转成 16k 单声道

ffmpeg -i call.opus -af "aresample=resampler=soxr:precision=28" -ac 1 -ar 16000 -c:a pcm_s16le call.wav

然后对比两种参数下的识别错字率

python score_asr.py --ref ref.txt --hyp hyp_soxr.txt --cer

批量转码前统一做响度归一

ffmpeg -i call.opus -af loudnorm=I=-16:TP=-1.5 -ac 1 -ar 16000 out.wav

怎么算真的好了,看的是同一批现象。改用 soxr 重采样后错字率从百分之十四降到百分之七,数字段错误明显减少,批量处理耗时可接受。

补一句。转码参数会直接影响识别质量,8k 与 16k 之间别用默认滤波器,重采样质量比文件大小更值得计较。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189