Communitygithub.com

video-lite

Crea vídeos narrados cortos con gráficos en movimiento reales (títulos animados, texto cinético, símbolos dibujados, geometría sagrada, diagramas, cuadrículas de iconos, transiciones, partículas) usando Python + pycairo + ffmpeg + espeak-ng, sin Node, navegador ni GPU. Diseñado para máquinas antiguas de 32 bits (i686, 2 GB RAM). Úsalo para videos explicativos, historias, listas, promociones o demostraciones MP4 con voz, música de fondo y efectos de sonido.

¿Qué es video-lite?

Video Lite v2 es una herramienta de generación de video programática que transforma un pequeño archivo JSON de storyboard en un video MP4 completo con gráficos vectoriales en 2D, locución y banda sonora. Está diseñada específicamente para hardware antiguo (procesadores Pentium M, 2 GB RAM) y funciona sin Node.js, Chromium, GPU ni conexión a red. Utiliza pycairo para renderizar cada fotograma como arte vectorial, ffmpeg para la codificación de video y espeak-ng o MBROLA para la síntesis de voz (compatible con portugués brasileño, inglés y español). El generador de video incluye múltiples tipos de escenas (títulos, texto cinético, viñetas, diagramas de rueda, geometría sagrada) con transiciones y efectos de cámara programáticos, y es controlado completamente a través de un archivo JSON de storyboard. Es ideal para creadores de contenido que necesitan producir videos explicativos, promocionales o educativos desde máquinas con recursos limitados, sin depender de servicios en la nube ni software moderno pesado.

Compatible con✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jazzautomations/video-lite/tree/HEAD

Preguntar en tu IA favorita

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

Documentación

Video Lite v2

Un MP4 terminado a partir de un pequeño storyboard JSON. Cada fotograma es arte vectorial dibujado con cairo (texto suavizado, símbolos, geometría, destellos, partículas, movimientos de cámara, transiciones de escena) y codificado con ffmpeg; la voz es espeak-ng/MBROLA (pt-BR e inglés) sobre una suave base de música procedural que baja su volumen bajo la voz, con efectos de sonido whoosh/pop en cortes y revelaciones. Funciona en un Pentium M antiguo: ~90 s de video 720p en unos 7–8 min (borrador 480p: ~4 min). Sin Node, Chromium, GPU, modelos ni red.

<skill-dir> a continuación es la carpeta de este SKILL.md. Ejecuta cada comando desde la carpeta del proyecto del usuario; las salidas van allí.

Camino dorado: haz exactamente esto, en orden

# 1. Revisa la máquina UNA VEZ (también mide su velocidad, ~1 min). Dice qué falta y cómo arreglarlo.
python3 <skill-dir>/scripts/doctor.py
#    ¿Sin voz? En Debian/Ubuntu/antiX esto instala espeak-ng + MBROLA pt-BR en ~/.local, sin root:
bash <skill-dir>/scripts/setup_voice.sh

# 2. Comienza desde un FORMATO (el trabajo) y un TEMA (la sensación):
python3 <skill-dir>/scripts/compose.py formats   # explainer-motion / story / listicle / explainer / promo / demo
python3 <skill-dir>/scripts/compose.py themes    # mystic, neon, terminal-green, sunset, ocean, paper, mono
python3 <skill-dir>/scripts/compose.py new --format explainer-motion --theme neon --out storyboard.json
#    Luego edita storyboard.json: cada espacio "TROQUE:" debe convertirse en contenido real para ESTE
#    video (el render rechaza sobrantes). Puedes agregar, eliminar o reordenar escenas libremente.
#    Ritmo de narración: alrededor de 14 caracteres por segundo. Una idea por escena, 1–2 oraciones.

# 3. Renderiza. Bloquea hasta que el MP4 esté escrito. --draft = 480p, más rápido: úsalo primero en máquinas antiguas.
python3 <skill-dir>/scripts/render.py storyboard.json --out video.mp4 --draft
python3 <skill-dir>/scripts/render.py storyboard.json --out video.mp4
#    Opcional: mira UN fotograma antes de un render largo (escribe video.png):
python3 <skill-dir>/scripts/render.py storyboard.json --out video.mp4 --still 12.5

# 4. Verifica el archivo real (duración, flujos de video+audio) y MIRA el PNG de la hoja de contactos.
python3 <skill-dir>/scripts/verify.py video.mp4 --require-audio

NO escribas pipelines de ffmpeg manualmente ni dibujes fotogramas tú mismo: render.py maneja el diseño, el ajuste de texto, la animación, el tiempo y la sincronización. Si un paso falla, lee su mensaje: dice qué cambiar. ¿Máquina lenta y apurado? render.py ... --fast (menos partículas, sin movimiento de cámara).

Storyboard

{
  "theme": "mystic",
  "voice": "mb-br3",
  "scenes": [
    {"kind": "title", "title": "O Caibalion", "subtitle": "os sete princípios herméticos", "symbol": "☿",
     "narration": "Conheça o Caibalion e seus sete princípios."},
    {"kind": "kinetic", "text": "O Todo é *Mente*",
     "narration": "O primeiro princípio diz: o Todo é mente."},
    {"kind": "bullets", "title": "Na prática", "bullets": ["observe seus pensamentos", "mude o foco", "repita"],
     "narration": ["Observe seus pensamentos.", "Mude o foco.", "E repita todo dia."]},
    {"kind": "wheel", "title": "Os sete princípios", "center": "☿",
     "nodes": ["Mentalismo", "Correspondência", "Vibração", "Polaridade", "Ritmo", "Causa e Efeito", "Gênero"],
     "narration": "Mentalismo, correspondência, vibração, polaridade, ritmo, causa e efeito e gênero."},
    {"kind": "cta", "title": "Leia o livro", "subtitle": "domínio público desde 1908",
     "narration": "Leia e tire suas conclusões."}
  ]
}

