Voix Off TTS — narration avec timings mot par mot
Les timings des mots sont ce qui fait ressortir les légendes sur le bon mot et rythme les scènes sur la bonne syllabe. Générez TOUJOURS la VO en premier et animez en fonction de ses timings réels — jamais l'inverse.
Démarrage rapide (gratuit, sans clé API)
pip install edge-tts
python scripts/vo_gen.py --text "Pythagore. Dans un triangle rectangle…" --voice fr-FR-DeniseNeural --rate -4%
Produit (préfixe vo par défaut) :
vo.mp3— l'audiovo_words.json—{ words:[{text,fromMs,toMs}], captions:[{startMs,durationMs,text,tokens[]}] }où les légendes sont regroupées en pages de ≤3 mots (un écart >700ms coupe une page) avec des fenêtres par motvo.js—window.VO_B64(mp3 en base64) +window.VO_DATA(le JSON), prêt à être intégré dans un pipeline canvas/seek :<script src="vo.js">puisdecodeAudioDatapour la lecture etVO_DATA.captionspour le dessin
Liste des voix : python scripts/vo_gen.py --list-voices fr (aussi : en, ja, es, de, pt, zh, ar…).
Menu des voix (sélections courtes)
| Langue | Narrateur calme | Énergique |
|---|---|---|
| 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 |
Syntaxe du taux : --rate -4% plus lent / +10% plus rapide. Les phrases courtes donnent des limites de mots plus propres ; régénérez par phrase pour refaire une mauvaise ligne sans refaire toute la piste.
Pièges (appris à la dure)
- edge-tts ≥ 7 : les limites de mots sont DÉSACTIVÉES par défaut —
boundary="WordBoundary"est requis (vo_gen.py le passe déjà). Symptôme du bug : l'audio est OK, leswordssont vides. - HTTP 403 du service : votre edge-tts est trop ancien pour le schéma de jeton actuel —
pip install -U edge-tts(utilisez un venv si l'installation système est verrouillée). - Les décalages de mots sont en unités de 100 nanosecondes dans le flux brut ; divisez par 10⁴ pour les ms.
Alternatives et améliorations
- Kokoro (
pip install kokoro) — TTS neuronal local, 82M paramètres, plusieurs langues. - Piper — entièrement hors ligne, rapide, téléchargements de voix par langue.
- ElevenLabs — payant, multilingue v2 ; l'API
with-timestampsrenvoie des temps au niveau du caractère qui alimentent directement les légendes. - VOICEVOX (japonais) — API HTTP locale sur
localhost:50021, timings par phonème (excellent pour l'animation labiale JP). - N'importe quel audio existant → timings de mots via 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
Mixage dans une vidéo (référence rapide)
Voix, musique et SFX en pistes SÉPARÉES, puis : lit musical −18…−22 LUFS sous la VO, ducking avec sidechaincompress de ffmpeg (VO comme déclencheur), final loudnorm=I=-14:TP=-1.5:LRA=11. Style de légende qui fonctionne : majuscules grasses, 1–3 mots par apparition, mot actif en couleur d'accent avec un pop d'échelle ~20%, pilule noire ou contour derrière pour le contraste, à l'écart des zones UI de la plateforme.