Éditer un reel
Voici le flux déjà approuvé avec le reel WhatsApp (references/ejemplo-whatsapp.reel.json).
L'objectif est que le prochain reel sorte identique sans que j'aie à le réexpliquer : même style,
mêmes critères, mêmes vérifications. Parle en français et sans jargon technique inutile.
Avant toute chose : profil et installation
Lis ~/.claude/skills/editar-reel/perfil.json (nom de l'utilisateur, sa marque, le logo de fin et où il stocke
les clips). Appelle-le par son nom et utilise son dossier de clips à l'étape 1.
Si perfil.json n'existe pas, ou s'il manque un outil dans l'environnement, c'est la première fois sur ce Mac : suis
INSTALAR.md (tout installer et créer le profil) avant d'éditer quoi que ce soit.
Environnement (préparé par install.sh, voir INSTALAR.md)
- HyperFrames CLI :
~/.npm-global/bin/hyperframes(télémétrie désactivée). Exporte toujoursPATH="$HOME/.npm-global/bin:$PATH" HYPERFRAMES_NO_TELEMETRY=1 HYPERFRAMES_SKIP_SKILLS=1; le shell de Claude ne charge pas~/.zshrc. - faster-whisper :
~/.venvs/whisper/bin/python(avecav<16; la nouvelle version de PyAV casse faster-whisper). - FFmpeg dans
/opt/homebrew/bin. Lepython3du système (3.9) suffit pour les scripts sans numpy. - Bibliothèque d'effets sonores :
~/Movies/Reels/_sfx/. Les 13 originaux (whoosh_1/2, pop_1/2, tick, ding, message, counter, typing, clock, slide, hit, riser) sonnent seuls avec les graphiques ; style « sons Apple » : courts, propres, doux. Il y en a ~45 de plus (impacts, whooshes, caisse enregistreuse, clics, iPhone…) à utiliser manuellement : catalogue et quand utiliser chacun dansreferences/sfx.md. - Scripts de cette compétence :
SK=~/.claude/skills/editar-reel/scripts. - Logo de fin : celui de
perfil.json(cierre). Celui de vinagre.tech, vectorisé, se trouve dansassets/vinagre-tech/; celui d'une autre marque est stocké dansassets/marca/(voirINSTALAR.md).
Styles
L'utilisateur demande les reels par style (« édite-le avec le style 2 »). S'il n'en cite aucun, utilise le style 1.
Tous partagent le flux ci-dessous (transcrire, couper, AQ, sons, master) ; l'étape 5–6 change.
Tous se terminent par la fin avec le logo de sa marque (celui de perfil.json ; 1,6 s, fond blanc, scripts/outro.py) : la vidéo ne se termine
jamais brusquement. Sort par défaut (sauf si "cierre": null dans le profil) ; "outro": null dans reel.json le supprime, "outro": {"bg": "#000"} le modifie.
| Style | Description | Script | Référence |
|---|---|---|---|
| 1 · Tarjeta | Titre avec graphique dans une carte sombre en haut toutes les 2 à 3 secondes + sous-titre petit d'une ligne en bas. | build.py | references/ejemplo-whatsapp.reel.json |
| 2 · Frases | Grande phrase en bas en blanc (ce qui vient, translucide), mot-clé dans une pilule, icônes en ligne et flottantes, quelques cartes blanches et plans graphiques plein écran. | build_frases.py | references/estilo-frases.md |
| 3 · Cine | Clip horizontal dans une bande cinéma 16:9 sur fond noir (bandes dégagées), couleur chaude, zoom lent, petits sous-titres en minuscules des deux côtés du visage, dernier mot en grand en majuscules. Pour les vidéos intimes ou émouvantes. | cut_cine.py + build_cine.py | references/estilo-cine.md |
Mouvement v2 (approuvé le 02-11-2026, par défaut dans le style 1) : règles de references/motion-reglas.md
(titres qui défilent, chiffres qui défilent chiffre par chiffre, graphiques qui arrivent entiers). Les reels faits avant
portent "anim": 1 dans leur reel.json pour qu'une retouche ne change pas le mouvement déjà approuvé.
Les styles 1 et 2 peuvent également comporter des plans motion plein écran (terminal Mac, grille de points avec
un chiffre, orbite de cartes), dans "motion" de reel.json : lis references/motion.md pour savoir quand et comment.
Quand l'utilisateur demande des modifications à un style et les approuve, enregistre-les dans le script et la fiche de ce style.
S'il veut quelque chose de nouveau, crée un nouveau style (4, 5…) plutôt que d'en modifier un approuvé. Fais-lui d'abord un échantillon d'environ 10 s
("sample_end" dans reel.json, styles 2 et 3) avant de monter le reel entier.
Structure de chaque reel
~/Movies/Reels/<nom-court>/
reel.json propre à ce reel (tu l'écris ; format dans references/reel-json.md)
work/ transcriptions, coupes, images de contrôle qualité, rendu intermédiaire
proyecto/ projet HyperFrames (index.html généré + assets/)
reel-<nom>.mp4 le livrable
portada-<nom>.jpg la couverture pour Instagram (étape 8b)
Flux
1. Localiser le clip
Il se trouve généralement dans le dossier clips de perfil.json (par défaut ~/Movies/CapCut/) ou dans ses sous-dossiers. S'il y a plus d'un candidat et que ce n'est pas clair
lequel c'est, demande avec des options (nom, durée, date) ; éditer le mauvais demande beaucoup de temps.
Vérifie avec ffprobe la résolution, les fps et la durée.
2. Transcrire
mkdir -p ~/Movies/Reels/<n>/work
~/.venvs/whisper/bin/python -I $SK/transcribe.py "<clip>" ~/Movies/Reels/<n>/work medium es
Crée src.words.json (mots avec temps), fillers.txt (passage qui force Whisper à écrire "euh", "mmm",
"en fait" ; normalement il les ignore) et silences.json. Lis les trois fichiers.
3. Décider quoi supprimer (à ton appréciation)
- Prises répétées : s'il répète une phrase ou la commence et la coupe, garde la dernière prise et supprime les précédentes.
- Tics verbaux : ceux qui apparaissent dans
fillers.txtet pas dans le texte propre. - Silences : pas besoin de les marquer ;
cut.pysupprime ceux ≥0,2 s en laissant 0,07 s d'air de chaque côté. Note les plages (temps original) dansremovedereel.json, avecsource. S'il n'y a rien, met"remove": []et dis-le ("il n'y avait pas de tics verbaux ni de prises répétées", le cas échéant : tu as vérifié, ne le suppose pas).
cd ~/Movies/Reels/<n> && hyperframes init proyecto --example blank --resolution portrait --non-interactive
python3 -I $SK/cut.py ~/Movies/Reels/<n>
Crée le projet HyperFrames (avant de couper : init a besoin que le dossier proyecto n'existe pas) puis coupe,
sort du 1080×1920 à 30 fps et laisse la voix à -14 LUFS dans proyecto/assets/cut_norm.mp4 ; les mots avec les nouveaux temps
se trouvent dans work/cut.words.json.
4. Vérifier le cadrage
Extrais une bande d'images (ffmpeg -i proyecto/assets/cut_norm.mp4 -vf "fps=1/5,scale=270:-1,tile=6x1" -frames:v 1 work/contact.png)
et localise le visage : dans le reel de référence, il allait d'environ 520 à 1160 px en vertical, avec un mur libre à droite.
Le titre va au-dessus de la tête (carte de 170 à 430 px), les sous-titres sur le t-shirt en dessous
du micro HF, le logo de l'intro sur le mur à côté de la tête. Si ce clip a un autre cadrage,
ajuste layout et la position de logos dans reel.json.
5. Écrire le contenu dans reel.json
Lis references/reel-json.md et references/graficos.md. Ce qui est décidé :
- Accroche (0–2 s) : deux grandes lignes EN MAJUSCULES, boîtes jaunes avec texte noir. Une question ou affirmation qui résume le problème soulevé par la vidéo, pas une phrase littérale. Visible dès la première image.
- Titres : 2–5 mots, changent toutes les 2–3 s, résument ce qu'il dit dans ce passage, chacun avec son graphique animé.
- Logos : chaque fois qu'il nomme un outil ou une marque, son logo réel (Simple Icons ; s'il n'y est pas, le SVG officiel
de son kit presse dans
proyecto/assets/logos/<slug>.svg). Jamais un logo inventé ou approximatif. - Sous-titres : petits, une ligne, en bas, mot actif dans la couleur d'accent. Corrige dans
fixesles erreurs de Whisper que tu vois (noms propres, "un agent" corrigé en "un·e agent·e", etc.). - Plans motion (optionnel, un ou deux par reel) : quand il dit qu'il demande quelque chose à Claude ou explique des étapes d'une
automatisation →
terminal; quand il donne un chiffre →dots; quand il fait le calcul de ce qu'il gagne ou perd par an →months; « regarde tout ce que j'ai monté » →orbit; des clients lui écrivent ou il reçoit des messages →notify; il dit un chiffre de revenus ou de résultats →chart. Ils sont souhaités : ils donnent un répit à la vidéo (propose-en un s'il n'y en a pas). Voirreferences/motion.md. Propose-les uniquement s'ils racontent ce qu'il dit ; en cas de doute, demande-lui. - Appel final : s'il demande d'écrire un mot ou nomme la marque, dernier bloc avec
"graphic": "logo"et undingdanssfx_extrajuste au moment où il dit ce mot. - Sons littéraux (optionnel) : quand il dit quelque chose avec un son propre (argent →
cash, lâcher le téléphone →iphone_lock, écrire un message →phone_typing), ajoute-le danssfx_extrasur ce mot. Lisreferences/sfx.md; un ou deux par tranche de 10 s au maximum, et les memes uniquement s'il les demande.
6. Préparer les sons et générer la composition
python3 -I $SK/prep_sfx.py ~/Movies/Reels/_sfx ~/Movies/Reels/<n>/proyecto/assets/sfx
python3 -I $SK/build.py ~/Movies/Reels/<n>
cd ~/Movies/Reels/<n>/proyecto && hyperframes lint
prep_sfx supprime le silence initial de chaque son (sinon, il sonne en retard par rapport à l'animation), raccourcit les longs
avec un fondu et les égalise à -3 dBFS de crête. Le riser est raccourci pour qu'il se termine à son point culminant
(0,2–2,0 s du fichier actuel) ; si le fichier change, regarde son enveloppe et ajuste SPEC.
Dans lint sont attendus et ignorés : nested_structure_needs_subcomposition et timeline_track_too_dense.
Toute erreur, ou un avertissement d'un autre type, est corrigé.
7. Contrôle qualité des images (toujours avant le rendu)
Extrais une image de chaque bloc, au milieu du bloc quand l'animation est déjà terminée :
hyperframes snapshot --at <accroche≈1.0>,<chaque bloc: start+1.3>,... --no-end --describe false -o ../qa
Monte-les sur une feuille (ffmpeg -pattern_type glob -i 'qa/frame-*.png' -vf "scale=360:-1,tile=6x2" ...), regarde-les
et agrandis les zones douteuses (recadrages à taille réelle de la carte et des sous-titres). Cherche et corrige :
- texte coupé ou qui dépasse de la carte / un mot seul sur une ligne ;
- quelque chose sur le visage (dans n'importe quel bloc, même avec le zoom de 1,08 des coupes) ;
- faible contraste (texte clair sur mur blanc → besoin d'un fond sombre) ;
- sous-titres qui cachent le micro HF ou le logo du t-shirt de façon moche ;
- un graphique qui ne se comprend pas ou qui semble bizarre (c'est arrivé avec le premier
head: il a été refait). Répète le snapshot après chaque correction. Les mains qui passent devant les sous-titres sont inévitables ; ce n'est pas un défaut.
Comparer avec l'or. references/oro/ contient la feuille de 12 images des reels approuvés de chaque style
(estilo1-whatsapp, estilo1-18k, estilo2-fras, estilo3-reto40). Après le rendu (étape 8), extrais celle du nouveau reel
avec python3 -I $SK/hoja.py <reel>.mp4 work/hoja.png, mets-la à côté de celle de son style et réponds : laquelle des deux
est la plus vide, la plus plate ou avec les graphiques les plus petits ? Si c'est la nouvelle, c'est la première chose à corriger.
Quand l'utilisateur approuve un reel qui paraît meilleur que l'or de son style, ajoute sa feuille à references/oro/.
8. Rendre, vérifier l'audio et masteriser
hyperframes render --fps 30 -o ../work/render_mix.mp4
~/.venvs/whisper/bin/python -I $SK/measure_sfx.py ~/Movies/Reels/<n> ~/Movies/Reels/<n>/work/render_mix.mp4
python3 -I $SK/master.py ~/Movies/Reels/<n>/work/render_mix.mp4 ~/Movies/Reels/<n>/reel-<n>.mp4
measure_sfxindique combien chaque effet sonne par rapport à la voix. Objectif : coup -6 dB, ding -8, message ≈-8, pop/whoosh/slide -11 à -13, tick -14, horloge/compteur/riser -16, frappe -18 à -20. Si l'un s'écarte de >2 dB (par exemple parce qu'un fichier de_sfxa changé), corrige-le avecsfx_volet relance le rendu. Qu'un effet sonne plus fort que la voix est la grave erreur : il couvre ce qui est dit.master.pyamène le reel à -14 LUFS (crête -1,5 dB) en copiant la vidéo sans la toucher. C'est nécessaire parce que le mélangeur d'HyperFrames abaisse le mix d'environ 1,8 dB et le laisse à ~-16 LUFS.- Vérifie le livrable : 1080×1920, 30 fps, durée attendue, -14 LUFS.
8b. Couverture
python3 -I $SK/cover.py ~/Movies/Reels/<n>
Image propre de la vidéo avec l'accroche dans des boîtes jaunes, centrée dans la bande qu'Instagram affiche dans la
grille du profil (3:4), pour que dans le fil d'actualité on lise de quoi parle chaque vidéo. Laisse portada-<n>.jpg et
work/portada-feed.png (à quoi elle ressemblera recadrée). Va avec le titre au centre
(décidé le 02-11-2026, même s'il cache une partie du visage ; dans la vidéo, l'accroche reste en haut, au-dessus de la tête).
Regarde-la : l'image ("cover": {"at"}) doit avoir une bonne tête et rien de coupé. "cover": {"y"} ou
python3 -I $SK/cover.py <reel> 560 uniquement si une autre hauteur est demandée. L'utilisateur la télécharge lors de la publication
via « Modifier la couverture → Ajouter depuis la pellicule ».
9. Livrer
Dis-lui où se trouvent le .mp4 et la couverture, et résume en quelques lignes : combien a été coupé (de X s à Y s et ce qui a été retiré), l'accroche,
les titres (ou les plus représentatifs), quels logos apparaissent, quelles corrections de sous-titres tu as faites et ce que tu as corrigé lors du
contrôle qualité. Si quelque chose est une décision discutable de ta part (par ex. l'accroche est un résumé, pas une phrase littérale),
dis-le-lui et propose de le changer.
10. Nettoyer (uniquement lorsque l'utilisateur approuve le reel)
Chaque reel laisse environ 150 Mo d'intermédiaires et le disque est souvent juste. Quand il confirme que le reel est bon (pas avant :
tant qu'il retouche, tu en as besoin), déplace dans la Corbeille (~/.Trash/reel-<n>-intermedios-<date>/, jamais rm :
ainsi il peut les récupérer) tout ce qui est régénérable :
work/*.mp4, work/*.mov, work/*.png, qa/, versions écartées du reel, tous les assets/*.mp4 que
index.html n'utilise plus et les assets/sfx/*.wav que index.html ne nomme pas (prep_sfx copie toute la bibliothèque, ~15 Mo ;
si une retouche a besoin d'un autre son, on relance). Conserve reel.json, work/*.json, proyecto/ (avec assets/cut_norm.mp4 et sfx/)
et le .mp4 final : avec ça, on peut retoucher sans recouper. Dis-lui combien pèse ce qui a été déplacé et que cela se libère en
vidant la Corbeille. Si cut_norm.mp4 manque lors d'une retouche, cut.py le régénère à partir du clip original (s'il est toujours dans CapCut).
Musique
Ne l'ajoute pas dans la vidéo. L'utilisateur ajoute la musique lors de la publication
…