CommunityProgramación y desarrollogithub.com

1mxffe/editor-reels

Edita un vídeo en bruto de cámara hablada del despacho Gutmann & Silva en formato Reel vertical (1080×1920): transcribe, detecta cortes de silencio, muletillas y repeticiones, quema subtítulos estáticos por frase, superpone tarjetas gráficas cuando ayudan y renderiza un preview o la versión final.

¿Qué es editor-reels?

Este skill especializado convierte un vídeo de cámara hablada del despacho Gutmann & Silva en un Reel de Instagram completamente editado. Primero, transcribe el vídeo con faster-whisper (o acepta una transcripción ya preparada). Luego, el script analiza la transcripción y genera una lista de cortes automáticos de silencio, muletillas y repeticiones, que el usuario puede revisar y aceptar o rechazar. Durante el proceso, también puede añadir tarjetas gráficas informativas (por ejemplo, plazos o condiciones) en puntos estratégicos, siempre con aprobación del usuario. Las tarjetas se renderizan con la marca del despacho (colores y tipografías definidos en brand/brand.json). Finalmente, el vídeo cortado se renderiza en formato preview (540×960) o final (1080×1920), con subtítulos estáticos por frase (sin efectos palabra a palabra) y la portada generada automáticamente a partir del mejor fotograma (a elección del usuario) o mediante una herramienta de composición impulsada por Playwright. El skill está diseñado para entornos macOS/Linux, requiere Python ≥3.11, ffmpeg, y opcionalmente Node.js y Chromium para las tarjetas y la portada automática. Todo el flujo es reversible: los cortes se guardan en un archivo JSON que se puede modificar manualmente, y el vídeo original nunca se altera.

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

Installed? Explore more Programación y desarrollo skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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 en cortes.json y 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. Sin faster_whisper, avisa que la transcripción automática no está disponible: pide pip install -r requirements.txt o un transcricao.json ya preparado, y continúa. Sin el elemento de gráficos (chromium + playwright) o sin node, continúa sin tarjetas y explica cómo instalar (references/graficos.md). Sin Pillow o sin node, la portada automática (pasos 9 y 10) no se ejecuta: pide pip 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).

  1. Genera la semilla solo si brand/brand.json no existe: python3 -I scripts/brand.py seed brand/brand.json. Viene de brand/guia-visual.md (azul marino #001931, Poppins, subtítulo estático). El seed es 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 el check indique, sin --force.
  2. 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.
  3. Graba cada respuesta en brand/brand.json y confírmalo con brand.py check. Los @ no tienen semilla: no inventes; deja handles vacío hasta que el usuario los proporcione. Cuando los proporcione, grábalos con python3 -I scripts/brand.py set-handles brand/brand.json @perfil [@perfil2].

Flujo

  1. Crea projects/<slug>/ (slug corto del tema) y copia el vídeo a projects/<slug>/entrada.<ext>.

  2. python3 -I scripts/transcribe.py projects/<slug>/entrada.<ext> projects/<slug>/transcricao.json Si el doctor indicó READY WITH LIMITS (falta faster-whisper): instálalo con pip install faster-whisper antes de transcribir, o pide un transcricao.json ya preparado. Un vídeo sin audio falla aquí: pide otro archivo.

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

  4. 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) en projects/<slug>/decisions.json y ejecuta python3 -I scripts/review_apply.py apply projects/<slug> projects/<slug>/decisions.json (el corte queda guardado en revisao.json y puede revertirse); nunca edites cortes.json manualmente.

  5. 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.json según references/graficos.md (título hasta 60, cuerpo hasta 140, at en la línea de tiempo recortada, 1–6 s, imagen de materiais/ si existe). Sin tarjeta, salta este paso.

  6. python3 -I scripts/render.py projects/<slug> preview y entrega la ruta de projects/<slug>/saida/preview.mp4 (540×960).

  7. 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 (el open simple puede abrir Safari, que no da acceso a la carpeta); en Linux xdg-open review/review.html si el predeterminado es Chromium/Chrome, si no google-chrome review/review.html — y pide al usuario que elija la carpeta projects/<slug>/. Antes, genera la vista de lectura: python3 -I scripts/review_apply.py build projects/<slug>. Detalles en references/revisao.md.

  8. "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> y python3 -I scripts/render.py projects/<slug> preview; dile al usuario que toque "Recargar review.json". Si el apply falla (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 el decisions.json en el mismo formato.

  9. 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 (graba capa/foto.png). Muestra los archivos capa/candidato-N.png y 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 en references/capa.md.

  10. Portada — componer (una vez elegido el fotograma). Detalles en references/capa.md. (a) @ obligatorio: si handles de brand/brand.json está vacío, pregunta el @ una vez y grábalo con python3 -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 skill figma-use antes de use_figma, duplica el frame 272:2 del archivo POSTS-OUTUBRO, cambia la foto y los textos, añade el @ y exporta PNG 1× a projects/<slug>/capa/capa.png (paso a paso en references/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" (o capa/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 el capa.png al 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).

Skills relacionados