/edicion — édition avec motion graphics + XML pour Premiere
Entrée : une vidéo brute (ou un dossier avec la vidéo brute + matériel d'appoint : clips kling/IA, PNG, musique, SFX).
Sortie dans le dossier de la vidéo : <NAME>_EDIT/ avec <NAME>_v1_premiere.xml, Assets/{MG,Subtitulos,SFX,Envato}, LEEME.md. Aucun rendu MP4 de prévisualisation (l'utilisateur l'a demandé pour gagner en rapidité) : la révision visuelle se fait avec les planches contact de l'étape 5.
Parler à l'utilisateur en espagnol rioplatense (voseo). L'informer brièvement de l'avancement entre les étapes longues.
Chemins : SK = le dossier de cette compétence, où se trouve ce SKILL.md (Claude Code : ~/.claude/skills/edicion ; Codex : ~/.codex/skills/edicion) · scripts dans $SK/scripts · moteur dans $SK/engine/engine.html · catalogue dans $SK/reference/escenas.md · exemple dans $SK/reference/ejemplo_jobs.js.
Workdir du projet : <carpeta>/<NAME>_EDIT/.work (persistant, permet de faire une v2 dans une autre session).
Exécuter Python toujours avec python3 -I (Windows : py -3 -I). Passer les chemins avec des espaces entre guillemets. Fonctionne sur macOS et Windows : sous PowerShell utiliser les chemins avec \, $env:VAR au lieu de VAR=... et les drapeaux des scripts (ex. --t=end-0.4) au lieu de variables d'environnement.
0 · Préparation
- Chronomètre : dès que le nom est connu, créer le workdir et exécuter
python3 -I $SK/scripts/timing.py start "<work>". Les scripts notent seuls combien de temps prend chaque étape. - Dépendances :
python3 -I $SK/scripts/doctor.py(Windows :py -3 -I $SK\scripts\doctor.py). Si quelque chose est marqué ✗, exécuter la commande indiquée (en général l'installateur :bash $SK/scripts/install.shsur Mac,powershell -ExecutionPolicy Bypass -File $SK\scripts\install.ps1sous Windows) et revérifier. - Inventaire du dossier :
ffprobede chaque vidéo (durée, fps, rotation,nb_frames), taille des PNG, durée des audios. Le brut est généralement 1920×1080 avec rotation 90 (= vertical 1080×1920, 30 fps). - Regarder le matériel d'appoint :
ffmpeg -vf "fps=2,scale=150:-1,tile=10x2"→ regarder l'image. Identifier ce qu'illustre chaque clip/photo (accroche, blague, métaphore). S'il y a des scènes, détecter les coupures avecscdet. - Regarder une image de la vidéo brute (couleur des vêtements → couleurs des sous-titres, voir escenas.md).
1 · Transcrire
python3 -I $SK/scripts/transcribe.py "<crudo>" "<work>" → liste de phrases avec timings.
Whisper hallucine sur le bruit ("Gracias", "Gracias por ver el video", "Suscríbete al canal", "CC por…") : vérifier ces zones et tout doute avec
python3 -I $SK/scripts/check.py "<work>" 21.9-26.3 ... (parole ≈ −5…−25 dB ; bruit ≈ −48…−70 dB).
2 · Décider le script (critère éditorial)
- Supprimer les phrases répétées, les faux départs, les prises incomplètes et les bafouillages. En cas de plusieurs prises de la même chose, garder la dernière complète.
- Corriger le texte pour les sous-titres (voseo : "querés", "tenés", "dejá" ; "método IDEAS" ; noms propres).
- CTA : s'il a enregistré plusieurs alternatives, utiliser par défaut "mandame un mensaje(ito)" (ce fut le choix explicite de l'utilisateur). Les autres sont listées dans le LEEME avec leur timecode dans le brut. S'il y a une liste de CTA qui ne se répète pas (options différentes, sans la même intro), on peut toutes les laisser comme OPTION 01/02… Dans la réponse finale, dire laquelle tu as choisie.
- Écrire
<work>/segs.json: liste de segments logiques (chacun = idée qui partage un graphique), chacun avec des phrases[a, b, "texto"]tirées des phrases de transcribe/check.
3 · Montage SERRÉ (obligatoire)
python3 -I $SK/scripts/tighten.py "<work>" recadre chaque phrase sur l'énergie réelle de la voix et coupe les pauses internes ≥ 0,25 s (lectures, regards sur le côté, respirations). L'utilisateur a explicitement demandé des coupes sans silences : ne pas laisser de pauses.
Créer <work>/config.json (ci-dessous) et exécuter python3 -I $SK/scripts/edl.py "<work>" → imprime la durée et les temps par segment et retranscrit le montage : confirmer qu'aucun mot ne manque ni n'est en trop. S'il manque un début, vérifier avec check.py et ajuster segs.json.
{ "name": "SIGN_SPINNER", "version": 1, "fps": 30, "tail": 1.2,
"src": "/abs/crudo.mp4", "edit_dir": "/abs/carpeta/SIGN_SPINNER_EDIT",
"caption_colors": {"act":"var(--hot)","kwAct":"var(--lime)","kw":"#FFB08A"},
"keywords": ["pacientes","scroll","correctas"],
"broll": { "kl": {"path":"/abs/kling.mp4","frames":97,"rate":24,"w":1080,"h":1916},
"s1": {"path":"/abs/foto.png","still":true,"w":941,"h":1672} },
"music": {"path":"/abs/musica.wav"},
"face": {"top": 0.22},
"markers": [["HOOK",0],["CTA · Mandame un mensaje",17]] }
tail = secondes supplémentaires à la fin (visage face caméra) pour que le dernier graphique soit lu.
face.top = hauteur (0–1) du haut de la tête dans le cadre (le regarder dans l'image de l'étape 0.4) : limite le zoom maximum pour ne pas la couper. music est complété par envato.py use (ou un chemin du dossier de la vidéo). Optionnels : sfx_max (maximum de SFX sur toute l'édition, par défaut 5), sound_design: "manual", max_zoom.
4 · Concevoir les motion graphics → <work>/jobs.js
Se baser sur reference/ejemplo_jobs.js et reference/escenas.md. Style fixe (l'utilisateur l'a adoré, ne pas le changer) : cartes crème avec kicker mono et point orange, titres Bricolage condensés en majuscules, surlignages orange, ✓ lime, écrans pleins avec grain et wipe en couches.
Règles :
- Limites de l'utilisateur (obligatoires) : 3 écrans pleins (
fs) et au maximum 3 motion graphics superposés (ov/ov2: cartes, listes, tampons, stickers…) sur toute l'édition. Le reste est compté par les sous-titres, les recadrages et le b-roll. Choisir les 3 MG pour les idées qui gagnent le plus à être vues (une liste qui se construit, une donnée, le CTA), pas pour répéter ce qui est déjà dit. - Sous-titres vs. MG : les sous-titres tournent tout le temps, mais disparaissent seuls pendant qu'il y a un MG (ov, ov2 ou fs) pour ne pas entrer en concurrence ; ils reviennent dès que le MG sort. Pas besoin de faire quoi que ce soit : render.js le résout. C'est pourquoi chaque MG doit raconter par lui-même ce qui est dit dans ce passage, et il est préférable qu'il ne dure pas plus que l'idée (2–5 s).
- Synchroniser chaque MG avec le mot qui le déclenche (
W(seg,'palabra')). - Écrans pleins (fs) qui couvrent le visage sur les 3 points forts les plus puissants, de 1 à 3 s, répartis. Fond alternés ink / orange / crème.
- Accroche forte dans les 2 premières secondes : texte grand en haut et, s'il y a un clip d'appoint amusant ou visuel, qu'il entre dans l'accroche (avec sticker et flèche ou HUD) et la musique forte.
- B-roll : d'abord celui du dossier (clips kling/IA, photos), là où il illustre ce qui est dit (métaphores : roue de hamster, panneau, rayons X). Photos fixes avec Ken Burns
[100,112]. En plus, 3 moments d'Envato (étape 4a). Au-dessus du b-roll, seulement sticker/HUD/tampon. - Audio supplémentaire du dossier de la vidéo (caméra, pas, etc.) avec
X(). - SFX : automatiques (étape 4b). Pas besoin de mettre le dernier paramètre de
J()sauf pour changer le son. - Utiliser de nouvelles scènes quand la métaphore le demande (les ajouter à engine.html en suivant escenas.md). Ne pas réutiliser de textes fixes d'autres scènes qui ne s'appliquent pas (ex.
hookdit MARKETING DESDE CERO). - Piste
ov2seulement si une carte doit être au-dessus d'un autre overlay (ex. tracker).
4a · B-roll sémantique + musique d'Envato
Le MCP d'Envato ne fait que chercher (il ne télécharge ni ne licencie). envato.py l'appelle par HTTP, donc ça fonctionne aussi bien dans Claude que dans Codex même si le MCP n'est pas configuré.
- Choisir 3 moments du script où une image réelle apporte quelque chose : une situation concrète (patient en consultation, quelqu'un qui scrolle), une métaphore visuelle ou une donnée qui se comprend mieux en la voyant. Répartis (premier tiers, milieu, avant le CTA), de 1,5–3,5 s, jamais pendant un écran plein ni dans le CTA final, et dans des passages où la carte de ce moment peut être un sticker/HUD ou il n'y a pas de carte.
- Chercher (termes concrets en anglais, décrivant l'image, pas le mot du script) :
python3 -I $SK/scripts/envato.py search "<work>" video "<términos>" --vertical [--sub Medical]. S'il y a peu de résultats, répéter sans--vertical(les horizontaux sont recadrés au centre). Regarder la planche<work>/envato/<búsqueda>.jpg(ligne n = candidat #n) et choisir : authentique (pas de pose de stock), sujet centré qui entre en 9:16, lumière et couleur semblables au brut, sans texte, qui élargit ce qui est dit au lieu de le répéter. - Utiliser :
python3 -I $SK/scripts/envato.py use "<work>" <clave> <búsqueda>#<n>(enregistre l'aperçu dansconfig.broll) et le placer dans jobs.js avecB('<clave>', seg_origen, inicio, dur). - Musique :
python3 -I $SK/scripts/envato.py search "<work>" music "<estilo en inglés>" --mood <mood> --tempo "<tempo>" [--genre <género>](toujours instrumental). Choisir selon le ton de la vidéo et le profil d'énergie qu'il imprime (uniforme, sans chutes longues ; pour les vidéos énergiquesUpbeat (110-140 BPM), pour les vidéos chaleureusesMedium (90-110 BPM)), etenvato.py use "<work>" music <búsqueda>#<n>. Si l'utilisateur a laissé de la musique dans le dossier, utiliser celle-ci ("music": {"path": ...}). Le volume se règle seul dans le XML : fort dans l'accroche, baisse sous la voix et monte dans la conclusion (hook_gain0.3 ·bed_gain0.08 ·outro_gain0.22 ·offset= seconde de la chanson où elle commence, pour entrer dans une partie avec énergie). - Licencier et télécharger : entre-temps le XML utilise les aperçus avec filigrane (préfixe
PREVIEW_). Si l'agent a un navigateur avec la session Envato ouverte : afficher la liste (envato.py report "<work>") et demander confirmation une seule fois ; ensuite, pour chaque lien : Download → licencier pour un projet avec le nom de la vidéo → télécharger l'original (vidéo dans la plus haute résolution verticale/HD ; musique en WAV). S'il n'y a pas de navigateur ou pas de session, donner à l'utilisateur le tableau de liens pour qu'il le fasse. Ensuitepython3 -I $SK/scripts/envato.py collect "<work>"(cherche dans~/Downloads, décompresse, copie dansAssets/Envatoet remplace les aperçus) et relancerbuild_xml.py. Ne jamais utiliser de matériel d'autres banques ni sauter la recherche.
4b · Conception sonore (automatique, avec la bibliothèque de la compétence)
Tous les SFX vivent dans $SK/assets/sfx/<catégorie>/<id>.wav, normalisés à −16 LUFS, et sont décrits dans catalog.json (durée, volume par catégorie et anchor = le coup ou le départ qui tombe juste sur l'événement). Voir la liste complète : python3 -I $SK/scripts/sfx_import.py --list. Lors de la construction du XML, seuls les SFX utilisés sont copiés dans Assets/SFX.
| Catégorie | Quand |
|---|---|
whoosh | Entrée des écrans pleins, wipes, changements forts de carte |
build | Avant une coupe ou un point culminant (reverse-whoosh, riser ≈ 6 s, seulement par id pour le plus grand point culminant) |
pop | Apparition de cartes, stickers, éléments de liste |
click | Interfaces : recherche, DM, bouton suivre, cocher |
ding | ✓ check, réussite, idée, donnée positive |
error | ✗, barrer, mythe, ce qui va mal (game-over est une voix robotique : à utiliser avec humour) |
hit | Points culminants, tampons, fs d'impact (bass-drop seulement par id, maximum 1 par vidéo) |
glitch · poof | Quelque chose qui échoue, se casse ou disparaît |
zoom · bounce · wind | Punch-in ou loupe · rebond avec humour · apparition magique |
foley · splash · car | Littéraux : seulement si ce qui est dit ou vu coïncide (écrire, fermer, étirer, toilettes, eau, voitures) |
Règle de l'utilisateur : au maximum 5 effets sur TOUTE l'édition, choisis avec subtilité. Plus que ça devient brusque.
Automatique (par défaut) : on rassemble les moments candidats (entrée de chaque graphique et ses moments internes : ✓ → ding, tampon/point culminant → hit, chercheur/DM/suivre → click, écran plein → whoosh, coupe vers b-roll → whoosh) et on choisit seulement les 5 plus importants : points culminants et écrans pleins > l'accroche > le CTA > la coupe vers b-roll > les cartes > les détails internes, séparés d'au moins ~6 s entre eux (≥ 3 s dans les vidéos courtes). Volumes faibles (≈ −11 à −14 dB par rapport à la voix). Les variantes alternent.
En révisant le plan, se demander pour chacun s'il apporte quelque chose ; sinon, le retirer (J(..., null)). Moins c'est mieux : 3 bien placés valent mieux que 5.
Manuel (remplace l'automatique pour ce graphique ; compte dans le maximum de 5) :
- Catégorie ou id ponctuel :
J(..., 'pop')·J(..., 'bass-drop')·J(..., null)= sans son. - Son libre à une seconde de la timeline :
S('splash', W(4,'agua'))·S('car-pass-2', t, {gain:.25, dur:3}). Les littéraux (foley,splash,car) ne sont jamais automatiques : les mettre avecS()seulement quand ils ajoutent à la blague ou à la métaphore.node render.js --planliste tous les SFX (les automatiques marqués(auto)). Pour ajouter de nouveaux sons :python3 -I $SK/scripts/sfx_import.py <archivo> --id <id> --cat <catégorie> [--anchor peak|onset] [--max 4] --desc "..."(découpe, normalise et l'enregistre).
4c · Recadrages et zooms (automatiques selon le discours)
render.js décide l'échelle de chaque clip de V1 et l'écrit dans framing.json ; le XML l'applique avec des keyframes :
snap(zoom rapide 100→118 %) dans l'accroche ·punch(124 %) dans les phrases d'emphase : avec!, avec mot-clé dans un clip court, ou sous un tampon/mot-gros (max. un toutes les 6 s) ·push(rapprochement lent) dans les questions et le CTA ·tight(114 %) /wide(100→103 %) alternés pour dissimuler les jump cuts (toujours ≥ 8 % de différence entre clips consécutifs) · les clips couverts par fs ou b-roll restent enwide.- Le zoom maximum vient de
config.face.top(ne coupe pas la tête) ; par défaut 124 %. - Pour forcer un cadre :
F(seg, 'punch')ouF.clip(i, 'wide')dans jobs.js.
5 · Direction créative, test et rendu
node $SK/scripts/render.js "<work>" --plan(liste les graphiques, SFX et cadres avec timings ; détecte les mots non trouvés).- Direction créative :
node $SK/scripts/director.js "<work>"→ rapport (direction.md) + timeline (timeline.png, la regarder). Vérifie que rien n'entre en concurrence : plus de 3 MG ou de 3 écrans pleins, sous-titres visibles sous un MG, deux cartes en même temps, cartes couvrant le b-roll, b...