TTS 語音旁白 — 具備詞層級時間戳
詞時間戳是讓字幕在正確的字詞上彈跳、場景在正確的音節上節奏的關鍵。務必先產生語音旁白,再根據其實際時間戳進行動畫 — 絕不要反過來。
快速入門(免費,無需 API 金鑰)
pip install edge-tts
python scripts/vo_gen.py --text "畢達哥拉斯。在一個直角三角形中…" --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 資料),可直接用於 Canvas/搜尋流程:<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 版本太舊,不支援當前的 token 機制 — 請執行
pip install -U edge-tts(如果系統安裝版本被鎖定,請使用 venv)。 - 在原始串流中,詞偏移單位為 100 奈秒;除以 10⁴ 即為毫秒。
替代方案與升級
- Kokoro(
pip install kokoro)— 本機神經 TTS,82M 參數,支援多種語言。 - 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% 的縮放效果,背後使用黑色塊或描邊以增強對比,並避開平台 UI 區域。