这类问题我又碰上了一次。用 CosyVoice 1.0 合成一段中文播报,接口返回的 wav 用播放器打开语速偏快、音调偏高,ffprobe 显示采样率是 24000,而下游播放器按 16000 在播。

第一反应是「拼接多段音频时没有统一采样率」,验证下来不成立。

原因不止一个,得分开看。合成输出默认 24k,播放端按 16k 解析;wav 头里的采样率字段被改写,数据没重采样;用了 mp3 转码但没指定 -ar 参数。

先确认文件头的采样率

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

接着统一转成下游要求的 16k

ffmpeg -y -i out.wav -ar 16000 -ac 1 out16.wav

拼接前先校验每段参数一致

python -c "import wave;w=wave.open('out16.wav');print(w.getframerate(), w.getnchannels())"

播放端按文件头动态取采样率

python -c "print({'use_header_rate':True})"

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

怎么算真的好了,看的是同一批现象。播放语速与音调恢复正常,拼接后的长音频没有忽快忽慢,波形时长与文本预估一致。

这里还有个坑。采样率不一致听起来像变调,其实是播放速度错了,转码时把 -ar 写死能避免整条链路扯皮。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189