Communitygithub.com

Editar Reel

Édite les reels de l'utilisateur (vidéos verticales parlant à la caméra pour Instagram) selon le flux approuvé : transcription locale avec Whisper, suppression des silences/tics verbaux/prises répétées, accroche en majuscules, titres avec graphiques animés toutes les 2 à 3 secondes, logos réels des marques, sous-titres d'une ligne, effets sonores calibrés, voix à -14 LUFS et rendu avec HyperFrames. À utiliser dès qu'il demande d'éditer, monter, couper, sous-titrer ou « terminer » un reel, un clip CapCut ou une vidéo verticale qui lui appartient.

Qu'est-ce que Editar Reel ?

Cette compétence pour agent IA orchestre la post-production complète de reels Instagram (vidéos verticales à la première personne) avec un pipeline local sur macOS. Elle repose sur trois piliers : la transcription locale avec faster-whisper pour identifier les silences et les tics verbaux ; le découpage précis qui conserve ~70 % du métrage original ; et le rendu final via HyperFrames avec des titres animés, des sous-titres d'une ligne, des logos réels de marque et des effets sonores calibrés. Destinée aux créateurs de contenu et marketeurs, elle élimine les tâches répétitives (montage brut, étalonnage audio, placement des textes) et applique strictement des styles visuels pré-approuvés (Tarjeta, Frases, Cine) tout en respectant des règles de qualité strictes : vérification vidéo par des captures d'écran, comparaison avec des reels de référence, et mesures automatiques du volume de la voix (-14 LUFS) et des effets sonores (-6 à -20 dB selon le type). Fonctionne exclusivement sur macOS avec les dépendances listées dans le script d'installation.

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Alexandrevnc/editar-reel/tree/HEAD

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

É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 toujours PATH="$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 (avec av<16 ; la nouvelle version de PyAV casse faster-whisper).
  • FFmpeg dans /opt/homebrew/bin. Le python3 du 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 dans references/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 dans assets/vinagre-tech/ ; celui d'une autre marque est stocké dans assets/marca/ (voir INSTALAR.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.

StyleDescriptionScriptRéférence
1 · TarjetaTitre avec graphique dans une carte sombre en haut toutes les 2 à 3 secondes + sous-titre petit d'une ligne en bas.build.pyreferences/ejemplo-whatsapp.reel.json
2 · FrasesGrande 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.pyreferences/estilo-frases.md
3 · CineClip 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.pyreferences/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.txt et pas dans le texte propre.
  • Silences : pas besoin de les marquer ; cut.py supprime ceux ≥0,2 s en laissant 0,07 s d'air de chaque côté. Note les plages (temps original) dans remove de reel.json, avec source. 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 fixes les 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). Voir references/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 un ding dans sfx_extra juste 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 dans sfx_extra sur ce mot. Lis references/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_sfx indique 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 _sfx a changé), corrige-le avec sfx_vol et relance le rendu. Qu'un effet sonne plus fort que la voix est la grave erreur : il couvre ce qui est dit.
  • master.py amè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

…

Skills associés