Que fait one-take ?
Demandez tout en une fois. Puis réalisez le film complet, dans chaque format, vérifié, sans plus de questions.
Ce skill orchestre ; HyperFrames effectue le rendu. Il a besoin des skills HyperFrames (hyperframes, hyperframes-core, hyperframes-animation) et est meilleur avec hyperframes-registry, hyperframes-keyframes, media-use, figma et humanizer. Si hyperframes-core est absent, arrêtez-vous et donnez la ligne d'installation : npx skills add heygen-com/hyperframes.
SKILL_DIR ci-dessous signifie le dossier de ce skill. Les scripts sont du Node standard (≥ 22) plus ffmpeg, sans installations.
Le contrat
- Un seul tour de saisie. Détectez d'abord, puis demandez une fois (Phase 1). Après les réponses, ne demandez plus rien. La seule exception est un blocage dur que vous ne pouvez pas contourner par défaut, comme un fichier qui n'existe pas ou un site qui refuse de se charger. Alors posez cette question précise et continuez.
- La réponse de saisie autorise les rendus. Elle n'autorise pas la publication, la mise en ligne, le post, le push ou le téléchargement de quoi que ce soit que l'utilisateur n'a pas nommé. Demandez-les séparément, après le rapport.
- Les faits sont calculés, jamais saisis. Chaque nombre à l'écran provient du fichier
facts.jsonou d'une source donnée par l'utilisateur. N'inventez jamais de statistiques, citations, logos ou témoignages. - L'image écrit le son. Chaque mouvement qui doit être entendu appelle
T.cue()au moment où il se produit. La partition est construite à partir de ces indices, donc le son et l'image ne peuvent pas dériver. - Terminé signifie QA validé. Un fichier est livré lorsque
qa.mjsle valide, ou lorsqu'un échec est documenté dans le rapport avec la raison pour laquelle il n'a pas pu être corrigé en deux passes.
Phase 0 : détection (silencieuse, avant de demander)
node SKILL_DIR/scripts/detect.mjs <chemins des sujets…> --out /tmp/one-take-detect.json
- Lancez-la sur le dépôt actuel et tout chemin ou site mentionné par l'utilisateur.
- Elle retourne, par source : titre et tagline du README, intervalle git et nombre de commits, logos, fichiers de polices et familles, jetons de couleur. Elle retourne aussi la chaîne d'outils : node, ffmpeg, version en cache de
hyperframes, Chrome, heygen CLI, et si les clés d'API de musique sont définies. - Si
take.jsonexiste déjà dans le projet cible, c'est une reprise. Lisez-le, ignorez la saisie, et continuez à partir de la première phase dont la sortie est manquante.
Phase 1 : la saisie (un message, un tour)
Lisez references/intake.md. En un message :
-
Montrez la feuille de saisie : chaque champ pré-rempli à partir de la détection ou d'une valeur par défaut recommandée, chacun sur une ligne. L'utilisateur ne modifie que ce qui est erroné.
-
Appelez AskUserQuestion une fois avec les quatre décisions qui changent le plus le travail : formats (sélection multiple), durée, son, et voix/sous-titres. Le texte de la question leur dit d'ajouter toute modification de la feuille comme une note sur n'importe quelle réponse.
Si AskUserQuestion n'est pas disponible, mettez les quatre mêmes choix numérotés à la fin de la feuille et demandez une seule réponse.
Ensuite, sans demander à nouveau :
- Écrivez
take.json(schéma :references/take-json.md). Les codes de langue, les identifiants de format, le slug etoutput.namedoivent correspondre à[a-z0-9][a-z0-9._-]{0,63}(casse quelconque, pas de..), sinon le processus s'arrête. Ne mentionnez pashyperframessauf si l'utilisateur le demande : la version par défaut est épinglée dansscripts/lib/platforms.mjs(HF_VERSION, 0.8.223). - Écrivez un
BRIEF.mdHyperFrames avecworkflow: general-video,flow: automation,storyboard: no. Cela signifie qu'un futur appel/hyperframesreprendra ce projet au lieu de ré-interviewer. - Enregistrez les réponses dans le corps de BRIEF.md : formats, son, sous-titres, limites de plateforme.
Phase 2 : sources
- Faits git. Lancez
node SKILL_DIR/scripts/facts.mjs --repo <chemin> [--repo …] [--since …] --out <projet>/facts.json. Cela collecte les commits, l'intervalle, les jours actifs, la plus longue série, le jour le plus chargé, les lignes par langage, les lignes ajoutées et supprimées, et les mots les plus fréquents des commits, ainsi que l'objet du premier et du dernier commit. Les noms d'auteurs et les e-mails ne sont jamais enregistrés. Utilisez uniquement les faits que l'utilisateur a autorisés. - Sites. Pour montrer une URL, lancez
npx hyperframes capture <url> -o <projet>/src/assets/cap. Arrêtez-vous surok:falseouBLOCKED.md: c'est un blocage. - Références. Pour chacune, écrivez une ligne dans STORYBOARD.md sur ce que vous en tirez : rythme, type, couleur, une transition. Pour un lien Figma, lancez
/figmad'abord. - Marque. Copiez le logo SVG et les fichiers de polices dans
src/assets/brandetsrc/assets/fonts, déclarez-les danstake.jsonsousfonts, et extrayez les jetons de couleur dans la racine:rootdu template.
Phase 3 : direction et storyboard
Lisez references/direction.md avant d'écrire quoi que ce soit de visuel. Écrivez STORYBOARD.md :
- Direction, un paragraphe : l'idée maîtresse, le mouvement signature, l'association de types, la palette, la référence d'où vient chaque choix.
- Tempo en premier. Choisissez le bpm pour que la durée cible soit un nombre entier de mesures (4/4). Donnez ensuite à chaque scène une longueur en mesures, une
energy(0–1, qui pilote l'arrangement de la partition), et comment elle entre (in). - Tableau des scènes : id, mesures, énergie, ce qui est à l'écran, mouvement, indices, texte.
- La dernière scène est l'end-card,
end: true, avec assez de mesures pour la maintenir complète pendant 3 s ou plus. - Marquez les scènes qui peuvent aller dans un cutdown par
optional(1–9, plus grand va en premier).
- La dernière scène est l'end-card,
- Le texte va dans
copy/<langue>.json, une clé par ligne de texte. Passez-le par/humanizersi disponible. Gardez les titres assez courts pour être lus deux fois dans le temps où ils sont à l'écran.
Phase 4 : construction
- Copiez
SKILL_DIR/templates/index.htmldans<projet>/src/index.htmlet réécrivez ses scènes à partir du storyboard. - Lisez
references/kit.md(l'APIT.*) et les règles non négociables dehyperframes-core. Pour le mouvement, lisez les règles et les blueprints dehyperframes-animation. Avant de construire manuellement un effet nommé, cherchez danshyperframes-registry.
Règles qui maintiennent chaque format et la QA honnêtes :
- Les scènes sont des
<section class="clip scene" data-scene="id">de premier niveau, jamais imbriquées, jamais avecstyleen ligne. - Taille en px de conception via
--u(1% du petit côté). Le texte lisible n'est jamais en dessous de--t-min(3,4u ≈ 37 px à 1080). - Gardez le texte lisible à l'intérieur de
.safe, les bandes UI de la plateforme pour ce format. - Ré-ageneez par format avec les règles
.f-tall,.f-wide,.f-square,.f-portrait, pas en mettant à l'échelle une seule disposition. - Effacez les mots d'une scène avant que la transition de la scène suivante ne les couvre (
T.sink/T.leaveprès des.end). Le texte sous une révélation échoue à la vérification de disposition. - Chaque scène bouge :
T.driftla caméra dessus. Rien ne reste immobile avant l'end-card. T.endCard(t)au moment où l'end-card est complète. La dernière image doit encore la montrer : pas de fondu au noir sur le maintien.- Indicez tout ce qui doit être entendu (
references/sound.mdliste les catégories). La plupart des helpers du kit indicent par défaut ; passezcue: falsepour garder un moment silencieux. - Les nombres proviennent de
T.factsou du texte.T.counta besoin d'un nombre fini et lève une exception sans lui, donc un fait manquant arrête la sonde au lieu de mettre un nombre inventé à l'écran. - Terminez le script avec
window.__timelines["main"] = T.done();.T.done()enregistre la timeline une fois, après que chaque tween a été ajouté, et le template la répète dans cette ligne. Construisez d'abord tous les tweens, pas à l'intérieur d'un callback asynchrone (font-ready ou autre) : le linter HyperFrames rejette un enregistrement précoce.
Phase 5 : passe de brouillon
node SKILL_DIR/scripts/run.mjs <projet> --draft
Ceci exécute, par format × langue : construction → sonde (indices, tailles de texte, marque d'end-card à partir de Chrome headless) → partition → hyperframes check → rendu brouillon → encodage → QA → REPORT.md.
HyperFrames s'exécute à la version épinglée comme HF_VERSION dans scripts/lib/platforms.mjs (0.8.223), ou à hyperframes depuis take.json. Le premier lancement le récupère avec npx, et la construction récupère GSAP 3.14.2 une fois depuis jsDelivr dans ~/.cache/one-take/. Le fichier GSAP est vérifié par rapport à un sha256 épinglé après le téléchargement et chaque fois qu'il est lu depuis le cache. Un fichier qui ne correspond pas n'est jamais utilisé : un mauvais téléchargement n'est pas mis en cache, et un mauvais fichier en cache est supprimé et la construction s'arrête. Relancez-la pour récupérer une copie fraîche.
Ensuite :
- Ouvrez chaque contact sheet
*.sheet.jpget regardez-la. - Lisez
REPORT.md. - Corrigez les échecs et tout ce qui semble incorrect : chevauchements, recadrages, images mortes, texte trop petit, une coupe qui ne tombe pas bien.
Il y a au maximum deux passes de correction. Chacune relance run.mjs --draft ; utilisez --only <format>-<langue> pour relancer uniquement ce qui a changé.
Phase 6 : final
node SKILL_DIR/scripts/run.mjs <projet>
Ceci est le rendu qualité intégrale de chaque sortie. Les livrables atterrissent dans renders/ (ou output.dir). Chaque sortie obtient :
<nom>.mp4: x264 CRF 12, AAC 320k, faststart.cover.jpg: l'end-card.sheet.jpg.qa.json
Les stems de la partition et marks.json sont conservés dans out/<format>-<langue>/score/.
Phase 7 : rapport
Répondez avec :
- le tableau des sorties de
REPORT.md(fichier, taille, durée, verdict) - la contact sheet du format principal
- une ligne sur le son
- les points ouverts, s'il y en a
Proposez les étapes suivantes sans les exécuter : poster le texte, plus de langues, un cutdown, publication. Rien n'est posté ou poussé sauf si l'utilisateur le demande.
Modes sonores
sound.mode | Ce qui se passe |
|---|---|
score (par défaut) | score.mjs synthétise le tapis, la bande et la batterie à partir des énergies de scène sur la grille de mesures : plan d'accords à partir de mood et key, sidechainé sur la grosse caisse, crescendos dans chaque montée, un impact sur chaque arrivée. Le stem fx est construit à partir des indices, accordé à l'accord sous chacun et panoramisé depuis l'endroit où il se produit à l'écran. Mixé, limité, puis loudnorm en deux passes vers lufs (par défaut −14) avec true peak −1,5. Original, donc rien à licencier. |
track | Le fichier de l'utilisateur. Obtenez le bpm et le premier temps avec score.mjs --analyze <fichier> (ou npx hyperframes beats), définissez bpm à cette valeur et placez les scènes sur ses mesures. Le stem fx joue par-dessus. |
library | /media-use resolve --type bgm (nécessite la CLI heygen) ou ses générateurs. Le résultat est utilisé comme track, et sa licence est enregistrée dans sound.licence. |
none | Aucun élément audio du tout. |
Pour une voix-off, placez-la dans src/assets/audio/vo.wav, provenant de Kokoro via npx hyperframes tts ou de l'enregistrement de l'utilisateur. La partition creuse la musique en dessous (duckDb, par défaut −9). Pour les sous-titres, chronométrez-les à partir de npx hyperframes transcribe vo.wav --model <modèle>. Les sous-titres incrustés sont du texte de scène placé à l'intérieur de .safe à --t-cap ou plus. Pour les sous-titres sidecar, écrivez <nom>.srt à partir du même transcript à côté de chaque sortie.
Fichiers
scripts/detect.mjs,facts.mjs: ce qui est là, et les nombresscripts/build.mjs: une source → projets HyperFramesout/<format>-<langue>/. Remplit les tailles, les bandes de sécurité et le timing des scènes, intègreTAKE(texte, faits, scènes), fournit le kit et GSAP 3.14.2 (vérifié sha256), supprime les scènes pour les cutdownsscripts/probe.mjs: passe Chrome headless qui lit les indices, les tailles et positions de texte dans le temps, et les marquesscripts/score.mjs: partition synthétisée, stems, mix, master,marks.json;--analyzepour le tempo d'une pistescripts/encode.mjs,qa.mjs,report.mjs,run.mjs: livraison, vérifications, rapport, et l'exécution complètescripts/selftest.mjs: vérifie la chaîne d'outils, puis prouve que la QA échoue sur un fichier construit pour échouerscripts/lib/: helpers partagés (git, plateformes avecHF_VERSIONet la vérification de nom, WAV, DSP)kit/take.js: le kit de mouvement (references/kit.md)templates/index.html: la scène de départreferences/:intake.md,take-json.md,direction.md,sound.md,formats.md,qa.md,kit.md