Communitygithub.com

shorts-video-studio

Crea videos profesionales verticales (9:16) estilo YouTube Shorts / Reels / TikTok con Python, sin necesidad de editor, incluyendo guión investigado (Hinglish/Hindi/Inglés), voz con ElevenLabs, sincronización palabra a palabra, gráficos animados multi-fuente y multi-paleta, íconos emoji de color reales, 8 transiciones, subtítulos cinéticos, música y efectos de sonido sintetizados con ducking de voz y una puerta de QA visual.

¿Qué es shorts-video-studio?

Esta skill permite a un agente de IA (como Claude Code, Cursor o Codex) producir videos cortos verticales de 30 a 60 segundos en formato 1080x1920 MP4, junto con subtítulos SRT y el guión, completamente mediante código Python (OpenCV, PIL, ffmpeg). Está diseñada para crear contenido que no parezca generado por IA ni con plantillas, aplicando reglas estrictas de variedad visual: cada escena usa una técnica de fondo y paleta de colores diferente, al menos 7 fuentes distintas, 5 tratamientos de texto, íconos emoji reales animados, 8 o más transiciones únicas, y movimiento constante. El proceso incluye investigación web, escritura de guión con gancho inicial y ritmo rápido, generación de voz mediante la API de ElevenLabs (requiere `ELEVENLABS_API_KEY`), sincronización precisa de palabras mediante detección de picos de energía silábica, y una rigurosa puerta de QA que verifica duración, resolución, volumen (LUFS), pico verdadero, overlay de seguridad y variedad de estilos. El motor de animación por claves (cue-based) asegura que los elementos visuales aparezcan exactamente en la palabra hablada. La skill incluye scripts de referencia, una biblioteca de diseño con 15 fuentes, paletas y transiciones, y maneja casos difíciles como la sincronización en voces rápidas o pausadas, y la instalación de dependencias en entornos Python modernos con entornos virtuales.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mohdkhatab/shorts-video-studio/tree/HEAD/skills/shorts-video-studio

Preguntar en tu IA favorita

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

Documentación

Shorts Video Studio

Produce un video MP4 de 30 a 60 s, 1080x1920, junto con archivos SRT y guión. Todo es procedural (Python + OpenCV + PIL + ffmpeg), impulsado por un motor de animación basado en claves (cues) para que los elementos visuales coincidan exactamente con la palabra hablada.

Archivos en esta skill

  • scripts/shorts_engine_template.py - motor de referencia funcional (9 escenas, 9 fondos, 8 transiciones, audio, sincronización de voz). Cópialo y edítalo; no lo reescribas desde cero.
  • scripts/tts_elevenlabs.py - genera la locución mediante la API REST (necesita ELEVENLABS_API_KEY). Usa --check y --list-voices primero.
  • scripts/review_frames.py - genera una hoja de contactos + evidencia de QA: duración, códec, resolución, LUFS integrado, rango de sonoridad, pico verdadero. Termina con código distinto de cero si falla.
  • scripts/setup.sh - crea .venv, instala dependencias, verifica ffmpeg y fuentes. Ejecuta source .venv/bin/activate después.
  • assets/fonts/ - 15 archivos de fuente OFL-1.1 / 12 familias + Noto Color Emoji (íconos reales). Licencias incluidas, indexadas en assets/fonts/LICENSES.md.
  • references/design-bible.md - paletas, fuentes, vocabulario de íconos, fondos, transiciones, efectos, cuadrícula de diseño. Léelo antes de diseñar escenas.
  • references/script-and-voice.md - fórmula del guión, reglas de Hinglish, reglas de verificación de datos, detalles de voz y alineación. Léelo antes de escribir el guión.

