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)
| kind | lo que ves | campos |
|---|---|---|
title | título grande palabra por palabra, subrayado dibujado, símbolo opcional arriba | title, subtitle, symbol (opc.) |
bullets | título + elementos uno por uno, cada uno con un icono | title, bullets: ["texto", {"text": "…", "icon": "fa-rocket"}] |
terminal | ventana de terminal escribiendo | lines: ["$ comando", "salida"] |
quote | gran comilla, palabras aparecen, autor se desliza | title (la cita), subtitle (autor) |
cta | llamado final: título aparece, subtítulo en botón brillante | title, subtitle, symbol (opc.) |
symbol | UN símbolo enorme dibujado trazo a trazo, luego relleno + brillo, anillo de halo | symbol, title, subtitle, spin (true/false) |
geometry | geometría sagrada dibujada progresivamente, luego brilla | shape (un nombre o una lista), title, subtitle, labels (solo para arrows) |
wheel | N nodos (2–12) en un círculo revelados uno por uno con líneas al centro; el actual brilla | title, nodes: ["a", {"label": "b", "icon": "fa-cog"}], center (palabra o símbolo), active (1..N: resalta ese nodo) |
icons | cuadrícula de 1–8 iconos con etiquetas que aparecen | title, items: [{"icon": "fa-cogs", "label": "motor"}] |
kinetic | palabras grandes aparecen sincronizadas con la voz; *palabra* = color de acento + brillo | text |
split | columna de texto + ilustración al otro lado | title, 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), owheelde 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.