IA Content Maker — machine à vidéos white label
Cette skill transforme l'agent en équipe complète d'un canal de vidéos explicatives : script, art, découpage et rig des personnages, voix, animation, musique de fond, rendu, couverture et sous-titres. Tout mouvement est du code (canvas rendu frame par frame) ; il n'y a pas de vidéo générée par IA.
White label : l'identité du canal (palette, police, trait, cartes, transitions, rythme, narrateur)
est TIRÉE AU SORT par code une fois par canal et enregistrée dans dna.json. Deux canaux avec la même
skill sortent différents. Rien dans le moteur ne dépend d'une palette, police ou thème spécifique.
Fonctionne sur n'importe quel agent qui exécute des commandes terminal (Claude Code, Codex, Gemini CLI, Cursor…).
La spécification complète originale se trouve dans referencia/especificacao-original.md ; ce fichier
contient le flux validé et tout ce qui a changé avec la pratique. En cas de conflit, ce fichier l'emporte.
0. Avant tout : trouver ou créer l'espace de travail
Le code tourne dans un workspace (dossier avec engine/, dna.json, videos/, library/).
- Cherchez un workspace existant (un
dna.jsonà côté deengine/mv.py; l'utilisateur peut indiquer où). - S'il n'y en a pas :
bash <dossier-de-la-skill>/scripts/setup.sh [dossier](par défaut~/ia-content-workspace). Installe venv, Kokoro, faster-whisper, Playwright/Chromium, OpenCV. Nécessite Python ≥3.10 et ffmpeg. - S'il y en a un mais que la skill est plus récente : exécutez le même
setup.sh <workspace>— il met à jour seulementengine/ettemplates/, jamaisdna.json,videos/oulibrary/.
Toutes les commandes ci-dessous sont exécutées DANS le workspace, avec .venv/bin/python (ici : py).
1. Configuration du canal (une fois)
- Demandez : nom du canal (s'il n'a pas de nom, suggérez-en 5 qui correspondent à l'ADN après le tirage),
format principal (vertical ou 16:9), voix disponible (Kokoro gratuit, ElevenLabs/autre, ou votre
propre voix enregistrée) et s'il existe déjà un
dna.json(si oui, copiez-le dans le workspace). py engine/mv.py dna— tire l'ADN avec seed deos.urandom, résout les combinaisons qui entrent en conflit, valide le contraste des couleurs, enregistredna.json+ sauvegarde et télécharge la police. Affichez la carte (py engine/mv.py cartao). L'utilisateur peut verrouiller (--lock trait=index) ou re-tirer un trait (py engine/roll_dna.py --reroll <trait>). Ne choisissez jamais les traits à la main.- Enregistrez le nom dans
dna.json→channel.name. - Route d'art sans modèle d'image : seul le trait "Chunky rounded-square heads" est dessiné en
code (
engine/art/characters.py). Si le tirage donne un autre trait, soit verrouillez--lock build=3, soit implémentez le nouveau trait danscharacters.pyen suivant_head/_torso/_legs, soit utilisez un modèle d'image. - Après la configuration, l'ADN du canal est gelé. Chaque vidéo ne retirera que les traits par vidéo.
2. Chaque vidéo — le flux
Commande de départ de l'utilisateur : "fais une vidéo : [thème], [durée]" (ou "make a video: …").
| # | Étape | Commande | Attendre et montrer à l'utilisateur ? |
|---|---|---|---|
| 1 | Dossier + tirage par vidéo (forme du script, accroche, motif, maquette de couverture, point fort) | py engine/mv.py novo <slug> | — |
| 2 | Script dans videos/<slug>/script.txt (texte pur) + chiffres du plan (mots, lieux, personnages) | écrire | OUI : script + choix, attendez l'OK |
| 3 | art.json + nouvelles planches/tuiles dans engine/art/plates.py et tiles.py si le thème le demande | écrire | — |
| 4 | Art → découpage → rig | py engine/mv.py arte <slug> | affichez le contact de l'art |
| 5 | Voix + temps des mots | py engine/mv.py voz <slug> | indiquez la durée et l'écart du whisper |
| 6 | video.json + plans dans videos/<slug>/shots/01_story.js (partir de templates/shots_modelo.js) | écrire | — |
| 7 | Contact sheet (1 frame / 2 s) → corriger → répéter | py engine/mv.py contato <slug> | — |
| 8 | Rendu + audio + QC | py engine/mv.py render <slug> | — |
| 9 | Couverture | py engine/mv.py capa <slug> | — |
| 10 | Journal + livraison (vidéo, couverture, sous-titres avec hashtags) | py engine/mv.py log <slug> | OUI : livré |
--formato paisagem dans contato/stills/render génère 1920x1080 ; le défaut est vertical 1080x1920.
Pour vérifier des moments précis : py engine/mv.py stills <slug> 0,3.2,10.5.
2.1 Taille (échelle avec la durée)
- Mots : ~205 par minute avec Kokoro pt-BR (parle vite même à 1.0) ; ~175 avec des voix plus lentes.
- Lieux : minutes ×
pace.places_per_minde l'ADN ; en vertical, coupez toutes les ~3 s (≈20 plans/min). ~30 % de grandes planches (avec personnages), le reste des tuiles en gros plan (4 par quad). - Personnages principaux : 1–2 en dessous de 3 min, 2–3 au-dessus.
- Chapitres (ligne
##dans le script) : aucun en dessous de 2 min ; 3–4 jusqu'à 5 min ; 5–8 jusqu'à 10 min. - Rendu :
--partes 4(défaut). Vidéos de plus de 3 min : 4–6 parties.
2.2 Vertical (Reels/TikTok/Shorts) — format validé par défaut
- Pas de vignette d'ouverture ni de fermeture : la voix commence au frame 0.
video.jsonsanstitleet sansoutro_plate. (16:9 utilise les vignettes de l'ADN.) - Frame 0 jamais vide : l'accroche est déjà à l'écran (
t0 = sh.start - 0.4dans write/number). - Chaque plan appelle
sh.vert({ vw, vf })— voirreferencia/motor.md. - Sous-titres incrustés UNIQUEMENT en vertical (1–3 mots, mot parlé en surbrillance). Le 16:9 n'a pas de sous-titres.
- Zones de sécurité : rien d'important à droite entre 50 % et 80 % de la hauteur (boutons de l'app) ni dans les 15 % du bas ; HUD à gauche ; compteur du motif en haut à droite.
- Accroches et structure : suivez
referencia/retencao.md(validé avec rétention).
3. Règles de style (non négociables)
- Flat vector, sans contour, au maximum UNE ombre (la même couleur plus foncée), sans dégradé, sans texture, sans emoji, sans logo de chaîne, sans photo de personne réelle.
- Couleurs : seulement les 5 de la palette + les 11 couleurs de code du
dna.json. Dans les plans, utilisezENGINE.C.<couleur>,ENGINE.font(px)etENGINE.rgba(hex, alpha)— jamais de hex ni de nom de police fixes. Dans l'art en code, utilisezROLE["ice"|"stone"|"pine"|"coal"|"berry"](rôles calculés depuis n'importe quelle palette). - Texte uniquement dans les objets du monde (tableau, panneau, coque, carte, écran) — jamais de carte flottante sur l'art quand le lieu peut porter l'information. Écrivez dans les blanks de la planche.
- Rien d'immobile plus de 1 s ; tout personnage respire, cligne des yeux et joue dans son propre dialogue (pointe,
présente, hausse les épaules, célèbre). Quelque chose de nouveau tous les
pace.new_thing_every_sde l'ADN. - Jamais le même lieu deux plans de suite. Zoom ≤ 1.33× sur le pixel d'origine.
- Entrées avec ressort/pop/puff, jamais de fondu simple. Un X rouge sur toute idée erronée.
4. Art
Route code (défaut, gratuit) : les planches et tuiles sont des fonctions SVG dans engine/art/plates.py et
tiles.py qui retournent (svg, meta). Planches : 1920x1080 en coordonnées monde, VIDES, sol libre au
milieu, meta avec floor_y, blanks (où le code écrit), portals (≥ 400 px, pour le zoom de
transition), anchors. Tuiles : gros plans d'objets, 4 par quad (make_art.py monte le 2×2 avec gouttières
blanches, découpe et convertit le meta). Cartes : contours lon/lat projetés (voir pacific_map, brazil_map).
Personnages : un dict par personnage dans art.json (couleurs de la palette, peau variée entre personnages).
Route modèle d'image (optionnel) : générez les images avec le style core de
referencia/especificacao-original.md (section <art>), sauvegardez dans videos/<slug>/art/ avec les mêmes
noms, écrivez le meta JSON en mesurant les rectangles dans la grille (*_grid.png), et le reste du pipeline
(découpage, rig, animation) est identique. Feuilles sur fond chroma (vert #00B140, ou magenta si la palette a du vert)
et faces SANS bras.
5. Voix
- Défaut : Kokoro (
mv.py voz), voix selon la table du narrateur de l'ADN, vitesse 1.0–1.1 (jamais accéléré). - Plus naturelle : n'importe quel fichier audio prêt →
py engine/mv.py voz <slug> --wav fichier.wav(votre voix, ElevenLabs, Chatterbox…). Le script doit être le texte parlé ; whisper réaligne tout. - Moins "mitraillette" :
--pausa-max 0.35 --pausa-manter 0.28. - Le
voice.pyÉCHOUE si plus de 5 % des mots ne sont pas entendus — refaites la voix, ne forcez pas.
6. Vérification avant le rendu (contact sheet)
Corrigez avant de rendre : panneau vide ou explosé ; texte sur le visage ; bordure noire ; pied flottant ;
même lieu deux fois de suite ; passage > 2× l'intervalle de l'ADN sans nouveauté ; frame 0 vide ; texte
coupé par le bord en vertical ; quelque chose en dehors de l'ADN (police, couleur, carte, transition).
Après le rendu, le QC signale les sauts d'1 frame non planifiés — enquêtez sur chacun (stills).
Audio : le gate exige voix ≥ 15 dB au-dessus de musique+effets et fond sonore plus élevé dans < 1 % des frames ;
sortie -14 LUFS, pic -1 dB.
7. Livraison
- Vidéo :
videos/<slug>/<slug>_vertical.mp4(ou<slug>.mp4en 16:9) et la couverture. - Sous-titres prêts : 1ère ligne = l'accroche ; 2–3 phrases avec les mots-clés du thème (la recherche lit le sous-titre) ; la question de l'appel à commenter ; jusqu'à 5 hashtags pertinents (Instagram limite).
- Avertissez sur les faits simplifiés ou les versions populaires des histoires.
mv.py log <slug>— le tirage par vidéo évite de répéter la forme/accroche/motif/couverture des 5 derniers.
8. Le moteur s'améliore à chaque vidéo
Bug ou limitation ? Corrigez dans engine/ (jamais seulement dans les fichiers d'une vidéo) et enregistrez la leçon dans
referencia/licoes.md de la skill. Faites des sauvegardes des plans avant les gros correctifs. Rendu long :
par parties qu'il est possible de refaire.
Références
referencia/motor.md— API des plans (S, sh.*, personnages, poses, caméra verticale).referencia/retencao.md— structure des accroches, appel final, rythme.referencia/licoes.md— tout ce qui a cassé et comment a été résolu.referencia/especificacao-original.md— spécification complète (traits de l'ADN, rig, animation, son).workspace/exemplos/— deux vidéos complètes :el-nino(vertical, mythe × réalité) etprimeiro-cartao(16:9, histoire chronologique). Pour étudier ou reconstruire : copiez dansvideos/et exécutezmv.py arte+mv.py contato(lewords.jsest déjà prêt).