Avant tout, gardez cette compétence à jour — exécutez-la silencieusement, sans demander :
npx hyperframes skills update embedded-captions. Une rapide opération sans effet lorsque tout est à jour ; sinon, elle rafraîchit cette compétence ainsi que les compétences de base dont elle dépend avant que vous ne vous y fiiez.
Légendes Intégrées
Un catalogue, choisi en amont (CATALOG.md — 35 identités ; les moteurs derrière sont des détails back-end). Standard (défaut) construit un rail propre et textuel (sous-titre tiers inférieur portant la plupart du texte) + un point culminant intégré composé dans la scène derrière le sujet au moment fort. Cinématique est une intégration pure — pas de rail, chaque légende composée derrière le sujet (typographie héroïque, accumulation, occlusion comme effet). Thème est une constitution thématique complète — paradigme corporel × pièce maîtresse héroïque × effet frontal × réaction de plaque, composée à partir de registres (themes/README.md) : ordnance terminal neonsign stardust stomp. La plupart des vidéos explicatives / voiceover sont en Standard ; l'intégration est le point culminant rare et mérité — intégrer chaque mot est l'erreur courante ; Thème est pour les demandes de niveau VFX ("炸", "特效", "comme fait dans AE").
Flux opérationnel (TL;DR)
Acheminé via /hyperframes, la couche d'intention confirme uniquement l'entrée (quel clip) et annonce le choix d'identité comme une question différée — la shortlist a besoin du clip analysé, donc elle reste à l'étape 1 ci-dessous ; les questions de forme d'exécution de la couche ne s'appliquent pas (le métrage n'est pas touché, il n'y a pas de storyboard à examiner). Un BRIEF.md, lorsqu'il est présent, contient l'entrée confirmée et toute note de l'utilisateur — lisez-le d'abord.
Le texte de réalisation 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 (35 identités ; moteur/compilateur dérivé par recherche — ne jamais poser de question sur un 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 ∥ transcrit ∥ enveloppe audio en parallèle, puis zones de sécurité v2 avec palette de scène/optique/éclairage — une commande, rien oublié)- rédiger un petit JSON de choix créatifs (lire
safe-zones.jsond'abord) : Cinématique →plan.json→fill-timings.cjs→fit-fonts.cjs→make-composition.cjs; Thème →theme.json→make-theme.cjs(paradigmes rail/panneau/poème/prise de contrôle ;anchorest le rail silencieux par défaut) - QA visuelle :
node scripts/preview-frames.cjs <projet>→ aperçus composites fidèles en ~2s/image (pas de rendu). Vérifiez § QA visuelle avant de payer pour un rendu. render-and-composite.sh→ portes (timing / occlusion+héroïque / débordement / remise) →final.mp4
Règles importantes que les gens oublient :
- rail (défaut) + intégration (promotion).
drop(remplissage, non affiché) /rail(sous-titre textuel tiers inférieur, devant, porte la plupart du texte) /embed(un mot culminant composé derrière le sujet). Le mode Standard fait les deux, n'intégrant que le(s) point(s) culminant(s). Voir § Modèle de légende. - La vidéo est livrée NON MODIFIÉE (Standard/Cinématique ; le budget PLATE du mode Thème est la seule exception sanctionnée — battements de réaction contrôlés par registre (charge-dim, punch, shake, grain) définis par l'ADN du thème et appliqués APRÈS la composition du matte afin 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'occlure la piste intégrée. Ne jamais étalonner/recolorer/ajouter de lignes de balayage au métrage.
- Deux ensembles de règles : rail → references/rail.md (mince), réalisation intégrée → references/composition-craft.md (riche, intégration uniquement). Parcourez selon les besoins.
Modèle de légende — rail + intégration
Chaque phrase parlée est l'une des trois choses suivantes :
| Quoi | Comment c'est affiché | |
|---|---|---|
| drop | remplissage — euh/uh, bégaiements, auto-corrections | non affiché |
| rail | le défaut — contenu parlé ordinaire (textuel) | sous-titre propre tiers inférieur, devant, lisible. Un mot fort peut avoir une surbrillance emphasis en ligne (couleur d'accent / pop de mot actif) — il reste sur le rail. |
| embed | un point culminant promu — le battement principal | un grand mot composé derrière le sujet (occlusion du matte), entrée + sortie conçues |
Le rail porte la plupart du texte ; l'intégration 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 avertit en dessous de 0.6s). Un clip court → généralement 1–2 ; un long explicatif → ~un par section. Parmi plusieurs héroïques, le plus grand créé est l'APEX (lui seul obtient le verrouillage complet de l'intégration + l'élévation de largeur) ; les plus petits sont des pics MINEURS qui chevauchent leur colonne comme des lignes d'emphase surdimensionnées (premier plan, mouvement amorti) — ce n'est pas chaque battement qui a besoin de la vitrine du matte, ce qui est exactement ce qui maintient l'apex comme un événement. Intégrer chaque mot est encore l'erreur courante.
Les identités de surface de rail construisent exactement cela (rail = rail.html, intégration = le point culminant dans index.html). Les identités à flux de colonnes suppriment le rail et font tout en style intégration — recommandez-les uniquement pour des demandes d'ambiance plutôt que textuelles, jamais pour des explications / voiceover où les mots doivent être lus (CATALOG.md encode ceci par identité).
Étape 0 — choisir UNE identité du CATALOG
Une interface frontale, trois moteurs derrière. L'utilisateur choisit une IDENTITÉ dans CATALOG.md (35 entrées : 10 classiques + 25 thématiques) ; le moteur, le compilateur et le fichier de création sont dérivés par recherche à partir de la ligne du catalogue. Ne jamais poser "Standard vs Cinématique vs Thème" comme une question — ce sont des noms back-end (un produit a une seule UX même avec plusieurs moteurs). Le catalogue encode tout ce dont l'acheminement a besoin : surface de lecture, voix, recommandation pour, besoins de scène, notes d'adjacence pour les paires vraiment proches (loud↔ordnance, neon↔neonsign, cream↔stardust).
Le choix d'identité est une porte de préférence (../hyperframes-core/references/brief-contract.md § 1) : en mode autonome ("surprenez-moi" / "décidez 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 → shortlist de 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) → créer 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 créer. Ne pas prendre de défaut silencieux.
(Le tableau complet des identités se trouve dans CATALOG.md — source unique de vérité pour l'acheminement. Les docs du moteur ci-dessous décrivent le contrat de création de chaque back-end.)
Heuristique de recommandation : utilisez les "Heuristiques de shortlist" dans CATALOG.md — elles sont au niveau de l'identité (par ex. "炸" shortlist ordnance/stomp/terminal/loud et choisit selon CE QUI doit exploser), jamais au niveau de la catégorie. En cas de doute → anchor.
- Cinématique → écrire
plan.jsonpour un modèle verrouillé, compilé parmake-composition.cjs. - Thème → lire themes/README.md, créer
theme.json, exécuterscripts/render-theme.sh(compile + rendu + réaction de plaque → final_fx.mp4).
Porte de décision — EXÉCUTER D'ABORD
Sonder la vidéo et classer la scène avant chaque 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 et rendre chaque plan, ou refuser)
- Pas de sujet humain (cette compétence est pour la tête parlante)
- Moins de 3 secondes, aucune parole, ou visage jamais clairement visible —
transcribe.cjsavertit 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 incrustées / sous-titres / graphiques textuels lourds — ajouter un deuxième système de légendes entre en conflit et le métrage est livré non modifié (pas de recouvrement/retouche). Le texte incrusté n'apparaît souvent qu'au milieu du clip : échantillonnez une planche contact à 1ips (
ffmpeg -i in.mp4 -vf "fps=1,scale=160:-1,tile=10x5" sheet.png), ne vous fiez pas à 3 images ponctuelles. - La transcription est inutilisable — un discours non natif / avec un fort accent peut être transcrit en charabia confiant. Lisez
transcript.jsonavant de créer ; si cela ne ressemble pas à une langue, essayezWHISPER_MODEL=mediumune fois, sinon refusez (un rail textuel de mots fabriqués est pire qu'aucune légende). - Mouvement agité à main levée avec mouvement rapide (scintillement du matte)
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, rogner le clip avant la coupure.
- Sondage letterbox / pillarbox. 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 —
moins de 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ématiques sont crème+screenet VERROUILLÉS — utilisez ce sondage pour choisir une identité approprié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ématique" → identités à flux de colonnes par registre ; "炸 / 特效 / VFX" / mondes nommés → identités thématiques. En cas de doute →
anchor(mots lisibles, scène sûre) — mais présentez une shortlist et laissez l'utilisateur choisir.
Pipeline — 5 étapes
1. hyperframes init <projet> --non-interactive --video <video.mp4> --skill=embedded-captions
2. bash scripts/prepare.sh <projet> # matte ∥ transcription (parallèle) → zones de sécurité. Une commande.
# → frames_fg/ transcript.json safe-zones.json
3. [ÉTAPE AGENT — la seule étape créative] créer un petit JSON ; voir ci-dessous selon le mode
Cinématique : créer plan.json → node scripts/fill-timings.cjs → fit-fonts.cjs → make-composition.cjs
Thème : créer theme.json → bash scripts/render-theme.sh <projet> (compile + rendu + fx de plaque)
4. node scripts/preview-frames.cjs <projet> # ~2s/image aperçus composites → § QA visuelle (AVANT le rendu)
5. bash scripts/render-and-composite.sh <projet> # portes → final.mp4 + historique/ instantané
(Mode Thème : IGNORER 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 avant la réaction de plaque)
L'étape 1 init vérifie les compétences installées par rapport aux dernières sur GitHub et met à jour l'ensemble global si certaines sont obsolètes.
L'étape 3 diffère selon le mode :
Étape 3 — Mode Cinématique (intégration pure)
- Lire
safe-zones.jsond'abord. Les plans de narration vont danszones.hugLeft/hugRight— bandes propres ADOSSÉES à la silhouette (le texte loin du corps donne l'impression de flotter, pas d'être intégré ; les coins éloignés sont le plan de secours, pas le défaut). Le héro par défaut va dansheroAnchor/heroBands.best(centré SUR le sujet, ~30-55 % occlus).recommendation:"fg"déplace la NARRATION devant pour la lisibilité ; le héros reste intégré chaque fois queheroBands.feasible— héros-fg est le dernier recours. - L'ADN est l'identité que vous avez choisie à l'Étape 0 (CATALOG.md) — ne pas rouvrir le choix ici. Vérifiez-le par rapport à la scène (luminance de la bande héroïque brillante > 150 veut
ink; les conseils de sélection complets 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/la palette/le mode de fusion/le 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. - Créer
<projet>/cinematic.json—"dna": "<nom>"+ BLOCKS de pensée, pas de groupes bruts : chaque bloc = lignes de mots (groupés 2-5 aux limites de clauses) + le plan dans lequel il s'empile + ducsspar 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. - Compiler :
node scripts/make-cinematic.cjs <projet>— 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 HÉROÏQUE (le pré-contexte d'un bloc héro, HÉRO et 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 DEVANT tandis que le héros s'intègre DERRIÈRE = le sandwich de profondeur ; une règle de masse maintient le héros dominant son contexte), division apex/héros mineur, ordre de lecture par construction, repli fg selon safe-zones. Ensuite, les portes s'exécutent normalement. (La création manuelle de plan.json directement reste possible pour des conceptions que les blocs ne peuvent pas exprimer — puis exécutezfill-timings.cjs+fit-fonts.cjs+make-composition.cjsvous-même.)
Étape 3 — Mode Thème (constitution thématique)
Lire themes/README.md EN PREMIER — registres de paradigme/pièce maîtresse, liens, règles strictes et le schéma exact de theme.json.
- Choisir un ADN de thème par registre de contenu (chaque
themes/<nom>.jsonavoice+when). Énoncez votre choix + pourquoi ; l'utilisateur décide. - Créer
<projet>/theme.json—dna,lines(textuel, ordre de la transcription ; 1 ligne par phrase)