报错是这么冒出来的。edge-tts 合成的播报音频每段开头都有 300ms 左右静音,做连续播报时句子之间空出半秒,前端进度条还会先停一下再走。
中间走过弯路,把「mp3 编码器按帧补齐,起始帧是空帧」当成主因,改完现象没变。
原因不止一个,得分开看。合成文本首尾带了空格或换行,被读成停顿。另一种情况是声学模型输出自带起始静音帧,编码后留在文件头。
不容易想到的是,拼接时只拼文件,没有做静音检测与裁剪。
测出静音段的实际长度
ffmpeg -i a.mp3 -af silencedetect=noise=-45dB:d=0.2 -f null -
再往下用 silenceremove 裁掉开头静音
ffmpeg -i a.mp3 -af "silenceremove=start_periods=1:start_threshold=-45dB:start_silence=0.05" b.mp3
整目录批量处理
python trim_head.py --dir mp3 --threshold -45 --min-silence 0.15
末了确认送进合成的文本已去掉首尾空白
python -c "print(repr(' 你好,今天讲三件事 '.strip()))"
怎么算真的好了,看的是同一批现象。对裁过的文件再跑一次 silencedetect,开头 0.15 秒内没有 silence_start 记录,拼接后句子间隔小于 120ms 且首字没被削掉。
阈值给得太狠会吃掉句首辅音,先在一条上试 -45dB 再批量,别拿整批文件做实验。报错文案容易误导,真正的原因往往在相邻那一层的日志里。
