Communitygithub.com

voix-off-demo

Générer et synchroniser une narration vocale IA pour des vidéos de démonstration en utilisant ElevenLabs TTS.

Qu'est-ce que voix-off-demo ?

Cette compétence permet de générer et synchroniser automatiquement une narration vocale pour des vidéos de démonstration, en exploitant l'API ElevenLabs TTS. Elle est conçue comme la troisième étape d'un pipeline de production vidéo, après la création du script et l'enregistrement de la vidéo brute. La compétence planifie le placement temporel de chaque segment de narration (par défaut pendant les pauses après chaque action), génère l'audio via ElevenLabs avec alignement caractère par caractère, réconcilie les durées prévues et réelles (avec accélération limitée à 1,15x), assemble le tout avec la vidéo via ffmpeg, et produit des sous-titres SRT. Elle prend en charge le ré-engénération de segments individuels sans refaire l'ensemble de la vidéo, ce qui économise du temps et des appels API. Idéale pour les démonstrations logicielles, les tutoriels vidéo, et toute production nécessitant une voix-off professionnelle et synchronisée.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/arozumenko/video-producer/tree/main/skills/demo-voiceover

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Compétence Voix-Off de Démonstration

Générer et synchroniser une narration vocale IA pour des vidéos de démonstration.

Comment cela s'intègre

Il s'agit de la troisième étape du pipeline de production vidéo :

/demo-script  →  /record-demo  →  /demo-voiceover
  (planification)  (capture)         (narration et livraison)

Peut également être utilisé de manière autonome pour ajouter une narration à n'importe quelle vidéo existante avec un journal d'horodatage.

Entrées

La compétence nécessite :

  1. Script de démonstration JSON — provenant de /demo-script (workspace/<date>/demo-script-<nom>.json)
  2. Fichier vidéo brut — provenant de /record-demo (workspace/<date>/<nom>_raw.mp4)
  3. Journal d'horodatage — provenant de /record-demo (workspace/<date>/<nom>_timestamps.json)

Format du journal d'horodatage (produit par /record-demo) :

{
  "video_file": "demo_raw.mp4",
  "start_epoch": 1739545200.0,
  "steps": [
    {
      "scene_id": "intro",
      "step_index": 0,
      "action": "navigate",
      "narration": "Bienvenue sur OneTest. Créons votre premier cas de test.",
      "timestamp_sec": 0.0,
      "completed_sec": 1.2
    },
    {
      "scene_id": "navigate-to-test-cases",
      "step_index": 0,
      "action": "click",
      "narration": "Ouvrez la section Cas de test depuis la barre latérale.",
      "timestamp_sec": 3.2,
      "completed_sec": 3.8
    }
  ]
}

Pipeline

Étape 1 : Planification de la narration

Déterminer quand chaque segment de narration doit jouer par rapport à la vidéo :

Options de stratégie de synchronisation :

StratégieQuand la narration commenceIdéal pour
on_actionAu moment où l'action commence (timestamp_sec)Expliquer ce qui va se passer
after_actionAprès la fin de l'action (completed_sec)Décrire ce qui vient de se passer
before_action0,5s avant le début de l'actionCréer de l'anticipation
fill_pausePendant la fenêtre pause_after_msNarrer pendant la pause intentionnelle

Par défaut : fill_pause — la narration est jouée pendant la pause après chaque action, de sorte que le spectateur voit l'action se dérouler, puis entend l'explication pendant que l'écran est stable. C'est ce qui semble le plus naturel.

Sortie de la planification :

{
  "segments": [
    {
      "index": 0,
      "text": "Bienvenue sur OneTest. Créons votre premier cas de test.",
      "video_start_sec": 1.2,
      "max_duration_sec": 2.0
    },
    {
      "index": 1,
      "text": "Ouvrez la section Cas de test depuis la barre latérale.",
      "video_start_sec": 3.8,
      "max_duration_sec": 1.5
    }
  ]
}

