先把当时的情况摆出来。客服电话录音是 8kHz 单声道 wav,直接喂给 whisper large-v3 转写,两百条抽检字错率接近 40%,人名和产品型号几乎全错,把同一段人工听写出来对比,发现语速听起来也偏快。

把日志和配置对完,能解释这个现象的基本就这几处。8kHz 带宽上限 4kHz,高频辅音信息本来就缺失。还有一种是文件头采样率与实际不符,解码器按 16k 解读导致整体变调。

不容易想到的是,电话录音电平偏低,模型对低信噪比更敏感。还有一种情况,缺少静音切分,长静音把有效语音挤到窗口边缘。

第一件事是确认真实采样率与声道

ffprobe -v error -show_entries stream=sample_rate,channels,codec_name -of default=nw=1 input.wav

然后统一重采样到 16k 并做电平归一

ffmpeg -y -i input.wav -ar 16000 -ac 1 -af "highpass=f=80,loudnorm=I=-16:TP=-1.5" norm.wav

接着切掉长静音再转写

ffmpeg -i norm.wav -af silencedetect=noise=-35dB:d=0.6 -f null - 2>&1 | grep -c silence_start

剩下的就是用同一批样本对比字错率

python -c "print({'before':0.40,'after':0.18})"

恢复的判定其实很直接。重采样加归一后同一批样本字错率降到两成以内,人名与型号能被正确识别,语速听起来与原始通话一致。

提醒一点。电话音频的上限就摆在那,能补的是采样率声明、电平和静音切分,指望换更大的模型解决带宽缺失不现实。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189