Que fait video-narrado ?
Entrée : un .md. Sortie, dans cet ordre :
- Vidéo détaillée 16:9 (2 à 4 min) qui parcourt l'intégralité du MD.
- Versions courtes 9:16 (2 ou 3, moins de 60 s) : chacune reprend un point clé de la vidéo détaillée.
- Un
publicacion.mdpar pièce (titre, description, hashtags et texte alternatif).
Le tout avec la voix choisie, des sous-titres et une musique de fond personnalisée.
- Moteur :
motor/, dans cette skill (Playwright 1.63.0 + ffmpeg ; Python 3 sans dépendances).MOTOR= chemin absolu de ce dossier. - Projet : un dossier par vidéo, p. ex.
videos/AAAA-MM-DD_sujet/, avec un sous-dossier par pièce :largo/,short-1-…/,short-2-…/. Chaque pièce contient sonstoryboard.json. - Installation (une seule fois) : voir
README.md.
Voix sélectionnée
Par défaut, la voix clonée « audio_pmm » de HeyGen :
champ de create_speech | valeur |
|---|---|
voiceId | b088805628184836963fa5d2881bb23b |
engine | elevenlabs |
settings | {"model_id": "eleven_v4"} |
language | es |
Si la personne qui demande la vidéo souhaite une autre voix, la chercher avec mcp__heygen__list_voices et la confirmer avant de générer.
Flux
1. Lire le MD et proposer les pièces
Lire le MD complet. Définir le parcours de la vidéo détaillée (toutes les conclusions, dans l'ordre) et une conclusion par version courte (la plus forte en premier). Afficher la liste des pièces avant d'écrire les storyboards.
2. Storyboards → approbation
Une scène par idée. La vidéo détaillée comporte de 8 à 16 scènes ; une version courte, de 4 à 7 scènes, avec un accroche (destacado) dans la première. Exemple complet : motor/ejemplos/storyboard-desalacion-16x9.json.
{"id": "03-sesiones", "tipo": "barras", "kicker": "Sessions par cas", "titulo": "Où l'on a le plus parlé",
"items": [{"etiqueta": "Caleta Chañaral", "valor": 6}], "destacar": 0, "nota": "Source…",
"subtitulo": "Chañaral de Aceituno a été le cas avec le plus de sessions.",
"voz": "Chañaral de Aceituno a été le cas avec le plus de sessions."}
En-tête du storyboard : titulo, serie (ce qui apparaît à côté de « Rizoma · » en haut), formato ("16:9" pour la vidéo détaillée, "9:16" pour les versions courtes), fuente_md et, si souhaité, musica (voir étape 5).
Types de scène (tous acceptent kicker, tono: "oscuro" et lluvia: true) :
| type | champs | à quoi ça sert |
|---|---|---|
portada | titulo, bajada | ouvrir la vidéo détaillée |
cifras | titulo, items[{valor, prefijo?, sufijo?, texto, detalle?}] (1 à 3), destacar | nombres qui défilent |
barras | titulo, items[{etiqueta, valor, rotulo?}] (jusqu'à 8), destacar, nota | comparer des quantités |
hito | fecha, etiqueta, titulo, texto, progreso{i, n} | un fait dans une chronologie |
lista | titulo, items[{marca?, texto, alerta?}] (jusqu'à 6) | arguments ou étapes |
cita | fecha, texto, quien, nota | ce que quelqu'un a dit |
destacado | texto, bajada | la phrase à retenir ; l'accroche d'une version courte |
cierre | bajada, url, fuente | marque et source |
Règles éditoriales :
- Uniquement des faits du MD. Ce que le MD marque comme douteux est exclu ou mentionné comme tel.
vozest ce qui est lu : les nombres, années, pourcentages et sigles sont écrits en toutes lettres (texto_voz.pyrejette les chiffres).subtituloest ce qui est vu, avec des chiffres.textoest le texte à l'écran dehito,citaetdestacado.- Phrases courtes, espagnol du Chili neutre, ~2,9 mots par seconde. Une version courte ne dépasse pas ~140 mots de voix.
- Ce qui est tiré d'une transcription automatique est marqué comme paraphrase (
nota). - Ce qui est publié ne nomme pas les clients ni les plateformes internes. La clôture mentionne la source.
Afficher chaque storyboard sous forme de tableau (scène · type · ce qui est vu · ce qui est narré) et attendre l'approbation : chaque narration consomme un quota de voix.
3. Voix (un appel par pièce)
python3 $MOTOR/texto_voz.py <pieza>
Transmettre le texte imprimé (la voix de chaque scène unie avec <break time="1.2s"/>) à mcp__heygen__create_speech avec la voix sélectionnée. Avec l'audio_url renvoyé :
python3 $MOTOR/bajar_voz.py <pieza> "<audio_url>"
Télécharge l'audio et le découpe par scène en cherchant les pauses. Si un message indique qu'il manque des pauses, relancer sur l'audio déjà téléchargé avec un seuil plus bas : python3 $MOTOR/bajar_voz.py <pieza> <pieza>/voz/narracion.wav --pausa 0.7 (en pratique ElevenLabs raccourcit parfois une pause). Si cela échoue encore, la voix n'a pas respecté un <break> : demander avant de régénérer. Ne jamais relancer la seule génération après une erreur.
4. Construire et rendu
bash $MOTOR/producir.sh <pieza> # vidéo complète
bash $MOTOR/producir.sh <pieza> --hasta 15 --salida prueba.mp4 # test court
Chaque scène dure le temps de sa voix. Le MP4 se trouve dans <pieza>/salida/video.mp4 ; le temps de génération est à peu près égal à la durée de la vidéo.
5. Musique de fond
Automatique : fond ambiant synthétisé avec ffmpeg (sans droits tiers), 14 dB sous la voix, avec ducking doux et mix final à -16 LUFS. Dans le storyboard : "musica": {"bajo_voz_db": 18} baisse le volume ; {"archivo": "pista.mp3"} utilise une piste personnelle (libre de droits uniquement, avec la licence notée) ; false la désactive.
6. Versions courtes
Après avoir approuvé la vidéo détaillée, monter chaque version courte comme une pièce séparée (formato: "9:16"), en réutilisant des scènes de la vidéo détaillée : accroche → 2 à 4 scènes de données → clôture. Même étape 3 (un appel vocal par pièce) et étape 4.
7. Révision et livraison
- Extraire 4 à 8 images avec ffmpeg et les vérifier : s'assurer que le sous-titre ne cache pas une donnée, qu'aucun texte ne dépasse du cadre et qu'aucune scène n'est vide.
- Écrire
publicacion.mdpar pièce : titre (≤ 60 caractères), description avec la source, 3 à 5 hashtags, texte alternatif et ce qui reste à vérifier avant publication. - Copier les MP4 dans
~/Downloadsavec des noms clairs (Video_<sujet>.mp4,Short_<n>_<sujet>.mp4). L'audio et les MP4 ne sont pas versionnés (**/voz/*.wav,**/salida/).
Depuis un HTML animé personnel
Si un HTML avec window.seek(t) et des scènes à durées fixes existe déjà, écrire guion.json manuellement (html: [a, b] par segment) et exécuter preparar.py + render.mjs. Pour les versions courtes faites à la main : motor/plantillas/motor-vertical.js.
Format et zones de sécurité
- 16:9 : 1920×1080, sous-titre de 34 px en bas, phrases jusqu'à 58 caractères.
- 9:16 : 1080×1920, sous-titre de 54 px à 400 px du bord inférieur, phrases jusqu'à 34 caractères ; contenu entre y=400 et y=1380 (le haut et le bas sont réservés aux boutons de chaque réseau).
- Aucun sous-titre ne se termine par « que », « les », « par » et autres.
Erreurs connues
- Pas de réseau : les polices Google ne se chargent pas et le rendu tombe sur Arial.
- ffmpeg sans libass (Homebrew) : c'est pourquoi les sous-titres sont dessinés dans la page.
- Type de scène inconnu : la vidéo sort vide ; vérifier le
tipo.