Editor de Reel — Gutmann & Silva
Procedimiento completo. Se ejecuta desde la raíz del repositorio; todo en Python con
python3 -I. Los formatos y la zona segura están en references/formatos-reel.md; las reglas de
subtítulos en references/legendas.md; las tarjetas gráficas en references/graficos.md.
Reglas que no cambian
- El texto es del despacho. El despacho revisa el texto antes de grabar; esta herramienta no verifica las reglas de la OAB. El discurso, los subtítulos, las tarjetas y la portada se entregan tal como el usuario los aprobó.
- Subtítulos estáticos, por frase. Sin pop-up, sin efecto palabra por palabra (solo fundido de hasta 150 ms).
- Los cortes son reversibles. El original
entrada.<ext>nunca se modifica; los cortes residen encortes.jsony se pueden editar y reaplicar. - Marca solo desde
brand/brand.json. Los colores, las fuentes y la @ provienen de ahí. Nunca inventes valores de marca; si falta algo, haz la entrevista.
Antes de empezar
Ejecuta python3 -I scripts/doctor.py y actúa según la última línea. Los scripts requieren
Python 3.11 o superior (el python3 que viene en macOS es 3.9: brew install [email protected]); el doctor se ejecuta en python antiguo solo para señalar esto (python >= 3.11).
READY: sigue adelante.READY WITH LIMITS: solo falta un elemento opcional. Sinfaster_whisper, avisa que la transcripción automática no está disponible: pidepip install -r requirements.txto untranscricao.jsonya preparado, y continúa. Sin el elemento de gráficos (chromium + playwright) o sinnode, continúa sin tarjetas y explica cómo instalar (references/graficos.md). SinPillowo sinnode, la portada automática (pasos 9 y 10) no se ejecuta: pidepip install -r requirements.txt/ instala node o sigue por la vía de Figma.MISSING: detente. Enumera los elementos con ✘ (python, ffmpeg, ffprobe, disco) y explica cómo instalarlos; no intentes renderizar.
Entrevista de marca
Solo si falta brand/brand.json, está incompleto o tiene un valor inválido
(python3 -I scripts/brand.py check brand/brand.json sale con error).
- Genera la semilla solo si
brand/brand.jsonno existe:python3 -I scripts/brand.py seed brand/brand.json. Viene debrand/guia-visual.md(azul marino#001931, Poppins, subtítulo estático). Elseedes solo para archivos ausentes, nunca sobre un archivo existente (se niega); si el archivo existe pero está incompleto o es inválido, corrige las claves que elcheckindique, sin--force. - Haz una pregunta por vez, siempre proponiendo el valor de la semilla y esperando la respuesta antes de la siguiente: (a) paleta, (b) fuentes, (c) estilo de subtítulo, (d) @ de las redes oficiales.
- Graba cada respuesta en
brand/brand.jsony confírmalo conbrand.py check. Los @ no tienen semilla: no inventes; dejahandlesvacío hasta que el usuario los proporcione. Cuando los proporcione, grábalos conpython3 -I scripts/brand.py set-handles brand/brand.json @perfil [@perfil2].
Flujo
-
Crea
projects/<slug>/(slug corto del tema) y copia el vídeo aprojects/<slug>/entrada.<ext>. -
python3 -I scripts/transcribe.py projects/<slug>/entrada.<ext> projects/<slug>/transcricao.jsonSi el doctor indicóREADY WITH LIMITS(falta faster-whisper): instálalo conpip install faster-whisperantes de transcribir, o pide untranscricao.jsonya preparado. Un vídeo sin audio falla aquí: pide otro archivo. -
python3 -I scripts/cut.py detect projects/<slug>/transcricao.json projects/<slug>/cortes.json -
Muestra al usuario la lista de cortes (id, inicio–fin, tipo: silencio, muletilla, repetición) y el tiempo total ahorrado. Corte rechazado: graba
{"cuts_removed": ["c3"]}(ids rechazados) enprojects/<slug>/decisions.jsony ejecutapython3 -I scripts/review_apply.py apply projects/<slug> projects/<slug>/decisions.json(el corte queda guardado enrevisao.jsony puede revertirse); nunca editescortes.jsonmanualmente. -
Gráficos (opcional): si una tarjeta ayuda a entender el discurso (plazo, condición, paso), propón como máximo 1 cada ~8 s y, con el "sí" del usuario, graba
projects/<slug>/graficos.jsonsegúnreferences/graficos.md(título hasta 60, cuerpo hasta 140,aten la línea de tiempo recortada, 1–6 s, imagen demateriais/si existe). Sin tarjeta, salta este paso. -
python3 -I scripts/render.py projects/<slug> previewy entrega la ruta deprojects/<slug>/saida/preview.mp4(540×960). -
Revisión: después del preview, abre la página de revisión en un navegador Chromium — en macOS
open -a "Google Chrome" review/review.html(elopensimple puede abrir Safari, que no da acceso a la carpeta); en Linuxxdg-open review/review.htmlsi el predeterminado es Chromium/Chrome, si nogoogle-chrome review/review.html— y pide al usuario que elija la carpetaprojects/<slug>/. Antes, genera la vista de lectura:python3 -I scripts/review_apply.py build projects/<slug>. Detalles enreferences/revisao.md. -
"aplicar revisión" → ejecuta, en orden:
python3 -I scripts/review_apply.py apply projects/<slug> projects/<slug>/decisions.json,python3 -I scripts/review_apply.py build projects/<slug>ypython3 -I scripts/render.py projects/<slug> preview; dile al usuario que toque "Recargar review.json". Si elapplyfalla (código 1), no se grabó nada: lee el mensaje y corrige la decisión. Sin la página (navegador sin acceso a la carpeta y sin plan B), realiza la revisión en la conversación y graba eldecisions.jsonen el mismo formato. -
Portada — elegir el fotograma (después de que el preview haya sido aprobado): extrae candidatos del vídeo original,
python3 -I scripts/cover_frames.py video projects/<slug>/entrada.<ext> projects/<slug>/capa(opcional--n 3; imprime una ruta por línea), o, si el usuario envía una foto,python3 -I scripts/cover_frames.py photo <foto> projects/<slug>/capa(grabacapa/foto.png). Muestra los archivoscapa/candidato-N.pngy pregunta qué fotograma muestra la sonrisa que él/ella quiere: quien elige es el usuario, la herramienta solo separa fotogramas nítidos y bien distribuidos y no detecta sonrisas. Si ninguno convence, pide una foto o vuelve a ejecutar con otro--n. Detalles enreferences/capa.md. -
Portada — componer (una vez elegido el fotograma). Detalles en
references/capa.md. (a) @ obligatorio: sihandlesdebrand/brand.jsonestá vacío, pregunta el @ una vez y grábalo conpython3 -I scripts/brand.py set-handles brand/brand.json @perfil; nunca inventes. (b) Pregunta el gancho (hasta 28 caracteres, ej.: "3 MITOS"), el área de la pill (hasta 28) y el subtítulo (hasta 90; la parte después del último salto de línea sale en azul claro). (c) Vía Figma (preferida, si el conector de Figma está disponible y autorizado): carga el skillfigma-useantes deuse_figma, duplica el frame272:2del archivoPOSTS-OUTUBRO, cambia la foto y los textos, añade el @ y exporta PNG 1× aprojects/<slug>/capa/capa.png(paso a paso enreferences/capa.md). (d) Sin Figma o si el export falla:python3 -I scripts/cover_compose.py projects/<slug>/capa/candidato-N.png brand/brand.json projects/<slug>/capa/capa.png --hook "3 MITOS" --area "ISENÇÃO DE IR" --subtitle "línea blanca\nlínea destacada"(ocapa/foto.png). Código 1 = no se grabó nada; lee el mensaje (sin @, foto pequeña, gancho en más de 2 líneas, texto demasiado largo, salida igual a un archivo de entrada, Chromium ausente). (e) Muestra elcapa.pngal usuario y pide aprobación; ajusta y genera de nuevo si él/ella lo solicita.
Fallo (código 1, en cualquier script): lee el mensaje, corrige la causa (marca ausente o inválida, ningún discurso en la transcripción, archivo faltante, tarjeta inválida o renderizador de gráficos ausente — el mensaje dice qué tarjeta) y repite. No dejes archivos parciales.
Disparadores
- "build preview" / "montar preview" →
python3 -I scripts/render.py projects/<slug> preview. - "final" / "versión final" →
python3 -I scripts/render.py projects/<slug> final(1080×1920,saida/final.mp4). Solo después de entregar un preview; el "final" del usuario es la aprobación del preview, así que renderiza sin pedir otra confirmación.
Duración objetivo
Reel rápido: 12–15 s; profundo: 30–45 s. Calcula la duración del vídeo ya recortado (original menos el total de los cortes). Si queda fuera de los dos rangos, avisa y sugiere qué ajustar (recortar más, o mantener fragmentos). No bloquees.
Lo que aún no existe
La revisión en página, la pestaña Materiales (pasos 7 y 8), las tarjetas gráficas
(paso 5) y la portada (pasos 9 y 10: elección del fotograma, composición por Figma o
por scripts/cover_compose.py) ya existen. No existe publicación: nada va
automáticamente a Instagram. No hay detección de sonrisas (el usuario
elige el fotograma) y solo el archivo Poppins-Bold.ttf está en assets/fonts/:
los subtítulos salen en Poppins Bold, y las tarjetas y la portada usan ese mismo peso para
todo el texto (la portada hecha con Figma es la que sale con la tipografía exacta). Para
el diseño completo de la marca, pon en assets/fonts/ también Poppins-Regular.ttf,
Poppins-SemiBold.ttf y Poppins-ExtraBold.ttf (licencia SIL OFL, se puede subir al repositorio). El vídeo y los subtítulos solo se generan mediante
render.py (los otros scripts que graban vídeo o subtítulos son de depuración).