报错是这么冒出来的。用自建 TTS 服务合成一篇 3000 字的文章,接口一次只返回前 800 字左右的音频,剩下的没有报错也没有内容,响应里 finish 字段是 true。把文本砍到 500 字就完整,试过把 timeout 调到 120 秒仍然截断在同一位置。
中间走过弯路,把「分段按字符数切,切在了句子中间导致尾部丢字」当成主因,改完现象没变。
排查方向其实有限,先把可能性排一排。服务端对单次请求的输出时长有硬上限。也可能是长文本一次性合成时显存里缓存的声学特征被截断。
另外,拼接时没重置采样点,段与段之间出现断音。
上来先确认服务端的单次时长上限
curl -s http://127.0.0.1:9000/tts -H 'Content-Type: application/json' -d '{"text":"测试","voice":"zh_female"}' | head -c 300
接着按句号与问号切成不超过 200 字的片段
python -c "import re;t=open('a.txt').read();print([len(x) for x in re.split(r'(?<=[。!?])', t) if x.strip()])"
随后逐段合成后按顺序拼接
ffmpeg -f concat -safe 0 -i list.txt -c copy full.wav
剩下的就是检查拼接处是否有静音缺口
ffmpeg -i full.wav -af silencedetect=noise=-45dB:d=0.5 -f null -
怎么算真的好了,看的是同一批现象。整篇 3000 字都有音频,总时长与按字数估算的误差在 5% 以内,段与段之间没有明显停顿或吞字。
这里还有个坑。长文本合成要按语义分段并在客户端拼接,切分点放在句末标点上,直接按字符数硬切一定会切坏词。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
