把 m4a 转成 wav 送转写,参数写了 -sample_fmt s16 但源是 24bit,输出整体速度快 1.07 倍,转写文本和音频从头就对不上。

一开始怀疑是「用 -c copy 强行换容器,头部参数没更新」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。位深与源不一致导致按错误字节序解析。还有一种是采样率被重采样但没有声明。

不容易想到的是,声道交织方式与播放器预期不同。

先读源文件的真实参数

ffprobe -v error -show_entries stream=codec_name,sample_fmt,sample_rate,channels -of json in.m4a

随后按源参数无损转成 wav

ffmpeg -y -i in.m4a -ac 1 -ar 16000 -c:a pcm_s16le out.wav

再往下比对转换前后的时长与采样点数

ffprobe -v error -show_entries format=duration -of csv=p=0 in.m4a out.wav

等前面都确认过,再重跑转写并抽查首尾句子

python asr.py --file out.wav --language zh --out out.json

恢复的判定其实很直接。输出时长与源相差不到 50 毫秒,转写文本首尾都能对上原话,不再出现整体语速偏移。

容易忽略的是,位深和采样率写错不会报错,只会让声音变调或变快,转写前用时长做一次交叉验证最省事。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189