Étape 2 : Génération audio (ElevenLabs)

Générer chaque segment de narration à l'aide du point d'accès avec horodatages d'ElevenLabs :

  • Renvoie un alignement au niveau du caractère (durée exacte à la milliseconde près)
  • Permet la génération gratuite de sous-titres
  • Prend en charge le chaînage de continuité via previous_request_ids (max 3)

Exécutez python scripts/generate_narration.py --plan voiceover_plan.json --voice rachel --output-dir .

Pour les détails de l'API, consultez references/elevenlabs-api.md.

Étape 3 : Réconciliation des durées

Après avoir généré l'audio, réconcilier les durées prévues et réelles :

  1. L'audio tient dans la fenêtre disponible -> placer au début prévu
  2. L'audio est plus court -> un silence supplémentaire est acceptable (les démos respirent)
  3. L'audio est plus long -> accélérer (max 1,15x via atempo), ou raccourcir le texte et regénérer

Limiter l'ajustement de vitesse à 1,15x — au-delà, le résultat semble précipité.

Étape 4 : Assemblage audio

Fusionner les segments de narration avec la vidéo à l'aide du script utilitaire :

bash scripts/merge_audio_video.sh demo_raw.mp4 narration_results.json final_demo.mp4

Le script construit un filter_complex ffmpeg avec adelay par segment et atempo pour les ajustements de vitesse.

Étape 5 : Génération de sous-titres

Les horodatages au niveau du caractère d'ElevenLabs permettent la génération gratuite de SRT :

  • Regrouper les caractères en mots, les mots en lignes de sous-titres (max 8 mots)
  • Décaler de video_start_sec pour chaque segment
  • Sortie au format SRT standard

Pour graver les sous-titres dans la vidéo :

ffmpeg -i final_demo.mp4 -vf subtitles=demo.srt \
    -c:v libx264 -crf 18 -c:a copy \
    final_demo_subtitled.mp4

Configuration vocale

Choisissez la voix en fonction de l'audience, utilisez eleven_turbo_v2 pour les brouillons, eleven_multilingual_v2 pour la version finale.

Pour les identifiants de voix, le guide des paramètres, la comparaison des modèles et les détails du chaînage de continuité, consultez references/elevenlabs-api.md.

Ajustements de rythme

ProblèmeSolutionLimite
Audio légèrement trop longAccélérer avec le filtre atempoMax 1,15x
Audio beaucoup trop longRaccourcir le texte de narration, regénérerRegénérer uniquement le segment
Audio trop courtAjouter un silence de remplissage (naturel)Le silence pendant les démos est acceptable
Intervalle gênant entre segmentsProlonger la pause ou ajouter une phrase de transitionMaintenir les pauses sous 3s

Fichiers de sortie

FichierDescription
<nom>_final.mp4Vidéo + narration fusionnées
<nom>_final_subtitled.mp4Vidéo + narration + sous-titres incrustés
<nom>.srtFichier de sous-titres (séparé)
<nom>_narration_full.mp3Piste audio complète de narration (pour réutilisation)
narration_NNN.mp3Segments individuels (pour régénération)
<nom>_voiceover_plan.jsonPlan de synchronisation (pour débogage/itération)

Tous sauvegardés dans workspace/<date>/

Flux de travail itératif

La compétence permet de refaire des segments individuels sans régénérer l'intégralité :

  1. L'utilisateur examine la vidéo : "La narration de la scène 3 est trop rapide"
  2. L'agent ajuste : raccourcit le texte, régénère uniquement le segment 3
  3. Utilise previous_request_ids des segments 1-2 pour la continuité
  4. Re-fusionne avec ffmpeg (seule la piste audio change, la vidéo reste)

C'est rapide car :

  • La vidéo n'a pas besoin d'être réenregistrée
  • Un seul appel API ElevenLabs par segment modifié
  • La fusion ffmpeg ne prend que quelques secondes

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Skills associés