Génération de voix off ElevenLabs
Générez des voix off professionnelles avec l'IA ElevenLabs pour les vidéos Remotion.
Prérequis
ELEVENLABS_API_KEYdans.env.local
Démarrage rapide
# Générer une voix off à partir d'un texte
node .claude/skills/elevenlabs-remotion-skill/generate.js --text "Votre texte ici" --output public/audio/voiceover.mp3
# Générer avec un style narrateur (plus naturel)
node .claude/skills/elevenlabs-remotion-skill/generate.js --text "Votre texte" --character narrator --output voiceover.mp3
# Générer des scènes avec assemblage de requêtes
node .claude/skills/elevenlabs-remotion-skill/generate.js --scenes remotion/scenes.json --output-dir public/audio/project/
# Régénérer une seule scène
node .claude/skills/elevenlabs-remotion-skill/generate.js --scenes scenes.json --scene scene2 --new-text "Texte mis à jour"
# Lister les voix et préréglages de personnage disponibles
node .claude/skills/elevenlabs-remotion-skill/generate.js --list-voices
node .claude/skills/elevenlabs-remotion-skill/generate.js --list-characters
Préréglages de personnage
Utilisez les préréglages de personnage pour des voix off plus naturelles, au lieu d'une lecture littérale du texte à l'écran :
| Personnage | Description | Idéal pour |
|---|---|---|
literal | Lit le texte exactement tel qu'écrit | Texte à l'écran, citations |
narrator | Conteur professionnel, fluide, captivant | Vidéos explicatives, documentaires |
salesperson | Enthousiaste, persuasif, dynamique | Marketing, publicités |
expert | Autoritaire, confiant, savant | Contenu juridique, tutoriels |
conversational | Décontracté, amical, naturel | Réseaux sociaux, contenu décontracté |
dramatic | Intense, émotionnel, percutant | Accroches, énoncés de problèmes |
calm | Apaisant, rassurant, doux | Construction de confiance, conclusions |
# Utiliser le style narrateur globalement
node .claude/skills/elevenlabs-remotion-skill/generate.js --scenes scenes.json --character narrator --output-dir public/audio/
# Ou définir par scène dans scenes.json
{
"scenes": [
{ "id": "scene1", "text": "Énoncé du problème", "character": "dramatic" },
{ "id": "scene2", "text": "Solution", "character": "calm" }
]
}
Génération par scènes avec assemblage de requêtes
Générez plusieurs scènes avec une prosodie cohérente grâce à l'assemblage de requêtes ElevenLabs :
Format scenes.json
{
"name": "demo-produit",
"voice": "George",
"character": "narrator",
"scenes": [
{
"id": "scene1",
"text": "La synthèse vocale générique sonne robotique. Votre marque mérite mieux.",
"duration": 4.5,
"character": "dramatic"
},
{
"id": "scene2",
"text": "Avec le clonage vocal, vous pouvez utiliser votre propre voix pour un contenu illimité.",
"duration": 5.5
},
{
"id": "scene3",
"text": "Enregistrez un court échantillon. Clonez-le. Créez des voix off professionnelles en quelques minutes.",
"duration": 6,
"delay": 0.3
}
]
}
Générer toutes les scènes
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--scenes remotion/demo-produit-scenes.json \
--output-dir public/audio/demo-produit/
Ceci crée :
demo-produit-scene1.mp3àsceneN.mp3demo-produit-combined.mp3(toutes les scènes assemblées)demo-produit-info.json(métadonnées avec durées)
Régénération d'une seule scène
Si une scène commence trop tôt, a un mauvais timing ou nécessite un texte différent :
# Régénérer scene2 avec un nouveau texte
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--scenes remotion/scenes.json \
--scene scene2 \
--new-text "Texte mis à jour de la scène 2" \
--output-dir public/audio/project/
# Régénérer scene3 avec un personnage différent
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--scenes remotion/scenes.json \
--scene scene3 \
--character salesperson \
--output-dir public/audio/project/
# Simplement régénérer (même texte, même personnage)
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--scenes remotion/scenes.json \
--scene scene1 \
--output-dir public/audio/project/
# Intégrer une vignette dans une vidéo MP4
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--embed-thumbnail public/videos/ma-video.mp4 \
--thumbnail public/videos/ma-vignette.png \
--output public/videos/ma-video-avec-vignette.mp4
L'outil automatise automatiquement :
- L'assemblage de requêtes des scènes précédentes pour une prosodie cohérente
- La mise à jour du fichier info.json avec les nouvelles métadonnées
- La mise à jour du fichier scenes.json si
--new-textest fourni
Intégration de vignette
Intégrez une image de vignette dans les vidéos MP4 pour que les plateformes comme Twitter, YouTube et les lecteurs vidéo affichent votre vignette personnalisée au lieu de la première image.
Intégrer une vignette dans une vidéo
# Utilisation de base - sortie vers video-thumb.mp4
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--embed-thumbnail public/videos/promo.mp4 \
--thumbnail public/videos/vignette.png
# Chemin de sortie personnalisé
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--embed-thumbnail public/videos/promo.mp4 \
--thumbnail public/videos/vignette.png \
--output public/videos/promo-final.mp4
Workflow avec Remotion
# 1. Rendre votre vidéo
npx remotion render MaVideo public/videos/ma-video.mp4
# 2. Rendre votre vignette (utiliser une composition Still)
npx remotion still MaVignetteVideo public/videos/ma-vignette.png
# 3. Intégrer la vignette
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--embed-thumbnail public/videos/ma-video.mp4 \
--thumbnail public/videos/ma-vignette.png \
--output public/videos/ma-video-finale.mp4
Formats supportés
- Vidéo : MP4 (H.264/H.265)
- Vignette : PNG, JPG, JPEG
L'intégration utilise le drapeau -disposition:v:1 attached_pic de ffmpeg pour définir la vignette comme image jointe, reconnue par la plupart des lecteurs vidéo et plateformes.
Validation du timing
La compétence valide automatiquement le timing après la génération à l'aide de ffprobe :
Ce qu'elle vérifie
| Vérification | Seuil | Description |
|---|---|---|
| Écart de durée | >15% | Avertit si la durée réelle diffère de la durée attendue |
| Silence en début | >200ms | L'audio commence tard (voix off retardée) |
| Silence en fin | >500ms | Silence inutile à la fin |
| Débit de parole | 2-4.5 mots/s | Optimal ~3 mots/seconde |
Valider un audio existant
# Valider toutes les scènes d'un projet
node .claude/skills/elevenlabs-remotion-skill/generate.js --validate public/audio/demo-produit/
Exemple de sortie :
🔍 Validation de demo-produit (6 scènes)
❌ scene1 : 3,00s (attendu : 4,5s)
❌ Audio 1,50s plus court que prévu
👍 8 mots @ 3,1 mots/s
⚠️ scene2 : 6,35s (attendu : 5,5s)
⚠️ Silence en début : 235ms (peut commencer tard)
🐢 10 mots @ 1,8 mots/s
✅ scene4 : 4,36s (attendu : 4s)
👍 9 mots @ 2,3 mots/s
📊 Durée totale : 30,80s (attendu : 30,00s)
Fichier info.json mis à jour
Après validation, le fichier info.json inclut les mesures réelles :
{
"scenes": [
{
"id": "scene1",
"duration": 4.5,
"actualDuration": 3.0,
"leadingSilence": 0.05,
"wordsPerSecond": 3.1
}
]
}
Utilisez actualDuration dans votre composition Remotion pour une synchronisation précise.
Options
| Option | Description | Par défaut |
|---|---|---|
--text, -t | Texte à convertir en parole | Requis (ou --file/--scenes) |
--file, -f | Lire le texte depuis un fichier | - |
--output, -o | Chemin du fichier de sortie | output.mp3 |
--output-dir | Répertoire de sortie pour les scènes | public/audio |
--voice, -v | Nom ou ID de la voix | George |
--model, -m | ID du modèle | eleven_multilingual_v2 |
--character, -c | Préréglage de personnage | literal |
--scenes | Fichier JSON avec les scènes | - |
--scene | ID de la scène à régénérer | - |
--new-text | Nouveau texte pour la régénération de scène | - |
--validate | Valider un répertoire audio existant | - |
--skip-validation | Ignorer la validation automatique | false |
--embed-thumbnail | Fichier vidéo dans lequel intégrer une vignette | - |
--thumbnail | Fichier image de vignette (PNG/JPG) | - |
--stability | Stabilité de la voix (0-1) | varie selon le personnage |
--similarity | Similarité de la voix (0-1) | varie selon le personnage |
--style | Exagération du style (0-1) | varie selon le personnage |
--no-combined | Ignorer le fichier combiné | false |
Voix recommandées
| Voix | Style | Idéal pour |
|---|---|---|
George | Britannique chaleureux et captivant | Narration, vidéos explicatives |
Antoni | Professionnel, chaleureux | Contenu juridique, tutoriels |
Arnold | Autoritaire, grave | Sujets d'entreprise, sérieux |
Josh | Amical, conversationnel | Marketing, contenu décontracté |
Intégration avec Remotion
Après avoir généré les voix off des scènes, utilisez-les dans votre composition :
import { Audio, Sequence, staticFile } from "remotion";
// Utiliser les fichiers audio individuels des scènes pour une synchronisation précise
const DUREES_SCENES = {
scene1: 4.5, // Depuis info.json
scene2: 5.5,
scene3: 8.0,
};
export const VideoAvecVoixOff: React.FC = () => {
const { fps } = useVideoConfig();
const scene1Images = Math.round(DUREES_SCENES.scene1 * fps);
const scene2Images = Math.round(DUREES_SCENES.scene2 * fps);
return (
<>
<Sequence from={0} durationInFrames={scene1Images}>
<Audio src={staticFile("audio/project/project-scene1.mp3")} />
<VisuelScene1 />
</Sequence>
<Sequence from={scene1Images} durationInFrames={scene2Images}>
<Audio src={staticFile("audio/project/project-scene2.mp3")} />
<VisuelScene2 />
</Sequence>
</>
);
};
Conseils pour de meilleurs résultats
- Utilisez les préréglages de personnage : Ne lisez pas le texte à l'écran littéralement - utilisez
narratorouexpertpour un flux naturel - La ponctuation compte : Utilisez des points pour les pauses, des virgules pour de brèves coupures
- Nombres : Écrivez les nombres en toutes lettres ("cinq cents" pas "500") pour un discours naturel
- Abréviations : Écrivez les mots complets ("vingt-quatre heures" pas "24h")
- Scène par scène : Différentes scènes peuvent avoir différents personnages (intro dramatique, appel à l'action calme)
- Réglage fin : Utilisez
--scenepour régénérer des scènes individuelles sans tout refaire - Assemblage de requêtes : Maintient la cohérence vocale sur toutes les scènes
Exemple de workflow
# 1. Créez scenes.json avec votre script
# 2. Générez toutes les scènes avec le style narrateur
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--scenes remotion/ma-video-scenes.json \
--character narrator \
--output-dir public/audio/ma-video/
# 3. Prévisualisez dans Remotion, remarquez que scene2 commence trop tôt
# 4. Régénérez uniquement scene2 avec un texte mis à jour
node .claude/skills/elevenlabs-remotion-skill/generate.js \
--scenes remotion/ma-video-scenes.json \
--scene scene2 \
--new-text "Texte légèrement plus long pour remplir le timing visuel" \
--output-dir public/audio/ma-video/
# 5. Mettez à jour la composition vidéo avec la nouvelle durée depuis info.json
# 6. Répétez jusqu'à ce que le timing soit parfait