1mxffe/editor-reels

Édite une vidéo brute de type caméra parlée du cabinet Gutmann & Silva en Reel vertical (1080×1920) : transcription, détection des coupures de silence, béquilles et répétitions, incrustation de sous-titres statiques par phrase, superposition de cartes graphiques si nécessaire, et rendu d’une prévisualisation ou de la version finale.

Qu'est-ce que editor-reels ?

Ce skill permet de transformer une vidéo brute en Reel vertical optimisé pour les réseaux sociaux, spécifiquement conçu pour le cabinet d’avocats Gutmann & Silva. Il prend en charge la transcription automatique (via faster‑whisper ou une transcription fournie manuellement), la détection et la suppression des silences, des béquilles et des répétitions, ainsi que l’ajout de sous-titres statiques par phrase. En option, il peut superposer des cartes graphiques (par exemple pour des dates ou des étapes clés) et générer une couverture personnalisée. Le skill suit un flux rigoureux : d’abord un diagnostic de l’environnement avec `doctor.py`, puis une interview de marque si nécessaire, la transcription, le découpage, le rendu d’une prévisualisation (540×960), la révision via une page web dédiée, et enfin le rendu final (1080×1920). Il fonctionne sur macOS et Linux, nécessite Python ≥ 3.11, FFmpeg, et éventuellement Node.js pour les graphiques et la couverture par Figma. Les décisions de coupe sont conservées dans un fichier `cortes.json` et sont réversibles, garantissant que l’original n’est jamais modifié. Les durées cibles sont soit rapides (12–15 s) soit approfondies (30–45 s).

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/1mxffe/editor-reels/tree/HEAD/.claude/skills/editor-reel

Installed? Explore more Développement et programmation skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Demander à votre IA préférée

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

Documentation

Éditeur de Reel — Gutmann & Silva

Procédure complète. À exécuter depuis la racine du dépôt ; tout le code Python avec python3 -I. Formats et zone de sécurité dans references/formatos-reel.md ; règles de sous-titres dans references/legendas.md ; cartes graphiques dans references/graficos.md.

Règles immuables

  • Le texte est celui du cabinet. Le cabinet révise le texte avant l’enregistrement ; cet outil ne vérifie pas les règles de l’Ordre des Avocats (OAB). La parole, les sous-titres, les cartes et la couverture sont tels que l’utilisateur les a approuvés.
  • Sous-titres statiques, par phrase. Pas de pop‑up, pas d’effet mot à mot (fade de 150 ms max uniquement).
  • Les coupes sont réversibles. Le fichier original entrada.<ext> n’est jamais modifié ; les coupes sont stockées dans cortes.json et peuvent être modifiées et réappliquées.
  • Marque uniquement depuis brand/brand.json. Les couleurs, polices et @ proviennent de ce fichier. N’inventez jamais de valeur de marque ; si elle manque, réalisez l’entretien.

Avant de commencer

Exécutez python3 -I scripts/doctor.py et agissez selon la dernière ligne. Les scripts nécessitent Python 3.11 ou plus récent (le python3 livré avec macOS est la 3.9 : brew install [email protected]) ; le doctor tourne avec une ancienne version uniquement pour signaler cela (python >= 3.11).

  • READY : vous pouvez continuer.
  • READY WITH LIMITS : il manque seulement un élément optionnel. Sans faster_whisper, prévenez que la transcription automatique n’est pas disponible : demandez pip install -r requirements.txt ou un fichier transcricao.json prêt, et poursuivez. Sans l’élément graphique (chromium + playwright) ou sans node, continuez sans cartes et indiquez comment installer (references/graficos.md). Sans Pillow ou sans node, la couverture automatique (étapes 9 et 10) ne fonctionne pas : demandez pip install -r requirements.txt / installez node ou suivez la voie Figma.
  • MISSING : arrêtez-vous. Listez les éléments avec ✘ (python, ffmpeg, ffprobe, disque) et expliquez comment les installer ; ne tentez pas de rendu.

Entretien de marque

