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 (necesitaELEVENLABS_API_KEY). Usa--checky--list-voicesprimero.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. Ejecutasource .venv/bin/activatedespués.assets/fonts/- 15 archivos de fuente OFL-1.1 / 12 familias + Noto Color Emoji (íconos reales). Licencias incluidas, indexadas enassets/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)
- 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").
- 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 comoscript.txt(un párrafo por escena). - 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. - Voz - genera UNA toma de locución de todo el guión (
tts_elevenlabs.pyo el MCP de ElevenLabs). Guárdalo comovoice.mp3. Si no puedes descargar el audio (sandbox), pide al usuario que suba el archivo; mientras tanto, construye con tiempos estimados. - Construcción - copia la plantilla a
video.py, reemplaza el texto de SCENES, escribe las funcionesbgN/dN, estableceHITyTRANS. Usa búsquedas de clavesC(scene_idx, "palabrahablada", ocurrencia, segundos_predeterminados)para cada inicio de animación. - Render de prueba -
TEST=1 python video.pyescribe PNGs (estado final, estado intermedio y un fotograma por transición). Ejecutareview_frames.py/ revísalos. Corrige todo lo que la puerta de QA marque. - 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 aLUFS(por defecto -16). - 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_peaksdetecta 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=pauseses 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
occurrencepara 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)
python scripts/review_frames.py out/video.mp4 out/contact.png 12debe imprimir PASS (termina con código distinto de cero en caso contrario). La sonoridad y el pico provienen de ahí, no devolumedetect.- Duración 30-60 s, 1080x1920, h264+aac, sonoridad integrada aproximadamente -18 a -13 LUFS, pico verdadero < -1 dBTP (sin recorte).
- 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.
- Reglas de variedad cumplidas (enumera las fuentes, paletas, fondos y transiciones realmente usadas en
plan.md). - 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. - 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/
SWcon 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 installen el Python del sistema falla en Debian/Ubuntu modernos (externally-managed-environment, PEP 668). Usascripts/setup.sh(crea.venv) ysource .venv/bin/activate; no uses--break-system-packages.- Comparar
mean_volumedeffmpeg volumedetect(dBFS no ponderado) contra un objetivo LUFS no tiene sentido e hizo que compilaciones anteriores fallaran su propia puerta. Siempre mide conebur128(review_frames.pyya lo hace). Image.fromarraysobre 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; protegeb > aantes de rebanar bandas. - Los procesos en segundo plano iniciados sin
setsid nohupmueren 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 conINTER_AREApara reducir /INTER_CUBICpara 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.