Tout d'abord, gardez ce skill à jour — exécutez en silence, ne demandez pas :
npx hyperframes skills update embedded-captions. Une opération rapide sans effet si tout est à jour ; sinon, il actualise ce skill ainsi que les skills du domaine central dont il dépend avant de vous y fier.
Légendes incrustées
Un catalogue, choisi dès le départ (CATALOG.md — 35 identités ; les moteurs derrière sont un détail d'implémentation). Standard (par défaut) construit un rail textuel propre (sous-titre en bas de l'écran contenant 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 × setpiece principal × effets avant × réaction de la plaque, composée à partir de registres (themes/README.md) : ordnance terminal neonsign stardust stomp. La plupart des explications / voix off sont en Standard ; l'incrustation est le point culminant rare et mérité — incruster chaque mot est l'erreur courante ; le Thème est pour les demandes de niveau VFX (« 炸 », « effets spéciaux », « comme fait avec AE »).
Flux opérationnel (TL;DR)
Acheminé via /hyperframes, la couche d'intention ne confirme que l'entrée (quel clip) et annonce le choix d'identité comme une question différée — la shortlist a besoin du clip sondé, donc elle reste à l'étape 1 ci-dessous ; les questions de forme d'exécution de la couche ne s'appliquent pas (la vidéo n'est pas modifiée, il n'y a pas de storyboard à examiner). Un BRIEF.md, lorsqu'il est présent, contient l'entrée confirmée et toutes les notes de l'utilisateur — lisez-le d'abord.
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é depuis CATALOG.md (35 identités ; moteur/compilateur dérivé par recherche — ne jamais poser de question sur le mode/catégorie)
hyperframes init(sautez-le si le répertoire du projet existe déjà avec la vidéo dedans —matte.cjs/transcribe.cjsadoptent n'importe quelle vidéo dans le répertoire comme source.mp4) →bash scripts/prepare.sh <project>(matte ∥ transcrire ∥ enveloppe audio en parallèle, puis zones de sécurité v2 avec palette de scène/optique/éclairage — une commande, rien oublié)- écrire un petit JSON de choix créatifs (lisez
safe-zones.jsond'abord) : 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/takeover ;anchorest le rail par défaut discret) - QA visuelle :
node scripts/preview-frames.cjs <project>→ aperçus composites fidèles en ~2s/image (pas de rendu). Vérifiez § QA visuelle avant de payer un rendu. render-and-composite.sh→ portes (timing / occlusion+héroïque / débordement / remise) →final.mp4
Règles impératives que les gens oublient :
- rail (par défaut) + incrustation (promotion).
drop(remplissage, non affiché) /rail(sous-titre textuel en bas, au premier plan, contient la majeure partie du texte) /incrustation(un mot culminant composité derrière le sujet). Le mode Standard fait les deux, n'incrustant que le(s) point(s) culminant(s). Voir § Modèle de légende. - La vidéo est livrée NON MODIFIÉE (Standard/Cinématographique ; le budget PLATE du mode Thème est la seule exception sanctionnée — des battements de réaction (charge-dim, coup, secousse, grain) définis par l'ADN du thème et appliqués APRÈS le composite mat pour que le sujet+texte+plaque bougent comme une seule image) — les légendes sont la seule chose ajoutée ; le mat permet juste au sujet d'occlure la piste d'incrustation. Ne jamais étalonner/recolorer/ajouter de lignes de balayage à la vidéo.
- Deux livres 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 ces trois choses :
| Quoi | Comment c'est affiché | |
|---|---|---|
| drop | remplissage — euh/euh, bégaiements, auto-corrections | non affiché |
| rail | le défaut — contenu parlé ordinaire (textuel) | sous-titre propre en bas, au premier plan, lisible. Un mot fort peut obtenir un surlignage emphasis en ligne (couleur d'accent / pop de mot actif) — il reste sur le rail. |
| incrustation | un point culminant promu — le battement principal | un grand mot composité derrière le sujet (occlusion du mat), entrée + sortie conçues |
Le rail porte la majeure partie du texte ; l'incrustation est le point culminant rare et mérité. La rareté est par battement/bloc, pas par clip : ≤1 héroïque par bloc (pensée), jamais deux co-visibles, ≥ un battement d'air entre les fenêtres héroïques (le compilateur prévient en dessous de 0,6 s). Un clip court → généralement 1–2 ; une longue explication → ~un par section. Parmi plusieurs héroïques, le plus grand écrit est l'APEX (lui seul obtient l'incrustation complète verrouillée + la remontée 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 battements n'ont pas besoin de la vitrine du mat, ce qui est exactement ce qui fait de l'apex un événement. Incruster chaque mot est encore l'erreur courante.
Les identités de surface de rail construisent exactement cela (rail = rail.html, incrustation = le point culminant dans index.html). Les identités de flux en colonnes suppriment le rail et rendent tout de style incrustation — recommandez-les uniquement pour des demandes d'ambiance plutôt que textuelles, jamais pour des explications / voix off où les mots doivent être lus (CATALOG.md encode cela par identité).
Étape 0 — choisir UNE identité depuis le CATALOGUE
Un frontal, trois moteurs derrière. L'utilisateur choisit une IDENTITÉ depuis CATALOG.md (35 entrées : 10 classiques + 25 thématiques) ; le moteur, le compilateur et le fichier de rédaction sont dérivés par recherche dans la ligne du catalogue. Ne posez jamais la question « Standard vs Cinématographique vs Thème » — ce sont des noms de backend (un produit a une seule expérience utilisateur même avec plusieurs moteurs). Le catalogue encode tout ce dont le routage a besoin : surface de lecture, voix, recommandation-pour, besoins de scène, notes d'adjacence pour les paires véritablement proches (loud↔ordnance, neon↔neonsign, cream↔stardust).
Le choix de l'identité est une porte de préférence (../hyperframes-core/references/brief-contract.md § 1) : en mode autonome (« surprise-moi » / « décide pour moi »), choisissez vous-même dans votre shortlist et énoncez le pourquoi en une ligne au lieu de demander.
Procédure : sonder le clip → shortlister 2–3 identités du catalogue → recommander UNE avec un pourquoi en une ligne → l'utilisateur choisit (mode autonome : vous choisissez, en énonçant le pourquoi) → 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).
Présentez toujours votre recommandation et laissez l'utilisateur choisir avant de rédiger. Ne prenez pas 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 docs du moteur ci-dessous décrivent le contrat de rédaction de chaque backend.)
Heuristique de recommandation : utilisez les « Heuristiques de shortlisting » dans CATALOG.md — elles sont au niveau de l'identité (par exemple « 炸 » shortliste ordnance/stomp/terminal/loud et choisit par CE QUI devrait exploser), jamais au niveau de la catégorie. Si vous n'êtes pas sûr → 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> # specs
ffmpeg -ss <t> -i <video.mp4> -vframes 1 sample.png # à 20/50/80%
Lire les échantillons. Refuser si :
- Plusieurs intervenants / coupures franches (rendre chaque plan séparément, ou refuser)
- Pas de sujet humain (ce skill est pour les talking-head)
- Moins de 3 secondes, aucune parole, ou visage jamais clairement visible —
transcribe.cjsprévient lorsque l'audio est presque silencieux (Whisper hallucine des mots comme « Merci. » sur le silence) ; tenez-en compte et refusez plutôt que de légender des mots fabriqués - La source a déjà des légendes / sous-titres / 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 modifiée (pas de recouvrement/retouche). Le texte incrusté apparaît souvent seulement au milieu du clip : échantillonnez une planche contact à 1 ips (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), ne vous fiez pas à 3 images ponctuelles. - La transcription est défectueuse — la parole non native / avec un fort accent peut être transcrite en charabia assuré. Lisez
transcript.jsonde manière critique avant la rédaction ; si cela ne ressemble pas à une langue, essayezWHISPER_MODEL=mediumune fois, sinon refusez (un rail textuel de mots fabriqués est pire que pas de légendes). - Handheld agité avec mouvement rapide (le mat scintille)
Sondages de 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, coupez le clip avant la coupure.
- Sondage de boîte aux lettres / piliers. 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 cache de glyphe,180+→ texte opaque + cache (jamais de texte clair nu). Les modèles cinématographiques sont crème+écranet VERROUILLÉS — utilisez ce sondage pour choisir une identité adaptée (scènes lumineuses →ink, ou le thèmeanchorà rail opaque), jamais pour en recolorer une. - Recommandation d'identité par ton (vous recommandez ; l'utilisateur choisit — voir Étape 0 + CATALOG.md). explicatif / interview / mots à lire absolument → identités de surface rail/panneau ; poétique / social / « cinématographique » → identités de flux en colonnes par registre ; « 炸 / effets spéciaux / 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ésentez une shortlist et laissez l'utilisateur choisir.
Pipeline — 5 étapes
1. hyperframes init <project> --non-interactive --video <video.mp4> --skill=embedded-captions
2. bash scripts/prepare.sh <project> # matte ∥ transcrire (parallèle) → zones de sécurité. 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 <project> (compile + rend + fx de plaque)
4. node scripts/preview-frames.cjs <project> # ~2s/image aperçus composites → § QA visuelle (AVANT le rendu)
5. bash scripts/render-and-composite.sh <project> # portes → final.mp4 + historique/ instantané
(Mode Thème : SAUTER les étapes 3b/5 — render-theme.sh exécute déjà la compilation + rendu-et-composite
+ _postfx.sh ; le livrable est final_fx.mp4, final.mp4 est pré-réaction-de-plaque)
L'étape 1 d'init vérifie les skills installés par rapport aux dernières versions sur GitHub et met à jour l'ensemble global si l'un d'entre eux est obsolète.
L'étape 3 diffère selon le mode :
Étape 3 — Mode cinématographique (incrustation pure)
- Lisez
safe-zones.jsond'abord. Les plans de narration vont danszones.hugLeft/hugRight— des bandes nettes JUXTAPOSANT la silhouette (le texte loin du corps semble flottant, pas incrusté ; les coins éloignés sont la solution de repli, pas la valeur par défaut). Le héros se place par défaut surheroAnchor/heroBands.best(centré SUR le sujet, ~30–55% occulté).recommendation:"fg"déplace la NARRATION au premier plan pour la lisibilité ; le héros reste incrusté chaque fois queheroBands.feasible— héros en premier plan est le dernier recours. - L'ADN est l'identité que vous avez choisie à l'étape 0 (CATALOG.md) — ne rouvrez pas le choix ici. Vérifiez-le par rapport à la scène (luminance de la bande héroïque > 150 nécessite
ink; les conseils complets de choix se trouvent dans le catalogue, couvrant les dix incluant neon / glitch / chrome / velocity). Énoncez votre choix + pourquoi ; l'utilisateur décide. L'ADN verrouille le type/palette/mélange/mouvement + l'acte en trois parties du héros ; les zones de sécurité v2 (palette/optics/lighting) le paramètrent pour CETTE scène automatiquement. - Rédigez
<project>/cinematic.json—"dna": "<nom>"+ BLOCS de pensée, pas de groupes bruts : chaque bloc = lignes de mots (groupés 2–5 aux frontières de proposition) + le plan dans lequel il s'empile +csspar ligne (taille/poids/style uniquement — pas de positions) + au plus UNE ligne marquée"hero": true(le mot promu ;"text"pour la forme d'affichage). Schéma : en-tête descripts/make-cinematic.cjs. - Compilez :
node scripts/make-cinematic.cjs <project>— abaisse les blocs → plan.json → index.html. Généré pour vous : timings séquencés par transcription, accumulation au sein du bloc, page-flip entre les blocs, le VERROUILLAGE DU HÉROS (le pré-contexte du bloc héroïque, le HÉROS et le post-contexte s'empilent comme UNE composition liée centrée sur le sujet — ordre de lecture haut→bas = ordre parlé par construction ; le contexte flotte au PREMIER PLAN tandis que le héros s'incruste DERRIÈRE = le sandwich de profondeur ; une règle de masse garantit que le héros domine son contexte), séparation apex/héros mineur, ordre de lecture par construction, repli fg selon les zones de sécurité. Ensuite, les portes s'exécutent comme d'habitude. (La rédaction manuelle de plan.json reste possible pour les conceptions que les blocs ne peuvent pas exprimer — exécutez ensuitefill-timings.cjs+fit-fonts.cjs+make-composition.cjsvous-même.)
Étape 3 — Mode thème (constitution thématique)
Lisez themes/README.md EN PREMIER — registres de paradigmes/setpieces, liens, règles strictes et le schéma exact de theme.json.
- Choisissez un ADN de thème par registre de contenu (chaque
themes/<name>.jsonavoice+when). Énoncez votre choix + pourquoi ; l'utilisateur décide. - Rédigez
<project>/theme.json—dna,lines(textuel, ordre de la transcription ; 1…
… [tronqué pour la traduction]