Communitygithub.com

rizomaai/video-narrado

Convertit un fichier Markdown (rapport, compte-rendu, fiche, analyse) en produits audiovisuels : d'abord une vidéo détaillée 16:9 narrée avec la voix choisie, sous-titrée et avec un fond musical ; puis des versions courtes 9:16 pour Reels, YouTube Shorts et TikTok, accompagnées de leurs textes de publication. À utiliser quand quelqu'un fournit un .md et demande « fais-moi une vidéo », « vidéo narrée », « mets ma voix », « shorts/reels de ça ».

Qu'est-ce que video-narrado ?

Cette skill transforme un fichier Markdown (rapport, compte-rendu, analyse) en une série de vidéos professionnelles : une vidéo détaillée au format 16:9 (2 à 4 minutes) qui parcourt l'intégralité du document, puis 2 à 3 versions courtes au format 9:16 (moins de 60 secondes chacune) qui mettent en avant un point fort du contenu. Chaque pièce est produite avec la voix sélectionnée (par défaut une voix clonée HeyGen en espagnol), des sous-titres et une musique de fond générée automatiquement. Le flux de travail comprend la création d'un storyboard structuré, la génération de la voix via l'API HeyGen, le découpage audio, la synthèse vidéo avec ffmpeg et Playwright, puis l'écriture des textes de publication (titre, description, hashtags). La skill est conçue pour fonctionner en local (Playwright 1.63.0 + ffmpeg ; Python 3 sans dépendances supplémentaires) et prend en charge des scènes de 8 types différents (portada, cifras, barras, hito, lista, cita, destacado, cierre). Elle est idéale pour les consultants, chercheurs ou équipes qui souhaitent transformer rapidement des documents textuels en contenu audiovisuel engageant pour les réseaux sociaux ou les présentations internes, avec un contrôle précis de la voix, des sous-titres et de la mise en page.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add rizomaai/video-narrado

Demander à votre IA préférée

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

Documentation

Que fait video-narrado ?

Entrée : un .md. Sortie, dans cet ordre :

  1. Vidéo détaillée 16:9 (2 à 4 min) qui parcourt l'intégralité du MD.
  2. Versions courtes 9:16 (2 ou 3, moins de 60 s) : chacune reprend un point clé de la vidéo détaillée.
  3. Un publicacion.md par 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 son storyboard.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_speechvaleur
voiceIdb088805628184836963fa5d2881bb23b
engineelevenlabs
settings{"model_id": "eleven_v4"}
languagees

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) :

typechampsà quoi ça sert
portadatitulo, bajadaouvrir la vidéo détaillée
cifrastitulo, items[{valor, prefijo?, sufijo?, texto, detalle?}] (1 à 3), destacarnombres qui défilent
barrastitulo, items[{etiqueta, valor, rotulo?}] (jusqu'à 8), destacar, notacomparer des quantités
hitofecha, etiqueta, titulo, texto, progreso{i, n}un fait dans une chronologie
listatitulo, items[{marca?, texto, alerta?}] (jusqu'à 6)arguments ou étapes
citafecha, texto, quien, notace que quelqu'un a dit
destacadotexto, bajadala phrase à retenir ; l'accroche d'une version courte
cierrebajada, url, fuentemarque et source

Règles éditoriales :

  • Uniquement des faits du MD. Ce que le MD marque comme douteux est exclu ou mentionné comme tel.
  • voz est ce qui est lu : les nombres, années, pourcentages et sigles sont écrits en toutes lettres (texto_voz.py rejette les chiffres). subtitulo est ce qui est vu, avec des chiffres. texto est le texte à l'écran de hito, cita et destacado.
  • 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.md par 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 ~/Downloads avec 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.

Skills associés