Nivel superior: theme, voice (pt-br, en-us, es… o MBROLA mb-br3 / mb-br1 / mb-br4, mucho menos robótico; con pt-br, se usa mb-br3 cuando está instalado; "none" = silencio). La velocidad de habla la define render.py (~14 caracteres/s); "speed": 0.9–1.15 la ajusta (rate de v1 se ignora). Opcional: transition para cada escena, "music": false (sin base de acordes suave bajo la voz), "sfx": false (sin whoosh/pop/riser), "captions": true (muestra la narración como subtítulos; desactivado por defecto: la pantalla muestra las palabras clave, la voz cuenta el resto).

Cada escena: kind (abajo), narration, seconds opcional (por defecto: la narración + una pausa corta; solo puede alargar una escena), transition opcional (fade | slide | zoom | wipe | iris | cut; por defecto: la rotación del propio tema), camera opcional (auto zoom/pan lento, o none).

Sincroniza elementos con la voz: narration puede ser una lista de oraciones. Cuando una escena de tipo bullets, wheel, icons o split tiene N elementos y la narración tiene N oraciones (o N+1: una intro primero), el elemento k aparece exactamente cuando comienza la oración k:

{"kind": "bullets", "title": "Por quê", "bullets": ["roda em PC velho", "modelos grátis", "testa tudo"],
 "narration": ["Três motivos.", "Roda em computador velho.", "Usa modelos grátis.", "E testa antes de dizer pronto."]}

No pongas enlaces, correos electrónicos ni rutas de archivo en narration (el render lo rechaza): muéstralos en pantalla (subtítulo de cta). Mantén cada oración por debajo de ~110 caracteres.

Tipos de escena (compose.py kinds imprime esta lista)

kindlo que vescampos
titletítulo grande palabra por palabra, subrayado dibujado, símbolo opcional arribatitle, subtitle, symbol (opc.)
bulletstítulo + elementos uno por uno, cada uno con un iconotitle, bullets: ["texto", {"text": "…", "icon": "fa-rocket"}]
terminalventana de terminal escribiendolines: ["$ comando", "salida"]
quotegran comilla, palabras aparecen, autor se deslizatitle (la cita), subtitle (autor)
ctallamado final: título aparece, subtítulo en botón brillantetitle, subtitle, symbol (opc.)
symbolUN símbolo enorme dibujado trazo a trazo, luego relleno + brillo, anillo de halosymbol, title, subtitle, spin (true/false)
geometrygeometría sagrada dibujada progresivamente, luego brillashape (un nombre o una lista), title, subtitle, labels (solo para arrows)
wheelN nodos (2–12) en un círculo revelados uno por uno con líneas al centro; el actual brillatitle, nodes: ["a", {"label": "b", "icon": "fa-cog"}], center (palabra o símbolo), active (1..N: resalta ese nodo)
iconscuadrícula de 1–8 iconos con etiquetas que aparecentitle, items: [{"icon": "fa-cogs", "label": "motor"}]
kineticpalabras grandes aparecen sincronizadas con la voz; *palabra* = color de acento + brillotext
splitcolumna de texto + ilustración al otro ladotitle, text o bullets, y symbol O shape, side (right/left: dónde va el arte)

Nombres de shape: circle, triangle, triangle-down, square, hexagon, hexagram, pentagram, flower (flor de la vida), seed (semilla de la vida), vesica, spiral (áurea), eye (ojo en el triángulo), ouroboros, wave (vibración), pendulum (ritmo), arrows (causa → efecto; usa "labels": ["causa", "efecto", "causa"]). Combina: "shape": ["circle", "hexagram"].

symbol / icon / center aceptan (compose.py symbols lista todos los nombres):

  • un carácter: "☿", "☤", "☯", "✡", "⚖", "∞", "🜂" (alquimia), "♀", "☉", "☽"…
  • un nombre de Font Awesome 4: "fa-cogs", "fa-book", "fa-rocket", "fa-lightbulb-o", "fa-globe", "fa-terminal"…
  • un símbolo con nombre: "mercurio", "caduceu", "yin-yang", "balanca", "fogo", "agua", "olho"…
  • un emoji: "🔥", "🚀", "💡" (color; se muestra con un pop, no dibujado trazo a trazo).

Un ejemplo completo de ~90 s (hermetismo, tema mystic, cada tipo de ilustración): <skill-dir>/examples/caibalion.json.

Buen gusto, rápidamente

  • Varía los tipos: nunca 3 escenas del mismo tipo seguidas; alterna las que tienen mucho texto (bullets, split) con las visuales (symbol, geometry, kinetic, wheel).
  • Títulos cortos (≤ 5 palabras), subtítulos ≤ 10 palabras, viñetas ≤ 6 palabras cada una, como máximo 5 viñetas.
  • Una lista de N cosas: una vista general con wheel, luego una escena por elemento (symbol/geometry), o wheel de nuevo con "active": k.
  • Temas: mystic (índigo/dorado, serifa, estrellas), neon (magenta/cian, rejilla sintética), terminal-green (código), sunset, ocean, paper (claro, serifa), mono.

Pruebas

python3 <skill-dir>/scripts/selftest.py renderiza cada tipo de escena por un momento en borrador y verifica el MP4 con ffprobe (código de salida 0 = ok). --voice también prueba espeak + subtítulos.

Skills relacionados