报错是这么冒出来的。CosyVoice2 本地部署,3000 字稿子按 200 字切段合成再拼接,前十段听着正常,从第二十段开始音量掉 6dB、音色偏亮,ffprobe 看不出格式差异。
中间走过弯路,把「切段点落在标点之外,前一段的尾音被硬切」当成主因,改完现象没变。
把日志和配置对完,能解释这个现象的基本就这几处。每段合成前都重置参考音频,音色嵌入随段波动。也可能是随机种子没固定,同一参考音频也会采样出不同的音色细节。
另外,拼接没有做响度归一化,各段增益差异被累积放大。
第一件事是逐段测平均音量找出偏移的那几段
ffmpeg -i part_08.wav -af volumedetect -f null NUL 2>&1 | findstr mean_volume
固定参考音频与种子后整批重合成
python tts_batch.py --ref ref.wav --seed 1234 --parts parts --out wav
拼接后统一响度与采样率
ffmpeg -i all.wav -af loudnorm=I=-16:TP=-1.5 -ar 24000 out.wav
末了核对总时长是否与字数匹配
ffprobe -v error -show_entries format=duration -of csv=p=0 out.wav
别只看报错消失,验证要多做一步。各段 mean_volume 相差不超过 1dB,拼后总时长约等于字数除以每秒 4 字,抽听第 5 段与第 25 段音色一致。
提醒一点。长文本合成必须在句号后切段并复用同一份参考音频,音色漂移属于生成侧问题,后期做均衡只能掩盖不能修正。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