Uniquement si brand/brand.json est manquant, incomplet ou contient une valeur invalide (python3 -I scripts/brand.py check brand/brand.json se termine avec une erreur).

  1. Générez la graine uniquement si brand/brand.json est absent : python3 -I scripts/brand.py seed brand/brand.json. Elle provient de brand/guia-visual.md (bleu marine #001931, Poppins, sous-titres statiques). La graine (seed) est réservée à un fichier manquant, jamais pour un fichier existant (elle refuse) ; si le fichier existe mais est incomplet ou invalide, corrigez les clés que le check indique, sans --force.
  2. Posez une question à la fois, en proposant toujours la valeur de la graine et en attendant la réponse avant la suivante : (a) palette, (b) polices, (c) style de sous-titres, (d) @ des réseaux officiels.
  3. Enregistrez chaque réponse dans brand/brand.json et confirmez avec brand.py check. Les @ n’ont pas de graine : n’inventez pas ; laissez handles vide jusqu’à ce que l’utilisateur fournisse l’information. Lorsqu’il la fournit, enregistrez avec python3 -I scripts/brand.py set-handles brand/brand.json @profil [@profil2].

Déroulement

  1. Créez projects/<slug>/ (slug court du thème) et copiez la vidéo dans projects/<slug>/entrada.<ext>.

  2. python3 -I scripts/transcribe.py projects/<slug>/entrada.<ext> projects/<slug>/transcricao.json Si le doctor a indiqué READY WITH LIMITS (faster-whisper manquant) : installez avec pip install faster-whisper avant de transcrire, ou demandez un fichier transcricao.json prêt. Une vidéo sans audio échoue ici : demandez un autre fichier.

  3. python3 -I scripts/cut.py detect projects/<slug>/transcricao.json projects/<slug>/cortes.json

  4. Affichez à l’utilisateur la liste des coupes (id, début–fin, type : silence, béquille, répétition) et le temps total économisé. Coupe refusée : enregistrez {"cuts_removed": ["c3"]} (ids refusés) dans projects/<slug>/decisions.json et exécutez python3 -I scripts/review_apply.py apply projects/<slug> projects/<slug>/decisions.json (la coupe est conservée dans revisao.json et peut être rétablie) ; ne modifiez jamais cortes.json manuellement.

  5. Graphiques (optionnel) : si une carte aide à comprendre le propos (délai, condition, étape), proposez au maximum 1 toutes les ~8 s et, après un « oui » de l’utilisateur, enregistrez projects/<slug>/graficos.json conformément à references/graficos.md (titre ≤ 60, corps ≤ 140, at sur la timeline coupée, 1–6 s, image de materiais/ le cas échéant). Sans carte, sautez cette étape.

  6. python3 -I scripts/render.py projects/<slug> preview et donnez le chemin de projects/<slug>/saida/preview.mp4 (540×960).

  7. Révision : après le preview, ouvrez la page de révision dans un navigateur Chromium — sur macOS open -a "Google Chrome" review/review.html (le simple open peut ouvrir Safari, qui n’a pas accès au dossier) ; sur Linux xdg-open review/review.html si le navigateur par défaut est Chromium/Chrome, sinon google-chrome review/review.html — et demandez à l’utilisateur de choisir le dossier projects/<slug>/. Avant cela, générez la vue de lecture : python3 -I scripts/review_apply.py build projects/<slug>. Détails dans references/revisao.md.

  8. « appliquer la révision » → exécutez, dans l’ordre : python3 -I scripts/review_apply.py apply projects/<slug> projects/<slug>/decisions.json, python3 -I scripts/review_apply.py build projects/<slug> et python3 -I scripts/render.py projects/<slug> preview ; dites à l’utilisateur de cliquer sur « Recharger review.json ». Si apply échoue (code 1), rien n’a été enregistré : lisez le message et corrigez la décision. Sans la page (navigateur sans accès au dossier et sans plan B), faites la révision dans la conversation et enregistrez le decisions.json dans le même format.

  9. Couverture — choisir le cadre (une fois le preview approuvé) : extrayez les candidats de la vidéo originale, python3 -I scripts/cover_frames.py video projects/<slug>/entrada.<ext> projects/<slug>/capa (optionnel --n 3 ; imprime un chemin par ligne), ou, si l’utilisateur envoie une photo, python3 -I scripts/cover_frames.py photo <photo> projects/<slug>/capa (enregistre capa/foto.png). Montrez les fichiers capa/candidato-N.png et demandez quel cadre montre le sourire qu’il souhaite : c’est l’utilisateur qui choisit, l’outil se contente de sélectionner des cadres nets et bien répartis et ne détecte pas les sourires. Si aucun ne convient, demandez une photo ou relancez avec un autre --n. Détails dans references/capa.md.

  10. Couverture — composer (une fois le cadre choisi). Détails dans references/capa.md. (a) @ obligatoire : si handles de brand/brand.json est vide, demandez le @ une fois et enregistrez avec python3 -I scripts/brand.py set-handles brand/brand.json @profil ; n’inventez jamais. (b) Demandez l’accroche (≤ 28 caractères, ex. : « 3 MYTHES »), la zone de la pill (≤ 28) et le sous-titre (≤ 90 ; la partie après le dernier retour à la ligne s’affiche en bleu clair). (c) Chemin Figma (préféré, si le connecteur Figma est disponible et autorisé) : chargez la compétence figma-use avant use_figma, dupliquez le frame 272:2 du fichier POSTS-OUTUBRO, remplacez la photo et les textes, ajoutez le @ et exportez en PNG 1× vers projects/<slug>/capa/capa.png (étape par étape dans references/capa.md). (d) Sans Figma ou si l’export échoue : python3 -I scripts/cover_compose.py projects/<slug>/capa/candidato-N.png brand/brand.json projects/<slug>/capa/capa.png --hook "3 MYTHES" --area "EXONÉRATION D'IR" --subtitle "ligne blanche\nligne en surbrillance" (ou capa/foto.png). Code 1 = rien n’a été enregistré ; lisez le message (pas de @, photo trop petite, accroche sur plus de 2 lignes, texte trop long, sortie identique à un fichier d’entrée, Chromium manquant). (e) Montrez le capa.png à l’utilisateur et demandez validation ; ajustez et regénérez s’il le demande.

Échec (code 1, pour tout script) : lisez le message, corrigez la cause (marque absente ou invalide, aucune parole dans la transcription, fichier manquant, carte invalide ou rendu graphique absent — le message indique quelle carte) et recommencez. Ne laissez pas de fichier partiel.

Déclencheurs

  • « build preview » / « montar preview » → python3 -I scripts/render.py projects/<slug> preview.
  • « final » / « versão final » → python3 -I scripts/render.py projects/<slug> final (1080×1920, saida/final.mp4). Uniquement après avoir fourni un preview ; le « final » de l’utilisateur est l’approbation du preview, donc effectuez le rendu sans demander une autre confirmation.

Durée cible

Reel rapide : 12–15 s ; approfondi : 30–45 s. Calculez la durée de la vidéo déjà coupée (original moins le total des coupes). Si elle sort des deux fourchettes, avertissez et suggérez ce qui peut être ajusté (couper davantage, ou conserver des passages). Ne bloquez pas.

Ce qui existe déjà

La révision en page, l’onglet Matériaux (étapes 7 et 8), les cartes graphiques (étape 5) et la couverture (étapes 9 et 10 : choix du cadre, composition via Figma ou via scripts/cover_compose.py) existent déjà. Il n’y a pas de publication : rien ne va automatiquement sur Instagram. Il n’y a pas de détection du sourire (l’utilisateur choisit le cadre) et seul le fichier Poppins-Bold.ttf se trouve dans assets/fonts/ : les sous-titres sont en Poppins Bold, et les cartes ainsi que la couverture utilisent le même poids pour tout le texte (la couverture réalisée par Figma est celle qui respecte exactement la typographie). Pour le dessin complet de la marque, placez dans assets/fonts/ également Poppins-Regular.ttf, Poppins-SemiBold.ttf et Poppins-ExtraBold.ttf (licence SIL OFL, peuvent être ajoutés au dépôt). La vidéo et les sous-titres ne sont générés que par render.py (les autres scripts qui enregistrent une vidéo ou des sous-titres sont de débogage).

Skills associés