Tubería (realiza los pasos en orden)

  1. Investigación - si el tema es noticia/tendencia, busca en la web 3+ fuentes, recopila datos con fechas y cifras ("al "). Nunca inventes cifras. Marca las afirmaciones que no puedas verificar y suaviza el lenguaje ("según el reporte").
  2. Guión - 120-140 palabras para ~45-50 s, gancho en los primeros 2.5 s, 7-9 bloques cortos, CTA al final. Consulta script-and-voice.md. Guárdalo como script.txt (un párrafo por escena).
  3. Plan de escenas - una escena por párrafo. Para cada escena decide: estilo de fondo, paleta, 2 fuentes, íconos (emoji), animación principal, palabras clave (cues), transición a la siguiente. Aplica las REGLAS DE VARIEDAD a continuación. Escribe el plan en plan.md.
  4. Voz - genera UNA toma de locución de todo el guión (tts_elevenlabs.py o el MCP de ElevenLabs). Guárdalo como voice.mp3. Si no puedes descargar el audio (sandbox), pide al usuario que suba el archivo; mientras tanto, construye con tiempos estimados.
  5. Construcción - copia la plantilla a video.py, reemplaza el texto de SCENES, escribe las funciones bgN/dN, establece HIT y TRANS. Usa búsquedas de claves C(scene_idx, "palabrahablada", ocurrencia, segundos_predeterminados) para cada inicio de animación.
  6. Render de prueba - TEST=1 python video.py escribe PNGs (estado final, estado intermedio y un fotograma por transición). Ejecuta review_frames.py / revísalos. Corrige todo lo que la puerta de QA marque.
  7. Render final - VOICE=voice.mp3 python video.py. Ejecútalo en segundo plano (setsid nohup ... &) y monitorea el registro; las llamadas en primer plano pueden ser canceladas por los timeouts de la herramienta. ~1.5-3 min por 50 s en un solo CPU. La mezcla se normaliza automáticamente en sonoridad a LUFS (por defecto -16).
  8. Puerta de QA (abajo) sobre el mp4 final, luego entrega video.mp4, captions.srt, script.txt, plan.md, qa_report.md.

REGLAS DE VARIEDAD (esto es lo que hace que parezca hecho por humanos, no por IA)

Violar cualquiera de estas es un FALLO en la puerta de QA.

  • Cada escena tiene su propia técnica de fondo y paleta (rayos, rejilla synthwave, ráfaga de medios tonos, lluvia de código, gradiente + manchas, rejilla de plano, rayas de peligro, anillos de radar, confeti...). Nunca dos vecinas iguales. Nunca un solo color global.
  • >= 7 fuentes diferentes en todo el video, combinando categorías: condensada de impacto, display gruesa, display ancha, grotesca, serif, serif itálica, monoespaciada, pixel, manuscrita. Máximo 2-3 fuentes dentro de una escena.
  • >= 5 tratamientos de texto diferentes: relleno degradado, contorno grueso + sombra offset dura, brillo, rebote letra por letra, máquina de escribir, fichas adhesivas/píldoras, sello rotado, inclinación manuscrita.
  • Íconos reales, no formas geométricas: emoji de color (Noto Color Emoji) como íconos, animados (aparecer con rebasamiento, giro, flotar, orbitar, balanceo). Nunca entregues escenas solo con texto. Nunca uses logotipos de marca (Adobe, GitHub octocat, etc.); usa íconos genéricos.
  • 8+ transiciones diferentes, una por cambio de escena: fallo (glitch), barrido panorámico borroso, zoom a través, iris + anillo, cortina de lamas, destello + sacudida, pixelado, empujar hacia arriba. Nunca uses la misma dos veces.
  • Momentos de impacto reciben efectos combinados: explosión de chispas + anillo de onda expansiva + sacudida de cámara + división RGB + efecto de sonido boom.
  • Subtítulos: 2-3 palabras a la vez, grandes y negritas con contorno grueso, palabra actual resaltada en el color de la escena, pequeña escala de rebote en cada fragmento.
  • Movimiento en todo: nada aparece sin animación, nada permanece completamente quieto (balanceo / flotación / zoom lento 0 -> 3.5%).

Diseño y zonas seguras (lienzo de trabajo 720x1280, ampliado a 1080x1920)

  • Parte superior 0-130 px: mantener libre (UI de la plataforma). Chip de etiqueta solo en y~62.
  • Zona de contenido y 150-830. Centro de zona de subtítulos y = 950 (H-330). Parte inferior 250 px: libre (UI de la plataforma).
  • Ancho presupuestado 640 px. Usa TXF(texto, tamaño, fuente, maxw) para cualquier línea que pueda desbordarse. Ancho estimado = caracteres x 0.55-0.75 x tamaño según la fuente (fuentes display anchas ~0.75).
  • Contadores: tamaño de fuente fijo, nunca se reducen automáticamente mientras cuentan (evita vibración).

