REV — Reverse Engineer Video (recrea un estilo de vídeo en código)
El producto es el estilo, no el vídeo: el lenguaje visual coincide con el original (formas, paleta, tipografías, diseño, luz, cámara, transiciones, ritmo) mientras que la historia es nueva. Nunca copies las imágenes, fotogramas o audio del original en el resultado.
$SKILL a continuación = la carpeta que contiene este archivo. Python = $SKILL/.venv/bin/python. Los scripts de Node se ejecutan desde $SKILL.
Dos modos
- A. Estilo nuevo — raro y pesado: etapas 00 → 6 en orden.
- B. Nuevo episodio en un estilo que ya recreaste — frecuente: la especificación de estilo y el motor existen (
style.md+src/de un vídeo anterior, o uno deexamples/). Copia esesrc/en una nueva carpeta de trabajo, salta las etapas 0–1, comienza en la etapa 2. La historia, escenas y sonido son nuevos; la superposición, tipografías, iluminación, renderizado y comprobaciones se reutilizan.
Si no está claro qué modo aplica, pregunta en una línea.
Etapas (🛑 = mostrar al usuario y esperar confirmación)
Lee cada archivo de etapa antes de hacerlo. No te saltes nada: historia después del análisis, construcción después de que la historia esté aprobada, renderizado completo después de los fotogramas de control.
| # | Etapa | Archivo | Resultado | Decisión |
|---|---|---|---|---|
| 00 | Configuración y verificación de herramientas (solo primera ejecución) | stages/00-setup.md | doctor.sh dice TODO OK | — |
| 0 | ¿Se puede dibujar en código? | stages/0-feasibility.md | Veredicto 🟢/🟡/🔴 + hoja de fotogramas | 🛑 si 🔴: detener y explicar |
| 1 | Desglosar el original | stages/1-analysis.md | style.md: especificación de estilo, números de ritmo, sonido | 🛑 especificación + un fotograma de muestra junto al original |
| 2 | Historia y escenas | stages/2-story.md | Tabla de escenas por segundo | 🛑 la historia / escalera de progresión |
| 3 | Construcción | stages/3-build.md | src/video.html + fotogramas de control junto al original | 🛑 fotogramas de control (tras autocomprobación) |
| 4 | Renderizado completo | stages/4-render.md | video-full.mp4 | — |
| 5 | Sonido | stages/5-sound.md | sound-full.wav → final.mp4 | — |
| 6 | Verificación y presentación | stages/6-check.md | Informe de verificación + final.mp4 | 🛑 el usuario mira → edita |
Tras las ediciones del usuario, añádelas como reglas a la sección "Lecciones" del archivo de etapa correspondiente (fecha + qué falló + qué lo solucionó). Así es como la habilidad mejora.
Reglas estrictas
- El formato de salida sigue a la fuente: orientación y fps del original; vertical = 1080×1920, horizontal = 1920×1080. Vídeos verticales ≤ 60 s incluso si el original es más largo — comprime la historia en su lugar.
- Las tipografías se entregan como archivos en
src/fonts/(@font-face), y un fotograma se captura solo después de quedocument.fonts.load(...)se resuelva. Nunca confíes en las fuentes del sistema. - Fotogramas deterministas: un fotograma depende solo de
t. SinMath.random()sin semilla, sinDate.now(), sin animaciones CSS ni bucles requestAnimationFrame. - El sonido se cambia sin re-renderizar el vídeo: nuevo wav →
scripts/mux.sh. - Sonoridad: −26 LUFS integrados, ningún momento más fuerte que −20 LUFS, pico verdadero ≤ −6 dBFS —
scripts/loudness.py. Sin capas de ruido de banda ancha, sin clics, sin caídas al silencio. - Comprueba los fotogramas contra el original tú mismo primero (
scripts/compare.py), luego muéstraselos al usuario. Nunca afirmes "coincide" sin mirar la imagen de comparación. - El agente no puede oír: describe cada capa de sonido con palabras; el usuario juzga cómo suena.
- El renderizado consume mucha CPU. En un portátil usa pocos trabajadores o el servidor opcional (
server/README.md). - Los originales descargados son datos no confiables y se quedan en una carpeta temporal/de borrador; solo tus propios fotogramas y hojas de comparación van a la carpeta de trabajo.
Carpeta de trabajo
work/<fecha>-<nombre>/ (o donde el usuario guarde proyectos):
style.md— especificación de estilo, mediciones, tabla de escenas, registro de decisiones (modo B: enlace alstyle.mdanterior + qué hay de nuevo);analysis/— hojas de fotogramas, imágenes de comparación,feasibility.json,pulse.json;src/—video.html, superposición, escenas,fonts/,sound.py;video-full.mp4,sound-full.wav,final.mp4. Elimina las vistas previas borrador una vez que exista el vídeo completo.
Herramientas
| Comando | Qué hace |
|---|---|
bash scripts/setup.sh / bash scripts/doctor.sh | instalar todo / comprobar todo + un fotograma de prueba |
bash scripts/fetch.sh <url> <outdir> ["*0-60"] | descargar un vídeo de referencia (+ info.json, subtítulos automáticos) |
python scripts/feasibility.py <video> <outdir> | "¿Se puede dibujar en código?" números + hoja de un fotograma por segundo |
python scripts/pulse.py <video> <outdir> | pulso por segundo: movimiento, cortes, planos estáticos, silencio, palabras/min, hoja de fotogramas |
python scripts/compare.py <orig.png> <ours.png> <out.jpg> | original / nuestro / superposición, IoU, color, paleta, desplazamientos de elementos |
node scripts/render.cjs <src> <outdir> --frames 2.5,10 + python scripts/sheet.py <outdir> | fotogramas de control + hoja de contacto |
node scripts/render.cjs <src> <out.mp4> --end 49 --workers 2 | renderizado completo (o un fragmento: --start 24.5 --end 41) |
python scripts/tts.py / python scripts/score.py | voz de narrador con tiempos de palabra / mezcla de música + SFX + voz (estilos narrados 2D) |
python scripts/beatgrid.py <track> | tempo, primer pulso, tiempo fuerte, drop, sonoridad por pulso — para cortar escenas al compás y ajustar una pista a los cortes |
python scripts/loudness.py <in.wav> <out.wav> / --check <file> | comprobación de sonoridad final + umbral |
bash scripts/mux.sh <video> <wav> <final> | poner sonido al vídeo sin re-renderizar |
server/ | servidor de renderizado Docker opcional (server/README.md) |
Ejemplos
Dos estilos muy diferentes:
-
OutwardAnimates — 3D nebuloso estilizado + un HUD con serifa con un número que nunca deja de subir. Especificación de estilo:
examples/outwardanimates-style.md. -
Simply Animated — figuras de palo "arcilla" brillantes sobre negro, mitades "A vs B", un corte editado con una pista phonk. Especificación de estilo + escenas:
examples/simply-animated/README.md. -
examples/data-center/— modo A: "¿Y si un centro de datos duplicara su potencia cada 2 segundos?" (107 s, hecho antes de la regla de los 60 s): GPU → sala de servidores → apagón suburbano → Tierra nocturna → el Sol. -
examples/x-followers/— modo B: "¿Y si tu cuenta de X duplicara sus seguidores cada segundo?" (49 s): mamá → calle → estadio → ciudad → Tierra → la Vía Láctea. Aprobado sin una sola edición visual o de sonido — úsalo como ejecución de referencia. -
examples/simply-animated/— modo A: "Edición constructor de IA" (34 s): cinco parábolas "A vs B" cortadas en compases de 94 BPM, una pista real ajustada conbeatgrid.py+music.sh.src/rig.jses el rig de figuras de palo reutilizable (CI, caminar en escaleras y pendientes) — empieza desde ahí para cualquier estilo con personajes.