记录一下那天晚上的排查过程。按 CosyVoice2 仓库的示例跑零样本克隆,参考音频 12 秒,合成「好的我知道了」这类短句时最后一个字总是少半拍,听起来像被掐断。把 speed 设成 0.9 稍微好一点但仍然存在,换参考音频也一样,前端播放器确认没有做淡出。
刚开始盯着「流式合成在最后一个 chunk 被提前 close」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。推理时的静音裁剪按能量阈值判断,尾音弱就被当成静音。也可能是输出采样率与参考音频不一致,重采样时尾部丢样本。
少数情况下是文本结尾没有标点,模型没生成收尾的停顿。
上来先把输出存成 wav 看尾部波形
ffmpeg -i out.wav -af "atrim=start=0:end=2" -f null -
接着关掉裁剪相关开关重新合成一次
python -c "import cosyvoice;print('use trim=False')"
然后在文本末尾补句号后对比时长
python -c "print(len(open('out.wav','rb').read())/32000)"
量出两次输出的总时长差异
ffprobe -v error -show_entries format=duration -of csv=p=0 out.wav
怎么算真的好了,看的是同一批现象。补上句号并关闭裁剪后,短句末尾的辅音完整,波形上尾音有自然衰减而不是垂直截断,人工试听 20 条都正常。
补一句。克隆类 TTS 的尾音问题一半出在后处理而不是模型,先把 trim、静音阈值这类开关关掉听一遍,再怀疑采样率。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
