Voix off et Synthèse Vocale (TTS)
La voix off pilote la timeline. Générez-la avant de construire les visuels.
Choisir un moteur
| Moteur | Emplacement | Points forts | Attention |
|---|---|---|---|
| ElevenLabs | API cloud | Meilleure naturalité, clonage vocal | Payant ; ne clonez que les voix pour lesquelles vous avez le consentement |
| OpenAI TTS | API cloud | Simple, cohérent | Choix de voix limité |
| Kokoro | Local | Gratuit, bonne qualité, hors ligne | Nécessite une configuration Python |
| Piper | Local | Rapide, fonctionne sur CPU | Moins expressif |
| Voix enregistrée | Micro | La plus authentique | Nécessite un nettoyage |
Conservez les clés API dans des variables d'environnement ou un fichier .env qui est ignoré par git. Ne les imprimez ni ne les commettez jamais.
Préparer le script pour la synthèse
- Écrivez les nombres, unités et acronymes comme ils sont prononcés : "vingt vingt-six", "A P I" s'il doit être épelé, "gigaoctets".
- Ajoutez des virgules pour les respirations ; utilisez un point pour un arrêt ; évitez les parenthèses.
- Placez les noms difficiles dans une liste de prononciation et testez-les d'abord dans un court échantillon.
- Divisez en un fichier par scène (
audio/scene-01.mp3). Les fichiers par scène vous permettent de réenregistrer une seule ligne et de garder la synchronisation flexible.
Générer (exemple, ElevenLabs REST)
import os, requests, pathlib
def tts(texte: str, voix_id: str, sortie: pathlib.Path) -> None:
r = requests.post(
f"https://api.elevenlabs.io/v1/text-to-speech/{voix_id}",
headers={"xi-api-key": os.environ["ELEVENLABS_API_KEY"], "Accept": "audio/mpeg"},
json={"text": texte, "model_id": "eleven_multilingual_v2",
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}},
timeout=120,
)
r.raise_for_status()
sortie.write_bytes(r.content)
Les noms de modèles et les points de terminaison changent. Confirmez avec la documentation actuelle du fournisseur avant utilisation.
Mesurer et rythmer
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 audio/scene-01.mp3
- Visez 140 à 160 mots par minute (mots / secondes * 60). Régénérez avec un débit légèrement différent ou raccourcissez le texte si une scène dépasse 180 mots par minute ; cela semblera précipité.
- N'étirez pas temporellement la parole de plus d'environ 10 % ; cela sonne synthétique. Réécrivez plutôt.
Nettoyer la voix enregistrée
# Passe-haut, réduction de bruit douce, compression, volume sonore
ffmpeg -i raw.wav -af "highpass=f=80,afftdn=nf=-25,acompressor=threshold=-18dB:ratio=3:attack=5:release=80,loudnorm=I=-16:TP=-1.5:LRA=11" -ar 48000 clean.wav
Supprimez le silence au début et à la fin :
ffmpeg -i in.wav -af "silenceremove=start_periods=1:start_threshold=-45dB,areverse,silenceremove=start_periods=1:start_threshold=-45dB,areverse" out.wav
Assembler
# Joindre les fichiers de scène avec des intervalles de 0,4 s
python - <<'PY'
import subprocess, pathlib
fichiers = sorted(pathlib.Path("audio").glob("scene-*.mp3"))
parties = []
for i, f in enumerate(fichiers):
parties += ["-i", str(f)]
n = len(fichiers)
filtr = "".join(f"[{i}:a]apad=pad_dur=0.4[a{i}];" for i in range(n)) + "".join(f"[a{i}]" for i in range(n)) + f"concat=n={n}:v=0:a=1[out]"
subprocess.run(["ffmpeg", "-y", *parties, "-filter_complex", filtr, "-map", "[out]", "voiceover.mp3"], check=True)
PY
Ensuite, mixez avec la musique dans audio-mixing et ajoutez des sous-titres avec captions-subtitles.
Éthique et droits
- Clonez une voix uniquement avec l'autorisation explicite du locuteur.
- Divulguez la voix synthétique lorsque les règles de la plateforme ou la loi l'exigent.
- Vérifiez la licence du fournisseur TTS pour une utilisation commerciale.