Légendes incrustées
Un catalogue, choisi dès le départ (CATALOG.md — 17 identités ; les trois moteurs derrière sont un détail technique). Standard (par défaut) construit un rail net et textuel (sous-titre en tiers inférieur portant la majeure partie du texte) + un point culminant incrusté composité dans la scène derrière le sujet au moment fort. Cinématographique est une incrustation pure — pas de rail, chaque légende compositée derrière le sujet (typographie héroïque, accumulation, occlusion comme effet). Thème est une constitution thématique complète — paradigme du corps × pièce maîtresse héroïque × effets avant × réaction de plaque, composée à partir de registres (themes/README.md) : ordnance terminal neonsign stardust stomp. La plupart des explications / voix off sont en mode Standard ; l'incrustation est le sommet rare et mérité — incruster chaque mot est l'erreur courante ; le Thème est pour les demandes de qualité VFX ("炸", "特效", "像 AE 做的").
Flux opérationnel (TL;DR)
Le texte de procédure ci-dessous est long ; le pipeline lui-même est court — et tout ce qui est déterministe est calculé ou compilé, jamais écrit à la main :
- Porte de décision (refuser les mauvais clips) → choisir UNE identité dans CATALOG.md (17 identités ; moteur/compilateur dérivé par recherche — ne jamais poser une question de mode/catégorie)
hyperframes init(ignorer si le répertoire du projet existe déjà avec la vidéo à l'intérieur —matte.cjs/transcribe.cjsadoptent toute vidéo dans le répertoire comme source.mp4) →bash scripts/prepare.sh <projet>(matte ∥ transcription ∥ enveloppe audio en parallèle, puis safe-zones v2 avec palette de scène/optique/éclairage — une commande, rien oublié)- rédiger un petit JSON de choix créatifs (lire d'abord
safe-zones.json) : Cinématographique →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs; Thème →theme.json→make-theme.cjs(paradigmes rail/panneau/poème/reprise ;anchorest le rail silencieux par défaut) - QA visuelle :
node scripts/preview-frames.cjs <projet>→ prévisualisations composites fidèles en ~2s/image (pas de rendu). Vérifier § QA visuelle avant de payer un rendu. render-and-composite.sh→ portes (timing / occlusion+héroïque / débordement / transition) →final.mp4
Règles structurelles que les gens manquent :
- rail (défaut) + incrustation (promotion).
drop(bourrage, non affiché) /rail(sous-titre textuel en tiers inférieur, devant, porte la majeure partie du texte) /incrustation(un mot clé composité derrière le sujet). Le mode Standard fait les deux, n'incrustant que le(s) sommet(s). Voir § Modèle de légende. - La vidéo est livrée NON RETOUCHÉE (Standard/Cinématographique ; le budget PLATE du mode Thème est la seule exception autorisée — beats de réaction enregistrés (charge-dim, coup, secousse, grain) définis par l'ADN du thème et appliqués APRÈS le composite matte pour que le sujet+texte+plaque bougent comme une seule image) — les légendes sont la seule chose ajoutée ; le matte permet juste au sujet d'occulter la piste d'incrustation. Ne jamais étalonner/recolorer/ajouter de lignes de balayage à la vidéo.
- Deux recueils de règles : rail → references/rail.md (fin), art de l'incrustation → references/composition-craft.md (riche, incrustation uniquement). Parcourir selon les besoins.
Modèle de légende — rail + incrustation
Chaque phrase parlée est l'une de trois choses :
| Quoi | Comment c'est affiché | |
|---|---|---|
| drop | bourrage — euh/eu, bégaiements, auto-corrections | non affiché |
| rail | le défaut — contenu parlé ordinaire (textuel) | sous-titre propre en tiers inférieur, devant, lisible. Un mot fort peut recevoir un surlignage emphasis en ligne (couleur d'accent / pop de mot actif) — il reste sur le rail. |
| incrustation | un sommet promu — le temps fort principal | un grand mot composité derrière le sujet (occlusion matte), entrée et sortie conçues |
Le rail porte la majeure partie du texte ; l'incrustation est le sommet rare et mérité. La rareté est par beat/bloc, pas par clip : ≤1 héros par bloc (pensée), jamais deux co-visibles, ≥ un temps d'arrêt entre les fenêtres héros (le compilateur avertit en dessous de 0.6s). Un clip court → généralement 1–2 ; une longue explication → ~un par section. Parmi plusieurs héros, le plus grand rédigé est l'APEX (lui seul reçoit l'incrustation complète du lockup + élévation ajustée à la largeur) ; les plus petits sont des pics MINEURS qui chevauchent leur colonne comme des lignes d'emphase surdimensionnées (premier plan, mouvement amorti) — tous les beats n'ont pas besoin de la vitrine matte, c'est exactement ce qui fait de l'apex un événement. Incruster chaque mot reste l'erreur courante.
Les identités de surface Rail construisent exactement cela (rail = rail.html, incrustation = le point culminant dans index.html). Les identités à flux de colonnes abandonnent le rail et rendent tout de style incrustation — les recommander uniquement pour les demandes d'ambiance plutôt que de texte textuel, jamais pour les explications / voix off où les mots doivent être lus (CATALOG.md encode cela par identité).
Étape 0 — choisir UNE identité dans le CATALOG
Un frontal, trois moteurs derrière. L'utilisateur choisit une IDENTITÉ dans CATALOG.md (17 entrées : 12 classiques + 5 thématisées) ; le moteur, le compilateur et le fichier de rédaction sont dérivés par recherche dans la ligne du catalogue. Ne jamais poser "Standard vs Cinématographique vs Thème" comme question — ce sont des noms de backend (un produit a une seule UX même avec plusieurs moteurs). Le catalogue encode tout ce dont le routage a besoin : surface de lecture, voix, recommandé pour, besoins de scène, notes d'adjacence pour les paires vraiment proches (loud↔ordnance, neon↔neonsign, cream↔stardust).
Procédure : sonder le clip → présélectionner 2–3 identités du catalogue → recommander UNE avec une ligne de justification → l'utilisateur choisit → rédiger le fichier de cette identité. Les identités sont verrouillées par moteur (pas de combinaisons croisées ; en ouvrir une est un événement de validation — voir dna/README.md).
Toujours présenter votre recommandation et laisser l'utilisateur choisir avant de rédiger. Ne pas prendre de valeur par défaut en silence.
(Le tableau complet des identités se trouve dans CATALOG.md — source unique de vérité pour le routage. Les documents sur le moteur ci-dessous décrivent le contrat de rédaction de chaque backend.)
Heuristique de recommandation : utiliser les "Heuristiques de présélection" dans CATALOG.md — elles sont au niveau de l'identité (par exemple "炸" présélectionne ordnance/stomp/terminal/loud et choisit selon CE qui devrait exploser), jamais au niveau de la catégorie. En cas de doute → anchor.
- Cinématographique → écrire
plan.jsonpour un modèle verrouillé, compilé parmake-composition.cjs. - Thème → lire themes/README.md, rédiger
theme.json, exécuterscripts/render-theme.sh(compile + rend + réaction de plaque → final_fx.mp4).
Porte de décision — À EXÉCUTER EN PREMIER
Sonder la vidéo et classer la scène avant l'un ou l'autre mode.
ffprobe <video.mp4> # spécifications
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # à 20/50/80%
Lire les échantillons. Refuser si :
- Plusieurs intervenants / coupures franches (diviser & rendre chaque plan, ou refuser)
- Pas de sujet humain (cette compétence est pour les têtes parlantes)
- Moins de 3 secondes, aucune parole, ou visage jamais clairement visible —
transcribe.cjsprévient quand l'audio est quasi silencieux (Whisper hallucine des mots comme "Merci." sur le silence) ; y prêter attention et refuser plutôt que de légender des mots fabriqués - La source a déjà des sous-titres / légendes / graphiques textuels lourds incrustés — ajouter un deuxième système de légendes entre en conflit et la vidéo est livrée non retouchée (pas de masquage/retouche). Le texte incrusté apparaît souvent seulement au milieu du clip : échantillonner une planche contact à 1ips (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), ne pas se fier à 3 images ponctuelles. - La transcription est inutilisable — la parole non native / avec un accent fort peut être transcrite en charabia confiant. Lire
transcript.jsonpour vérifier avant de rédiger ; si cela ne se décode pas comme une langue, essayerWHISPER_MODEL=mediumune fois, sinon refuser (un rail textuel de mots fabriqués est pire que pas de légendes). - Prise de vue mouvementée avec mouvement rapide (le matte scintille)
Sondages pré-vol (ne coûtent rien, évitent les pires échecs)
- Sondage de coupure de plan. Échantillonner les images à 20%, 50%, 80%. Si un sujet/scène différent apparaît, recadrer le clip avant la coupure.
- Sondage de lettres-boîtes / colonnes. Barres noires sur la première image ? Calculer le rectangle de contenu sûr et contraindre le placement des légendes à l'intérieur.
- Sondage de luminance. Échantillonner la luminance moyenne de la région des légendes —
sous 60→ le texte clair se lit tel quel,60-180→ ajouter le voile de glyphe,180+→ texte opaque + voile (jamais de texte clair nu). Les modèles Cinématographiques sont crème+écranet VERROUILLÉS — utiliser ce sondage pour choisir une identité adaptée (scènes lumineuses →ink, ou le thème de rail opaqueanchor), jamais pour en recolorer une. - Recommandation d'identité par ton (vous recommandez ; l'utilisateur choisit — voir Étape 0 + CATALOG.md). explication / interview / mots à lire impérativement → identités de surface rail/panneau ; poétique / social / "cinématographique" → identités à flux de colonnes par registre ; "炸 / 特效 / VFX" / mondes nommés → identités thématiques. En cas de doute →
anchor(les mots se lisent, la scène est sûre) — mais présenter une présélection et laisser l'utilisateur choisir.
Pipeline — 5 étapes
1. hyperframes init <projet> --non-interactive --video <video.mp4> --skip-skills
2. bash scripts/prepare.sh <projet> # matte ∥ transcription (parallèle) → safe-zones. Une commande.
# → frames_fg/ transcript.json safe-zones.json
3. [ÉTAPE AGENT — la seule étape créative] rédiger un petit JSON ; voir ci-dessous par mode
Cinématographique : rédiger plan.json → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
Thème : rédiger theme.json → bash scripts/render-theme.sh <projet> (compile + rend + effets plaque)
4. node scripts/preview-frames.cjs <projet> # ~2s/image prévisualisations composites → § QA visuelle (AVANT le rendu)
5. bash scripts/render-and-composite.sh <projet> # portes → final.mp4 + instantané history/
(Mode Thème : IGNORER les étapes 3b/5 — render-theme.sh exécute déjà compile + render-and-composite
+ _postfx.sh ; le livrable est final_fx.mp4, final.mp4 est sans réaction de plaque)
L'étape 3 diffère selon le mode :
Étape 3 — Mode Cinématographique (incrustation pure)
- Lire
safe-zones.jsond'abord. Les plans de narration vont danszones.hugLeft/hugRight— bandes nettes ABOUTANT à la silhouette (le texte loin du corps donne l'impression de flotter, pas d'être incrusté ; les coins éloignés sont le plan B, pas le défaut). Le héros par défaut va dansheroAnchor/heroBands.best(centré SUR le sujet, ~30–55% occulté).recommendation:"fg"déplace la NARRATION devant pour la lisibilité ; le héros reste incrusté chaque fois queheroBands.feasible— h