Explainer Parlant
La voix est l’horloge, le présentateur PARLE (synchro labiale), chaque idée est d’abord une image quotidienne, chaque scène a un zoom et un moment d’emphase, le look est Apple, et le film porte la marque de l’utilisateur. Exemple travaillé : « REA - Reverse Engineer Anything » (129,0 s, 12 scènes) - references/example/ (SCRIPT, STORYBOARD, RETIME).
Chemins utilisés ci-dessous :
<skill>= dossier de cette compétence.<kit>=<skill>/../explainer-kit.<engine>=<skill>/../spatial-film.<home>=TALKING_EXPLAINER_HOMEou~/.talking-explainer; profil =<home>/profile/(partagé avec explainer-kit).<py>= la commandepythonenregistrée dans<home>/config.jsonpar setup-check (py -3.12sur Windows,python3sur macOS).
Exécutez chaque script de film depuis la racine du projet de film. Les scripts sont éprouvés - exécutez-les, ne les régénérez jamais. Jugez les scènes par les planches contacts, jamais en lisant le HTML des scènes dans la session principale. Les workers reçoivent des CHEMINS de fichiers.
Configuration (première exécution uniquement)
Pas encore de <home>/profile/brand.json → exécutez la Phase S d’explainer-kit (setup-check, entretien de marque + profile.mjs init, voice.md, musique). Son entretien de marque définit le nom du présentateur (--presenter). Deux choses supplémentaires pour cette compétence, demandées dans le même entretien :
- Les lignes d’ouverture et de fermeture dans
voice.md, mot pour mot, avec le prénom de l’utilisateur (l’accroche d’ouverture est « ? Est-ce vrai ? ici, de ... décomposons cela. »). - Le présentateur : la démo parlante fournie (un personnage cartoon impassible avec lunettes), ou leur propre personnage - voir « Votre propre personnage parlant » ci-dessous.
Valeurs par défaut (ne pas redemander)
- Narration dans la langue du profil, dans le style de l’utilisateur depuis
voice.md. À l’écran = anglais simple court (~6 mots par ligne de titre). La longueur est libre si le message passe (~150-160 mots par minute sur une prise naturelle). - L’utilisateur enregistre la prise à partir du script (son clone vocal ElevenLabs ou son propre micro). La phase 1 remet le script sous forme de paragraphes prêts à coller et ATTEND un MP3. Générer via l’API (
<engine>/scripts/el-tts.py, clé dansenvEL, jamais sur disque) uniquement sur demande. - Ouverture = accroche d’abord : commencez par la revendication la plus surprenante du sujet sous forme de question, puis la ligne d’ouverture de
voice.md. Le NOM du sujet vient au paragraphe 2. Fermeture = ligne de fermeture devoice.md+ lectadu profil. - Sujets conceptuels obtiennent UNE analogie quotidienne racontée littéralement (REA : la recette secrète d’un café). Les sujets « Comment ça marche » concernant l’outil ou le système de l’utilisateur obtiennent une démonstration de la chose réelle à la place -
references/real-apps.md. De même pour les outils et plateformes tiers : nommez les produits réels, parcourez le flux de requête réel, et utilisez les propres textes, paramètres et nombres des plateformes lus sur leurs pages en ligne. Par défaut, utilisez la démonstration pour tout sujet technique. - Version courte (<= 30 s) : ~2,6 mots/s, 4 paragraphes = 4 images (accroche + identité / nom / l’image unique / fermeture), une phrase de fermeture, 2 workers x 2 scènes.
- Sujets d’actualité / news : recherchez d’abord les reportages en direct (médias locaux + un article approfondi), puis rédigez de manière équilibrée : chaque affirmation obtient son propriétaire dans la voix (« selon l’agence... », « les critiques disent... »), la peur obtient son échelle réelle, puis une section numérotée des zones grises où les déclarations officielles se contredisent ou où un détail clé n’est pas public, un paragraphe honnête sur les aspects positifs, et une conclusion avec des questions à poser - jamais un verdict. Tout ce qui n’est dit que dans un résumé de recherche (la page elle-même n’a pas pu être chargée) reste dans le bloc de faits du SCRIPT.md marqué « Non vérifié, PAS exprimé ». 16 images / ~700 mots conviennent pour cela.
- Script à partir d’une transcription collée : conservez les faits de la source et son ordre d’idées, réécrivez chaque ligne dans la voix du narrateur (ne traduisez jamais ligne par ligne), et supprimez les parties du présentateur source (« j’ai construit... », démos de code, son nom). Les longs collages sont tronqués autour de 50 000 caractères : indiquez où la coupure s’est produite dans SCRIPT.md, puis comblez la partie manquante avec le mécanisme standard, vérifié comme toute autre affirmation. Sauvegardez le collage dans
references/source-transcript.txtdès le premier jour, et conservez les personnes nommées et les jalons de la source. - Personnes réelles = fiches personnelles, jamais d’étiquettes de nom : portrait (photo duotone ou ressemblance illustrée) + nom + rôle en une ligne + année. Listez chaque personne nommée avec sa scène dans SCRIPT.md sous « Personnes à l’écran ».
- Look = Apple : fond blanc (
#F5F5F7), Geist avec suivi de taille spécifique, verre factice (.ap-glass- jamaisbackdrop-filterdans le rig 3D), volets.ap-window/.ap-dark, ressortssp()à amortissement critique (interdiction deback.*), retenue (une idée par image, pulsations <= 1,1), une spine LENS bleue. La couleur = signification, réécrite par film. L’échafaudage définit tout cela. - Icônes = Solar (480 Design, https://solar-icons.vercel.app) - bold-duotone pour les icônes héros, linear pour l’interface utilisateur, depuis
references/icons-solar.html. Jamais Lucide ou Phosphor. L’illustration est sous licence CC BY 4.0 : chaque livraison donne à l’utilisateur la ligne « Icônes : Solar par 480 Design (CC BY 4.0) » dans la description de la vidéo. - Mouvement : titres qui se matérialisent sur leurs mots (montée + flou -> 0, ressort), animation de l’interface pour tout outil, diagrammes explicatifs, PLUS un zoom avant (ZOOM) et un accent d’emphase (EMPH : pulsation, balayage de marqueur, soulignement, tirage de mise au point, incrustation de nombre) sur chaque scène. Loi de fluidité à 60 ips.
- 1920×1080, 60 ips. Logo de marque dans l’accroche, logo dans le coin au milieu, carte de fin = logo +
cta.
Phases
| # | Phase | Faire | Porte |
|---|---|---|---|
| 1 | Script + prise | Rechercher le sujet (faits réels, avec sources). Charger <kit>/references/voice-script.md + <home>/profile/voice.md. Accroche d’ouverture + fermeture ci-dessus, pas de « ! », UNE analogie (ou la démonstration), 12 paragraphes = 12 images (forme : references/example/SCRIPT.md). Épeler les noms dits comme des lettres (« R-E-A »). Les affirmations sur ce que l’IA « ne peut pas faire » doivent être vraies pour les modèles d’aujourd’hui. Pas de nombres jargon (pages, pas de tokens ; comptes arrondis). Écrire <film>/SCRIPT.md, remettre les paragraphes à l’utilisateur sous forme de TEXTE CLAIR (pas de bloc de code, rien après le dernier paragraphe - ils collent tout le message dans ElevenLabs ; les conseils d’enregistrement vont dans un message avant), ATTENDRE le MP3 ; ffprobe sa longueur | la prise en main, longueur notée |
| 2 | Échafaudage + timings | node <skill>/scripts/new-talking-explainer.mjs <film> --name <slug> --mp3 <take.mp3> ; <py> <kit>/scripts/transcribe.py assets/audio/vo.mp3 src/timing --lang <code> --prompt "<noms, jargon>" ; <py> <kit>/scripts/words.py src/timing/vo-words.json (la feuille de signaux) | la transcription correspond au script |
| 3 | Storyboard | Écrire STORYBOARD.src.md en temps GLOBAUX (ci-dessous) dans la forme de references/example/STORYBOARD.md : une image par paragraphe, coupures dans les pauses de phrases (somme = fin de voix + 2,8 s), en-têtes un champ par ligne (- start: / - duration: / - src:), chaque bloc marque ses beats ZOOM et EMPH sur les mots-clés, couleur = signification, faits réels + extras fictionnels, une COUTURE DE POSE DE SCÈNE où deux scènes partagent un objet héros. <py> src/storyboard-local.py -> STORYBOARD.md. Montrer à l’utilisateur la liste des images (une ligne chacune) | leur « go » |
| 4 | Contrat + présentateur + audio | Éditer + exécuter src/set-film.py (scènes + longueur de la voix). Éditer + exécuter src/set-presenter.py (poses ~0,1 s avant leurs mots-clés ; penser/marcher n’ont pas de bouche - jamais pendant que la voix parle). Lit : <py> <engine>/scripts/bgm-cut.py assets/audio/bed.mp3 assets/audio/bgm-edit.wav --len <total> --a 0 <total+3> --fade-out 2.6 (un film plus long que le lit répète le corps : --a 0 <len> --b <bar> <len> --b ... --xfade 0.3) -> <py> <kit>/scripts/master-audio.py --len <total> -> <py> <engine>/scripts/build-presenter.py (imprime « lip sync: N poses ») -> <py> <kit>/scripts/build-brand.py (imprime la fenêtre du logo dans le coin). Réécrire chaque partie [FILM] de frame.md avec un script <engine>/scripts/patch_exact.py. Éditer + exécuter src/set-cues.py. <py> <engine>/scripts/make-harness.py ; <py> <skill>/scripts/make-packets.py ; node <engine>/scripts/test-scene.mjs m-presenter "<5 fois>" | feuille du présentateur : bouches ouvertes pendant les paroles, poses sur les signaux |
| 5 | Scènes | references/workers.md : 6 workers Sonnet x 2 scènes, max 4 à la fois (un tour de correction compte), son modèle de prompt (loi de zone incl. pics de poussée, la contrainte 0,12, Solar uniquement, la barre Apple, jamais inventer de nombres). Examiner les milieux vous-même ; corrections vers le MÊME worker | chaque feuille correspond à son bloc, lisible à l’échelle de la feuille |
| 6 | Livraison | <py> <engine>/scripts/fromto-scan.py compositions/s*.html (0) -> <py> <engine>/scripts/assemble.py -> npx hyperframes@<film.json hyperframes> lint . + check . -> <py> <engine>/scripts/seam-check.py + node <kit>/scripts/seam-diff-all.mjs -> node <engine>/scripts/render-final.mjs <slug>-1080p60 (en arrière-plan ; se termine par un flash scan) -> transcrire le RENDU dans .hyperframes/work/sync + <py> <kit>/scripts/sync-check.py src/timing/vo-words.json .hyperframes/work/sync/vo-words.json -> <py> <skill>/scripts/frames.py renders/<slug>-1080p60.mp4 frames.jpg --at <un par scène> et --zone --at <chaque pic ZOOM> -> node <engine>/scripts/encode-web.mjs renders/<slug>-1080p60.mp4 renders/web --name <slug> --poster <t> -> remettre les chemins + la ligne de crédit Solar | lint/check 0 erreurs, coutures 0,00 % en dehors de la boîte du présentateur, 0 flashs, synchro médiane ~0,000 s, rien à gauche de la ligne rouge à aucun pic |
Écrire les temps UNE FOIS, en secondes globales
Convertir 20 scènes de temps de mots en temps local à la main est là où les erreurs s’infiltrent. Dans STORYBOARD.src.md, donnez à chaque image - start: <global> et marquez les mots-clés comme "mot"@g<global> ; les plages ZOOM et les temps de « sortie par » peuvent être des nombres globaux simples. <py> src/storyboard-local.py écrit STORYBOARD.md avec chaque temps local, vérifie que les débuts s’enchaînent et que chaque signal tient dans sa scène, et imprime la liste des scènes pour set-film.py. Les SFX (src/set-cues.py) et le présentateur (src/set-presenter.py) sont également écrits en secondes globales.
Échange de prise / langue / ouverture après la construction (retime, jamais reconstruire)
Une nouvelle prise -> sauvegardez compositions/, film.json, STORYBOARD.md, src/ dans .hyperframes/work/<old>/, déplacez l’ancien rendu dans renders/<old>/ -> copiez la prise dans assets/audio/vo.mp3 -> transcrivez -> nouvelles coupures dans set-film.py -> poses du présentateur, lit, master, build-presenter, build-brand, set-cues, make-harness -> écrivez RETIME.md (par scène : chaque beat -> son nouveau mot-clé @ temps local ; les scènes avec du NOUVEAU contenu obtiennent un bloc complet ; forme references/example/RETIME.md ; « ce fichier l’emporte sur les temps de STORYBOARD.md ») -> patchez la durée de frame.md / la fenêtre du logo / les coutures -> envoyez un SendMessage à CHAQUE worker sa section RETIME (4 à la fois). Les scènes DEVIENNENT PLUS COURTES sur une prise plus rapide : dites aux workers de raccourcir les ressorts avant de supprimer un beat.
Coupe portrait / TikTok / Reels / Shorts (portage, jamais reconstruire)
<py> <skill>/scripts/port-portrait.py <film> <film>-9x16- un NOUVEAU dossier (le film 16:9 reste intact) : copie la source + l’audio, déplace les scènes livrées dansreferences/src-16x9/(le cahier des charges des workers), écrit le contrat portrait (zones de frame.md pour l’interface de TikTok, brief worker, starter 1080×1920, taille set-film), déplace le présentateur en bas à gauche (échelle x0,9, pieds y 1640).- Depuis la nouvelle racine :
<py> src/set-film.py->build-presenter.py->build-brand.py(logo vertical = centre haut à y 150, sous les onglets de la plateforme) ->make-harness.py->test-scene.mjs m-presenter(présentateur x ~26-556, y ~1074-1640). - Workers : mêmes paires, prompt = « PORT » (partez de la source 16:9, conservez copie/beats/couleurs/icônes/poses de couture, ré-autorisez seulement la disposition + la caméra) + la loi de zone portrait : titre y 260-500, scène x 60-1020 / y 520-1060 (texte x <= 920 sous y 680), bas droit x 580-920 / y 1080-1520, présentateur x 20-560 / y 1060-1660, rien au-dessus de y 250 ou en dessous de y 1540. Les paires qui copient l’objet d’une autre paire passent en dernier.
- Livraison comme phase 6 avec
render-final.mjs <slug>-1080x1920p60;frames.py --zonedétecte le portrait et dessine la boîte du présentateur + les lignes d’interface de la plateforme. Le master 1080p60 se téléverse sur TikTok tel quel. Défauts de premier passage : objets héros compressés dans le bas droit (faites du beat un héros dans la scène, réduisez la taille de l’affichage à la place) ; un titre sur 2 lignes entrant en collision avec une pile montant dans une poussée (>= 40 px d’écart au pic) ; une carte secondaire traînée au-delà de y 1540 par une poussée (reculez/atténuez-la pendant cette poussée).
Vraies applications + vrais logos
Un film sur la propre configuration de l’utilisateur montre les VRAIES applications : logos de la source, couleurs des applications depuis leur propre CSS (scripts/app-tokens.py), les vrais noms de dossiers et nombres de l’utilisateur, une liste de confidentialité avant que tout worker ne commence. Recette : references/real-apps.md. frame.md reprend la règle « pas de tiers... »
…
[Le contenu a été tronqué pour la traduction]