scrapbook-editor : une prise brute devient une courte vidéo scrapbook
L'utilisateur fournit une prise verticale d'eux-mêmes en train de parler. Ce skill supprime chaque silence, puis transforme le cadre en un scrapbook que le locuteur traverse, coupé comme le ferait un motion designer dans After Effects : le titre de la référence en deux polices (mots blancs, le mot important dans une belle police serif en couleur, un trait sur du papier) et des stickers sur l'accroche, les mèmes de réaction d'Internet déposés sur leur visage sous forme de polaroïds, des bouts de papier pour les titres et les mots très importants seulement, le marqueur rouge qui dessine pendant qu'ils parlent, des stickers pour ce qu'ils listent, les écrans réels qu'ils nomment, des sous-titres en bas du cadre mot par mot, un fond musical, et un son pour chaque élément qui se pose.
Le style est VALIDÉ (l'utilisateur, 2026-10-05) : reproduisez-le exactement. § Le langage scrapbook (ci-dessous le pipeline) est l'apparence de la coupe validée (workspace/videos/scrapbook-dev-sales.mp4, son plan : example/plan.mjs) : les mêmes figures, aux mêmes tailles et endroits, avec les mêmes polices, papier, mouvement, sons et niveaux, sur n'importe quelle prise. Il a commencé comme la MESURE d'un montage réel (une vidéo liste de 72,7 s, « 7 compétences Claude », montée par l'utilisateur pour un client : example/README.md en est l'anatomie complète) et a nécessité six relectures pour se stabiliser (§ Les décisions de l'utilisateur). init.sh le génère ; n'inventez jamais un autre aspect, ne variez jamais un élément que l'utilisateur n'a pas demandé à varier.
Ce skill fonctionne sur le moteur du skill short-editor. Sa transcription, son rendu, son mixage, ses aperçus, sa construction et sa vérification sont les mêmes fichiers : lisez ../short-editor/SKILL.md § Prérequis, § Où se trouvent les choses et § 4 à § 6 une fois ; ils s'appliquent ici tels qu'écrits, et ce fichier ne dit que ce qui diffère. Lisez avant la première coupe, à chaque exécution :
scripts/example/README.md: le montage de référence, battement par battement, et la coupe de développement../../references/pitfalls.md§ Transcription et sous-titres, § Méthode de travail : les pièges avec lesquels un montage est écrit (ses autres sections quand leur étape arrive : § Audio avant un son mesuré à la main, § ffmpeg et § Le shell avant une commande de votre crû ; les outils du moteur suivent le reste)
Lisez quand l'étape le nécessite : ../../references/audio-spec.md au niveau des niveaux (la norme de loudness, comment un niveau est mesuré tel qu'entendu). Les chiffres du moteur : node plugins/video/skills/short-editor/scripts/api.mjs <module> [figure], jamais leurs sources.
Je ne peux pas regarder la vidéo ni l'écouter. Où se trouve une pause, où est le visage, à quel niveau sonore un atterrissage se produit : chacun est une mesure (
tighten.py,face.mjs,measure.mjs), puis un coup d'œil sur les images composites (preview.mjs) et sur un moment en mouvement image par image (build.sh --slice).verify.mjsse tient entre « c'est prêt » et un fichier cassé. Ne l'ignorez jamais.
Tous les chemins ci-dessous sont relatifs à la racine du dossier GTM by Pipecorn. $K signifie plugins/video/skills/scrapbook-editor/scripts (ce skill), $E signifie plugins/video/skills/short-editor/scripts (le moteur). Exécutez les deux par leur chemin absolu.
Prérequis (vérification préliminaire : à vérifier avant tout travail)
Ceux du moteur : ffmpeg + ffprobe dans le PATH (brew install ffmpeg) et python3 (Xcode Command Line Tools) sont requis et non installables depuis ici ; arrêtez-vous et dites la commande si l'un manque. Tout le reste se provisionne tout seul : $K/py.sh exécute le bootstrap.mjs du moteur (paquets node, l'environnement virtuel speech-to-text avec numpy) ; init.sh récupère les trois polices (Archivo, Fraunces et l'écriture manuscrite du papier, Gochi Hand par défaut : Google Fonts, OFL) dans le dossier assets/fonts/ du projet (ou les trouve dans ~/Library/Fonts), et sounds.mjs récupère les sons de papier (huit enregistrements Mixkit, une fois par machine, dans plugins/video/assets/sfx/paper/, jamais commités : la licence Mixkit les autorise dans les vidéos, pas leur redistribution), préparés et mesurés dans le dossier assets/sfx-paper/ du projet, et copie le pack Motionix de l'étagère (plugins/video/assets/sfx/motionix/, préparé par le style explainer ; licence non précisée dans le pack : voir son README avant toute publication) dans assets/sfx-motionix/. Rien n'est installé au niveau système.
Optionnel, et dit quand il manque (jamais bloquant) :
swiftc(Xcode Command Line Tools) :face.mjstrouve le visage avec Apple Vision, donc un polaroïd atterrit DESSUS et les stickers se tiennent AUTOUR de la tête. Sans cela, lisez le visage sur une image de prévisualisation et définissezfacedans project.json ({x, y, w, h}, fractions du cadre).GIPHY_API_KEYdans.env.local: les vrais GIF de réaction du style validé (gif.mjs). Gratuit : developers.giphy.com → Créer une application → API (pas le SDK que GIPHY recommande : le SDK est pour les applications affichant le sélecteur propre à GIPHY ;gif.mjsappelle l'API), 100 appels par heure, largement suffisant pour un montage. Sans cela : un GIF fourni par l'utilisateur (media.mjs), ou une image de réaction générée ; dites-le.GEMINI_API_KEYdans.env.local: les illustrations générées et les images de réaction (picture.mjs, Nano Banana 2, environ 0,07 $ chacune à 1K).- Google Chrome (ou Chromium, Brave, Edge) dans /Applications : une capture d'écran d'une page PUBLIQUE que le locuteur nomme (
capture.mjs), quand l'utilisateur n'a pas sa propre capture.
Où se trouvent les choses
Comme le dit le moteur, et uniquement de cette manière : un répertoire de travail par montage, workspace/projects/<slug>/, un slug qu'aucun autre projet n'a ; le fichier final workspace/videos/<slug>.mp4 ; jamais les fichiers d'un autre projet, même de la même prise ; les fichiers temporaires dans le dossier tmp/ du projet, jamais dans /tmp. Le dossier scripts/ du skill reste en lecture seule. Les images d'un montage vivent dans son dossier assets/media/.
Le pipeline
0. Configurer le répertoire de travail
$K/init.sh workspace/projects/<slug> <source.mp4> workspace/videos/<slug>.mp4
L'échafaudage du moteur (project.json lu depuis le fichier, subs.config.json, cut.mjs), puis le plan.mjs et edl.mjs de ce skill (chaque figure du langage, commentée, prête à être remplie), les clés du langage dans project.json (style: "scrapbook", accent, captionKeep), le visage, et les sons, calibrés sur la voix de cette source (voiceM, la médiane momentanée de la voix, et sfxMasterDb à 0 : chaque rôle est ensuite défini en LU sous la voix, tel qu'entendu). Exécutez chaque commande ultérieure depuis ce répertoire.
0.2. Demander d'abord, en UNE question
Ces éléments appartiennent à l'utilisateur et ne peuvent pas être devinés ; regroupez-les en une seule AskUserQuestion :
- La musique. Un fond par défaut (la troisième relecture : « ça mériterait de mettre une musique de fond ») : proposez d'abord Hip Hop 02 (Mixkit, Lily J : celle de la coupe validée, le défaut du style ; la licence Mixkit l'autorise dans une vidéo publiée), puis Convergence (le morceau maison des autres styles), le reste de l'étagère (
plugins/video/assets/music/, son README), puis « Pas de musique ». Pour choisir à l'oreille, un tableau (les mêmes 12 s avec chaque morceau, tous au même niveau) :node $K/music-board.mjs --to 12 mixkit-hip-hop-02-738.mp3@0 [email protected] …après une construction (il remet le fond du projet à la fin). Il va à 15 LU sous la voix ($K/music.mjs, § L'apparence). Dites une fois que les morceaux qui ne sont pas Mixkit (Convergence, ridgeclub) peuvent bloquer la monétisation de la vidéo. - La couleur de la marque (project.json
accent;wordColorpour le mot important s'il doit différer ; l'accent de Votre marque quand elle est définie,workspace/brand/, voirplugins/video/references/brand-kit.md§ Votre marque, définie une fois) : LE mot important en Fraunces et le mot de sous-titre en cours de prononciation. Jaune #FFD43B par défaut (celui de Pipecorn). Vérifiez-le sur la prise : il se détache sur les cheveux, la peau et les murs (sur la prise de développement, le corail et l'orange disparaissaient dans les cheveux et le visage du locuteur, le jaune se lisait partout). Et les noms que les sous-titres doivent écrire tels quels (captionKeep: la marque, le produit, les personnes, « Station F »). - Le matériel réel : captures d'écran ou enregistrements d'écran de ce qu'ils nomment (leur produit, un dépôt, une page), leurs logos. Sans cela, les pages publiques sont capturées (
capture.mjs) ; un écran privé n'est jamais inventé. - Le générique Pipecorn : un BONUS de chaque style, demandé CHAQUE FOIS, jamais activé par défaut (
plugins/video/references/pipecorn-generic.md) : environ 6 s tout à la fin, Pipecorn, puis ses valeurs se remplaçant l'une l'autre dans un seul emplacement, puis Pipecorn à nouveau, sans musique. Non · Oui, avec quelles valeurs (1 à 4 ;node $E/generic.mjs --list; par défaut couverture téléphonique, taux de connexion, pipeline). - Votre voix améliorée : un BONUS, demandé CHAQUE FOIS, jamais activé par défaut (
plugins/video/references/voice-clean.md) : l'isolateur vocal d'ElevenLabs supprime l'écho de la pièce et le bruit de la prise. Non · Oui, améliorez ma voix. Il nécessite le connecteur ElevenLabs : sans clé, dites en une ligne qu'il existe (Paramètres › Connecteurs › Ajouter une clé) et continuez. Sur un oui, avant l'étape 1 :node plugins/video/motion/voice.mjs clean <source>, puis project.json ›sourceest<…>-voice.<ext>(même longueur, image inchangée).
Exécutez depuis la page GTM by Pipecorn, le brief du premier message y répond ; ne demandez pas à nouveau.
1. Transcrire, mot pour mot
$E/transcribe.sh --lang en # la langue EFFECTIVEMENT PARLÉE ; jamais traduite
words.json, sur l'horloge de la prise BRUTE. Si la prise est une série d'essais (la même phrase tentée plusieurs fois), assemblez-la d'abord avec rough-cut.mjs du moteur (short-editor/SKILL.md § 0.7), puis transcrivez l'assemblage. Ensuite node $E/words.mjs (celui du moteur) : words-fixed.json, le début de chaque mot déplacé d'un silence vers la voix et sa vraie fin avant une pause, les mots douteux listés ; words.mjs env|end|say pour en lire un (short-editor/SKILL.md § 1). Jamais de script personnalisé pour cela.
2. Couper chaque silence : les jumps cuts
$K/py.sh tighten.py --dry-run # ce qui serait coupé
$K/py.sh tighten.py # source/tight.mov ; project.json, words.json, shots.json mis à jour
$K/py.sh tighten.py --keep 0.10 --min-pause 0.16 # les valeurs par défaut, mesurées sur la référence
Chaque silence de 0,16 s ou plus disparaît, jusqu'à 0,10 s à la jonction (0,06 s après le dernier son, 0,04 s avant le suivant) ; le silence de début et de fin aussi. Sur la référence, aucune pause restante ne dépasse 0,32 s, et une jonction intervient environ toutes les 2 à 3 s : le locuteur ne respire jamais à l'écran. Chaque jonction est un jump cut : pas de fondu, pas de whoosh ne la cache ; la caméra la marque en alternant le cadre large / serré SUR la coupe (§ L'apparence).
L'arrêt de la parole est MESURÉ (une enveloppe de 10 ms, hystérésis à room + 12 / room + 5 dB), jamais lu à partir du chuchotement de Whisper. Les débuts de Whisper sont vérifiés par rapport à cela : un début à l'intérieur d'un silence mesuré avec un son doux en dessous (room + 9 dB) arrête la coupe 50 ms avant ; un début dans le bruit ambiant est un chuchotement précoce (c'était le cas, de 0,35 s, trois fois sur la prise de développement) et se déplace là où la parole commence. Les deux sont signalés.
Les tronçons conservés sont écrits une fois dans source/tight.mov, en images entières (l'image et la voix de chaque tronçon durent exactement aussi longtemps : non raccordée, 13 jonctions ont mis les lèvres deux images derrière la voix), à la profondeur de bits de la source avec ses marqueurs de couleur (jamais de re-étalonnage). Ensuite, comme le fait rough-cut.mjs --adopt du moteur, project.json pointe vers lui (source ; la prise reste dans rawSource), words.json est placé sur son horloge (la transcription de la prise reste dans words.raw.json), et shots.json liste les plans entre les jonctions. Pas les cuts à la volée du moteur : un projet avec des cuts ne peut pas être rendu par tranches, et les tranches sont la façon de regarder un moment en mouvement. tighten.py repart toujours de la prise, donc l'exécuter deux fois est sûr ; une coupe souhaitée par le locuteur (une reprise, un bafouillage) va dans project.json manualCuts (secondes de la prise), puis tighten.py à nouveau.
Un changement de SCÈNE à l'intérieur de la prise (un plan teaser à la fin, une autre pièce) n'est pas dans shots.json : trouvez-le là où la luminosité du cadre saute (ffmpeg … signalstats YAVG image par image) et donnez-le au plan (SCENE) : la caméra passe en large là et le papier le balaie.
3. Où se trouve le visage
node $K/face.mjs # assets/faces.json, 5 par seconde, sur la chronologie de SORTIE
Apple Vision, à travers les coupes. Le plan le lit via la caméra (faces(P, camera(STEPS))) : F.slot() est l'endroit où TOUS les polaroïds de la vidéo atterrissent (la ligne centrale du cadre, 0,08 sous le centre médian du visage, 0,44-0,50 : le milieu de l'écran), F.faceLine() la propre ligne du visage (son centre médian, 0,36-0,50) pour les idées clés et les phrases choc écrites sur le visage, F.top(t) la hauteur au-dessus de la tête pour les mots-clés, F.around(t0, t1, n) des emplacements autour de la tête, F.over(t0, t1) la boîte du visage. Réexécutez-le après chaque tighten.py.
4. Lire la transcription et décider des images : l'étape de jugement
Lisez toute la prise et donnez-lui la densité de la référence : une nouvelle chose à l'écran toutes les 1 à 3 s (la référence : 50 figures en 72,7 s ; la coupe de développement : 49 en 47,1 s). Par phrase, choisissez la figure qui la dit, depuis § L'apparence :
- l'accroche (la première phrase) : le titre dans les trois lignes de la référence (une ligne blanche ; LE mot de la promesse en couleur avec des mots blancs à côté ; un trait sur du papier) et des autocollants autour de la tête si la phrase liste ou implique des rôles, des outils, une équipe ;
- un sentiment, un coût, un échec, une exagération, une comparaison : un vrai GIF de réaction en polaroïd (la coupe validée : Pepe Silvia pour « chercher parmi des milliers de plateformes », Key & Peele en sueur pour « pour être honnête, je ne suis pas le meilleur », Buddy the Elf au téléphone pour « quoi dire lors d'un appel », « Let's get ready to rumble » pour « versus »), sa légende sur le menton, quatre ou cinq dans une courte vidéo ;
- une liste dite en passant (« le bon, la brute, le truand… ») et les apartés (un endroit, « une série », « restez à l'écoute ») : des stickers, un par mot (le papier n'est PAS sur chaque mot-clé : les sous-titres disent déjà les mots, « l'effet papier est pour les titres et les phrases très importantes, pas pour chaque mot ») ;
- les écrans réels (un produit, un site, une fonctionnalité) : une capture ou une photo ;
- les idées clés (le point principal de la vidéo, un terme technique) : les mots écrits sur le visage (
key_ideas, § L'apparence) ; - les phrases importantes et les titres de section : un bout de papier qui atterrit, se déplie, respire et se replie (
paper, § L'apparence) ; - la conclusion : le bout de papier de l'accroche, ou les mots sur le visage, ou un polaroïd, selon son ton.
N'inventez pas une figure que la référence n'a pas. Lisez d'abord le plan de référence (scripts/example/plan.mjs) pour connaître ses figures, puis écrivez l'EDL (edl.mjs) pour le plan ; plan.mjs le compile.
5. Le plan
node $K/plan.mjs # plan.json, chaque mot de la transcription assigné à une figure
plan.mjs (documenté en tête : $K/plan.mjs --help) lit words-fixed.json et shots.json, chronologie de sortie, et écrit plan.json. Il s'occupe du minutage (la figure commence au MOT du tour, son animation dure une durée ajustée à la parole suivante quand il a une queue, la même queue est la fenêtre de réaction du polaroïd). Il utilise $K/edl.mjs : le plan est une liste d'objets figures, chaque figure par son nom (§ L'apparence et api.mjs figures), et son propre dialogue et sons. Il s'assure également que les sous-titres sont prêts ($E/subs.mjs du moteur).
6. Collecter le matériel réel
node $K/media.mjs # assets/media/, télécharge ou signale ce qui manque d'après plan.json
Les GIF (gif.mjs), les captures (capture.mjs), les images générées (picture.mjs), les logos de marque (depuis workspace/brand/), et les images téléchargées par l'utilisateur (depuis le dossier du projet media/). media.mjs les assemble dans assets/media/.
7. Construire
node $E/build.sh # construit le fichier final dans workspace/videos/
Utilise le moteur de rendu de short-editor. Ensuite node $E/verify.mjs pour vérifier que tout est correct.
L'apparence (le langage scrapbook)
Ce qui suit décrit chaque figure du langage scrapbook, avec ses paramètres, ses animations et ses sons. Tous les chiffres sont mesurés sur la coupe validée et ne doivent pas être modifiés sauf indication contraire de l'utilisateur.
Accroche
- Texte : le titre en trois lignes : une ligne blanche (Archivo, blanc), LE mot de la promesse en couleur (Fraunces, jaune) avec des mots blancs à côté, un trait sur du papier. Le tout centré en haut de l'écran.
- Animation : les trois lignes apparaissent l'une après l'autre, de haut en bas, avec un léger fondu.
- Son : un bruit de papier léger pour chaque ligne, un son de « pop » pour le mot en couleur.
Polaroïd
- Taille : 0,80 de la largeur de l'écran.
- Position : au milieu de l'écran, toujours au même endroit (0,44-0,50 de la hauteur).
- Animation : atterrit avec un effet de chute, puis reste quelques secondes, puis est chassé avec un effet de balayage.
- Son : un bruit d'atterrissage, un bruit de chasse.
Sticker
- Taille : 0,15 x 0,15 de l'écran.
- Position : autour de la tête du locuteur, déterminé par
face.mjs. - Animation : apparaît avec un effet de zoom, reste fixe, puis disparaît avec un effet de zoom inverse.
- Son : un bruit de colle ou de déchirure.
Papier
- Texte : le titre ou la phrase importante, écrit à la main (Gochi Hand), sur un fond de papier quadrillé.
- Animation : atterrit, se déplie, respire (légère ondulation), se replie et disparaît.
- Son : un bruit de papier pour le dépliage, le pliage.
Mots sur le visage
- Texte : les mots-clés ou les idées clés, écrits en blanc sur le visage du locuteur.
- Position : déterminée par
face.mjs, généralement au-dessus de la tête ou sur le côté. - Animation : apparaît avec un fondu, reste fixe, puis disparaît avec un fondu.
- Son : aucun.
Réaction GIF
- Source : GIPHY, via
gif.mjs. - Taille : 0,80 de la largeur de l'écran.
- Position : au milieu de l'écran.
- Animation : atterrit comme un polaroïd, avec un effet de chute et quelques secondes de pause, puis est chassé.
- Son : un bruit d'atterrissage, un bruit de chasse.
Sous-titres
- Position : en bas de l'écran, centrés.
- Style : texte blanc avec un fond noir semi-transparent, trois mots à la fois.
- Animation : apparaît avec un fondu au début de la parole, disparaît avec un fondu à la fin.
- Son : aucun (mais le son de la voix est bien sûr présent).
Annexe : commandes de développement
$K/music-board.mjs --to <durée> <fichier1>@<offset> <fichier2>@<offset> …: crée une table de mixage pour choisir la musique à l'oreille.node $K/music.mjs: ajoute la musique de fond au projet.node $K/captions.mjs: génère les sous-titres animés.node $K/effects.mjs: ajoute les effets sonores et visuels.$K/py.sh tighten.py --dry-run: montre ce qui serait coupé sans effectuer la coupe.$K/py.sh tighten.py --keep <secondes> --min-pause <secondes>: exécute la coupe avec des paramètres personnalisés.node $K/face.mjs: détecte les visages sur la chronologie de sortie.node $K/plan.mjs --help: documentation du planificateur.node $K/media.mjs --dry-run: montre ce qui serait téléchargé sans effectuer le téléchargement.node $E/preview.mjs: crée une prévisualisation du montage.node $E/build.sh --slice <temps début> <durée>: examine un moment spécifique en mouvement.node $E/verify.mjs: vérifie l'intégrité du fichier final.
Annexe : décisions de l'utilisateur (historique)
- 2026-09-01 : Validation du style scrapbook de base.
- 2026-09-10 : Ajout des stickers autour de la tête.
- 2026-09-15 : Ajout de la musique de fond (Hip Hop 02).
- 2026-09-22 : Changement de la police d'écriture manuscrite pour Gochi Hand.
- 2026-09-28 : Ajustement de la taille des polaroïds à 0,80 de la largeur de l'écran.
- 2026-10-05 : Validation finale du style. Toute modification ultérieure doit être approuvée par l'utilisateur.
Licence et mentions
- Mixkit : les sons et musiques de Mixkit sont sous licence libre pour une utilisation dans les vidéos, mais ne peuvent pas être redistribués séparément.
- Google Fonts : Archivo, Fraunces, Gochi Hand sont sous licence OFL.
- Motionix : pack d'effets sonores, licence non précisée dans le pack ; voir le README avant toute publication.
- Toutes les autres ressources : propriété de leurs auteurs respectifs.