É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 danscortes.jsonet 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. Sansfaster_whisper, prévenez que la transcription automatique n’est pas disponible : demandezpip install -r requirements.txtou un fichiertranscricao.jsonprêt, et poursuivez. Sans l’élément graphique (chromium + playwright) ou sansnode, continuez sans cartes et indiquez comment installer (references/graficos.md). SansPillowou sansnode, la couverture automatique (étapes 9 et 10) ne fonctionne pas : demandezpip 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).
- Générez la graine uniquement si
brand/brand.jsonest absent :python3 -I scripts/brand.py seed brand/brand.json. Elle provient debrand/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 lecheckindique, sans--force. - 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.
- Enregistrez chaque réponse dans
brand/brand.jsonet confirmez avecbrand.py check. Les @ n’ont pas de graine : n’inventez pas ; laissezhandlesvide jusqu’à ce que l’utilisateur fournisse l’information. Lorsqu’il la fournit, enregistrez avecpython3 -I scripts/brand.py set-handles brand/brand.json @profil [@profil2].
Déroulement
-
Créez
projects/<slug>/(slug court du thème) et copiez la vidéo dansprojects/<slug>/entrada.<ext>. -
python3 -I scripts/transcribe.py projects/<slug>/entrada.<ext> projects/<slug>/transcricao.jsonSi le doctor a indiquéREADY WITH LIMITS(faster-whisper manquant) : installez avecpip install faster-whisperavant de transcrire, ou demandez un fichiertranscricao.jsonprêt. Une vidéo sans audio échoue ici : demandez un autre fichier. -
python3 -I scripts/cut.py detect projects/<slug>/transcricao.json projects/<slug>/cortes.json -
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) dansprojects/<slug>/decisions.jsonet exécutezpython3 -I scripts/review_apply.py apply projects/<slug> projects/<slug>/decisions.json(la coupe est conservée dansrevisao.jsonet peut être rétablie) ; ne modifiez jamaiscortes.jsonmanuellement. -
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.jsonconformément àreferences/graficos.md(titre ≤ 60, corps ≤ 140,atsur la timeline coupée, 1–6 s, image demateriais/le cas échéant). Sans carte, sautez cette étape. -
python3 -I scripts/render.py projects/<slug> previewet donnez le chemin deprojects/<slug>/saida/preview.mp4(540×960). -
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 simpleopenpeut ouvrir Safari, qui n’a pas accès au dossier) ; sur Linuxxdg-open review/review.htmlsi le navigateur par défaut est Chromium/Chrome, sinongoogle-chrome review/review.html— et demandez à l’utilisateur de choisir le dossierprojects/<slug>/. Avant cela, générez la vue de lecture :python3 -I scripts/review_apply.py build projects/<slug>. Détails dansreferences/revisao.md. -
« 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>etpython3 -I scripts/render.py projects/<slug> preview; dites à l’utilisateur de cliquer sur « Recharger review.json ». Siapplyé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 ledecisions.jsondans le même format. -
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(enregistrecapa/foto.png). Montrez les fichierscapa/candidato-N.pnget 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 dansreferences/capa.md. -
Couverture — composer (une fois le cadre choisi). Détails dans
references/capa.md. (a) @ obligatoire : sihandlesdebrand/brand.jsonest vide, demandez le @ une fois et enregistrez avecpython3 -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étencefigma-useavantuse_figma, dupliquez le frame272:2du fichierPOSTS-OUTUBRO, remplacez la photo et les textes, ajoutez le @ et exportez en PNG 1× versprojects/<slug>/capa/capa.png(étape par étape dansreferences/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"(oucapa/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 lecapa.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).