TTS 配音——带逐词时间轴的旁白
单词时间轴是实现字幕精确弹出和场景节奏跟随的关键。务必先生成配音,再根据实际时间轴进行动画制作——切勿颠倒顺序。
快速入门(免费,无需 API 密钥)
pip install edge-tts
python scripts/vo_gen.py --text "Pythagore. Dans un triangle rectangle…" --voice fr-FR-DeniseNeural --rate -4%
输出(默认前缀为 vo):
vo.mp3— 音频文件vo_words.json—{ words:[{text,fromMs,toMs}], captions:[{startMs,durationMs,text,tokens[]}] }其中字幕按页分组,每页最多 3 个单词(间隔 >700ms 自动分页),并包含逐词时间窗口vo.js—window.VO_B64(Base64 编码的 mp3)+window.VO_DATA(JSON 数据),可直接嵌入画布/视频流水线:<script src="vo.js">,然后通过decodeAudioData播放,使用VO_DATA.captions绘制字幕
列出可用语音:python scripts/vo_gen.py --list-voices fr(也支持 en, ja, es, de, pt, zh, ar…)。
语音菜单(快速选择)
| 语言 | 沉稳叙述者 | 活力声音 |
|---|---|---|
| fr | fr-FR-DeniseNeural | fr-FR-HenriNeural |
| en | en-US-AriaNeural | en-US-GuyNeural |
| ja | ja-JP-NanamiNeural | ja-JP-KeitaNeural |
| es | es-ES-ElviraNeural | es-ES-AlvaroNeural |
| de | de-DE-KatjaNeural | de-DE-ConradNeural |
| pt | pt-BR-FranciscaNeural | pt-BR-AntonioNeural |
| zh | zh-CN-XiaoxiaoNeural | zh-CN-YunjianNeural |
语速语法:--rate -4% 放慢 / +10% 加快。较短的句子能获得更清晰的单词边界;只需重新生成出错的那一句,无需重做整个音轨。
注意事项(实战经验)
- edge-tts ≥ 7:默认情况下关闭了单词边界——必须设置
boundary="WordBoundary"(vo_gen.py已传递该参数)。错误表现:音频正常,但words为空。 - 服务返回 HTTP 403:您的 edge-tts 版本太旧,无法适应当前令牌方案——请执行
pip install -U edge-tts(如果系统安装被锁定,请使用虚拟环境)。 - 原始流中单词偏移量的单位为 100 纳秒;除以 10⁴ 转换为毫秒。
替代方案与升级
- Kokoro(
pip install kokoro)— 本地神经 TTS,8200 万参数,支持多种语言。 - Piper — 完全离线,速度快,按语言下载语音包。
- ElevenLabs — 付费服务,多语言 v2;
with-timestampsAPI 返回字符级时间戳,可直接用于字幕。 - VOICEVOX(日语)— 本地 HTTP API(
localhost:50021),提供按音素划分的时间戳(非常适合日语口型动画)。 - 将现有音频 → 通过 faster-whisper 生成单词时间戳:
pip install faster-whisper python - <<'EOF' from faster_whisper import WhisperModel; import json m = WhisperModel("small"); segs, _ = m.transcribe("track.mp3", word_timestamps=True) json.dump([w._asdict() for s in segs for w in s.words], open("words.json","w")) EOF
混入视频(快速参考)
将人声、背景音乐和音效作为独立音轨处理,然后:音乐背景音量控制在配音下方 −18…−22 LUFS,使用 ffmpeg sidechaincompress(以配音为触发信号)进行闪避处理,最终执行 loudnorm=I=-14:TP=-1.5:LRA=11 标准化。
推荐的字幕样式:粗体大写,每弹幕 1–3 个单词,当前播放单词使用强调色并放大约 20%,背后添加黑色背景条或描边以增强对比度,并避开平台界面区域。