Voz + sincronización (resumen; detalles en referencias)

  • Una sola toma, luego alinear: apply_voice_peaks detecta picos de energía silábica y los empareja mediante DP con las sílabas del guión (estable dentro de ~0.2 s). ALIGN=pauses es el plan de respaldo para voces lentas con pausas claras.
  • Las claves (cues) usan la primera palabra cuyo texto en minúsculas y sin puntuación comienza con el token (dígitos: coincidencia exacta). Usa occurrence para palabras repetidas.
  • El inicio de la escena = primera palabra de la escena - 0.45 s. La duración total sigue a la voz (+1.2 s de cola).
  • La música se sintetiza (pad + bombo + hi-hats + bajo + arpegio) y se atenúa ~55% debajo de la voz; la voz recibe paso alto + compresión + loudnorm (-15 LUFS). Silbido (whoosh) en cada transición, boom en impactos, tic-tac de escritura, timbre en contadores, pop en CTA.

Puerta de QA (un juez/agente de QA debe pasar TODOS antes de la entrega)

  1. python scripts/review_frames.py out/video.mp4 out/contact.png 12 debe imprimir PASS (termina con código distinto de cero en caso contrario). La sonoridad y el pico provienen de ahí, no de volumedetect.
  2. Duración 30-60 s, 1080x1920, h264+aac, sonoridad integrada aproximadamente -18 a -13 LUFS, pico verdadero < -1 dBTP (sin recorte).
  3. Hoja de contactos de >= 9 fotogramas + cada fotograma de transición revisado: sin texto recortado/desbordado, sin elementos superpuestos, nada en los 130 px superiores o 250 px inferiores excepto etiqueta/subtítulos, subtítulos legibles en todos los fondos.
  4. Reglas de variedad cumplidas (enumera las fuentes, paletas, fondos y transiciones realmente usadas en plan.md).
  5. Datos: cada número/fecha/nombre en el guión debe ser rastreable hasta una fuente anotada en plan.md; afirmaciones suavizadas donde no verificadas; sin redacción de "copiar"/"robar" a menos que tenga fuente; limitaciones declaradas cuando corresponda.
  6. Verificación puntual de sincronización: elige 5 claves (palabra de gancho, un número, un nombre, una transición, CTA) y confirma que el elemento visual comienza dentro de 0.25 s de la palabra hablada (compara tiempos de SRT/SW con marcas de tiempo de fotogramas). Si alguna verificación falla: corrige, vuelve a renderizar, vuelve a ejecutar la puerta. Informa honestamente los problemas restantes conocidos.

Errores ya encontrados (evitar)

  • pip install en el Python del sistema falla en Debian/Ubuntu modernos (externally-managed-environment, PEP 668). Usa scripts/setup.sh (crea .venv) y source .venv/bin/activate; no uses --break-system-packages.
  • Comparar mean_volume de ffmpeg volumedetect (dBFS no ponderado) contra un objetivo LUFS no tiene sentido e hizo que compilaciones anteriores fallaran su propia puerta. Siempre mide con ebur128 (review_frames.py ya lo hace).
  • Image.fromarray sobre una imagen PIL o sobre un recorte no contiguo -> TypeError: expected string or buffer. Mantén los sprites como arrays numpy contiguos; rcard() devuelve una imagen PIL, no un array.
  • Rebanadas de array vacías en cv2.add -> error de aserción; protege b > a antes de rebanar bandas.
  • Los procesos en segundo plano iniciados sin setsid nohup mueren cuando la llamada de la herramienta regresa.
  • La generación de audio en sandbox (MCP) no puede ser descargada por el sandbox: pide al usuario que suba el mp3/wav.
  • La sincronización basada en pausas falla con voces de IA rápidas (solo se encuentran 4 pausas a -35 dB); la alineación por picos es la predeterminada por esa razón.
  • Ventanas de clave superpuestas: si dos elementos comparten una palabra hablada, desplaza el segundo 0.2-0.4 s.
  • Emoji con selectores de variación (por ejemplo, escudo, advertencia) se renderizan bien con embedded_color=True; redimensiona con INTER_AREA para reducir / INTER_CUBIC para ampliar.
  • Una fuente faltante cae silenciosamente en DejaVu/Liberation con una línea [warn] - revisa el registro de renderizado en busca de [warn] antes de culpar al diseño.

Skills relacionados