¿Qué hace animate?
Convierte referencias y una idea general en un MP4 donde cada fotograma está dibujado por código y el sonido está sintetizado. El usuario aporta el gusto; tú haces la dirección. Un brief aproximado es suficiente, así que toma las decisiones creativas por ti mismo y pregunta solo sobre lo que cambiaría toda la pieza.
Todo vive dentro de animations/<slug>/:
refs/ study/ style.md beats.md piece.html score.json out/<slug>.mp4
Agrega scripts auxiliares o notas allí según sea necesario. examples/bee-dance/ en la carpeta de este skill es un film completo y funcionante.
En los comandos siguientes, $SKILL significa la carpeta de este skill. Ejecútalos desde el proyecto del usuario con $SKILL/.venv/bin/python
si existe, de lo contrario python3. Si falta un paquete, consulta la configuración en README.md. Necesitan ffmpeg y Chrome.
Elegir el trabajo
| El usuario quiere | Trabajo | Cómo |
|---|---|---|
| "Animar esta imagen" | Mover la obra de arte | Cortar la imagen en capas y moverlas. Lee references/move-an-image.md. Omite piece.html de las etapas 3-4; el render es un script en Python. |
| "Pintar esto", "recrear esta escena" | Repintar | Dibuja toda la escena en piece.html, emparejando la referencia de cerca. |
| Un tema o historia "en este estilo" | Nueva película | Proceso completo a continuación. Las referencias establecen el aspecto; el tema es nuevo. |
Si no indican una duración o formato, usa 15 segundos a 1080x1920 para una película y 5 segundos para una imagen en movimiento.
El código es fuerte en formas, líneas, degradados y texturas: vectorial plano, arte lineal, papel recortado, risografía, acuarela, fondos de anime, láminas botánicas. Es débil en fotorrealismo y en rostros con actuación. Si una referencia es fotorrealista, dilo antes de construir y propón una versión ilustrada de la misma.
Etapa 1: Estudiar cada referencia
El usuario puede darte muchas referencias, así que asigna a cada una un rol en lugar de promediarlas todo en una mezcla.
python3 $SKILL/scripts/study.py animations/<slug>/study <archivos o carpetas...>
Esto te da, por referencia, una hoja de contactos, una paleta y, para videos, los cortes y la curva de ritmo. Si solo una parte
de un video importa, agrega su rango en segundos, como en "reel.mp4@0-12", o el material de cabezas parlantes sesgará los resultados.
Luego observa las hojas tú mismo, y recorta donde la textura importe. Los números no pueden decirte por qué algo se siente bien.
Escribe style.md:
- Qué nos da cada referencia, una línea cada una: textura de esta, tipo de aquella, ritmo de otra.
- Lo que no copiaremos: poses, personajes, logotipos, firmas, composiciones exactas. Toma el estilo, no la obra; la excepción es un trabajo de Repintar o Mover sobre una imagen que el usuario pidió animar.
- Paleta como valores hex, tipo (
assets/fonts/tiene dos para empezar, o copia cualquier fuente abierta), textura, sensación de movimiento. - Un dispositivo que une la pieza: una lente, una onda, una línea que nunca se rompe. Las películas sin uno parecen una presentación de diapositivas.
Agrega una tarjeta corta para cada nueva referencia a animations/library.md, para que sus lecciones sobrevivan a este proyecto. Reutiliza
tarjetas cuando el usuario apunte a un estilo que ya haya usado antes, y extiende una solo cuando aprendiste algo nuevo.
Puerta: puedes decir en una oración cómo se ve esta pieza y por qué eso sirve al tema.
Etapa 2: Ritmos
Si hay datos en la pieza, verifícalos primero. Una afirmación incorrecta dibujada hermosamente sigue siendo incorrecta, y los "datos" populares a menudo son imprecisos. Anota cualquier cosa que hayas suavizado para el informe final.
Escribe beats.md como una tabla. Imagen y sonido se planifican juntos porque esa sincronía es lo que hace que se sienta
costoso:
| Tiempo | Imagen | Sonido |
|---|---|---|
| 0-1.5 s | Una gota naranja cae y se expande | Goteo, floración húmeda, entra pad |
| 1.5-3 s | Línea de título, detalles aparecen | Punteo por palabra, pequeños tics |
Puerta: algo se mueve en el primer medio segundo; la forma es gancho, construcción, un respiro, recompensa; ningún tramo de más de 2 segundos sin una nueva idea visual; el final se sostiene unos 1.5 segundos para que pueda ser leído. Deja que la imagen lleve las ideas nuevas en lugar de las palabras: cada pie de foto necesita aproximadamente 1.5 segundos en pantalla, así que recorta los pies de foto antes de acortarlos. Mantén el texto fuera del 12% superior y 18% inferior de un marco vertical.
Etapa 3: Construir la imagen
Copia assets/piece-template.html a piece.html y dibuja en él. El contrato es window.PIECE más
window.renderFrame(t).
renderFrame(t) debe depender solo de t, y puede ser asíncrono. Las imágenes fijas saltan directamente a cualquier tiempo, así que cualquier cosa recordada
entre fotogramas, o cualquier Math.random() sin semilla, las rompe. Pinta capas estáticas costosas una vez dentro de window.ready,
a partir de un generador con semilla, luego compón por fotograma.
Para mostrar otra película dentro de una pieza, extrae sus fotogramas a clips/ como JPEG numerados, carga el que necesites con un
Image dentro de un renderFrame asíncrono, y dibújalo en el lienzo.
Lee references/styles.md antes de dibujar; tiene recetas funcionales (nubes cel, follaje, figuras caminando, agua,
acuarela, papel) y los archivos fuente para copiar. La profundidad proviene de capas que se mueven a diferentes velocidades, la vida
proviene de pequeños movimientos secundarios: balanceo, deriva, brillo, parpadeo.
Revisa las imágenes fijas temprano y a menudo, mucho antes de un render completo:
python3 $SKILL/scripts/render.py animations/<slug>/piece.html --stills 0.5 3 7 12
Míralas a tamaño completo, compáralas lado a lado con las referencias, y corrige lo que esté mal. Espera varias rondas. La primera imagen fija suele ser un borrador, y este bucle es de donde viene la calidad.
python3 $SKILL/scripts/compare.py animations/<slug>/out/compare.jpg <imágenes fijas e imágenes de referencia...>
Puerta: una imagen fija del medio parece hecha con los mismos materiales que las referencias: mismo papel, pintura, línea y color. El tema puede ser nuevo. Las versiones de clip-art de la referencia no pasan.
Etapa 4: Sonido
Escribe score.json con los mismos tiempos que beats.md. Consulta el encabezado de scripts/synth.py para los sonidos
disponibles: punteos, campanas, pads, goteos, tics, crescendos, soplidos, impactos, patadas y bases de ruido.
python3 $SKILL/scripts/synth.py animations/<slug>/score.json animations/<slug>/out/score.wav
Mantente en una tonalidad. Haz que los golpes caigan en eventos de imagen, no en una cuadrícula. Deja un silencio real antes de la recompensa, porque el contraste es lo que la hace funcionar. Genera largas series de notas con unas pocas líneas de Python en lugar de escribirlas una por una.
No puedes oírlo, así que lee el informe de nivel que imprime synth.py: busca caídas que no planificaste, y que el sonido característico
esté enterrado bajo el resto.
Si la pieza tiene narración
La narración va antes que la imagen, porque los tiempos de las palabras marcan cada ritmo. Grábala con la herramienta de voz que tenga el usuario, transcríbela con marcas de tiempo de palabras (faster-whisper funciona), luego construye los ritmos y pies de foto a partir de esos tiempos. Whisper puede empezar una palabra temprano en el silencio anterior, así que revisa la forma de onda antes de cortar una pausa.
Mezcla la voz sobre la partitura, luego renderiza con el resultado como --audio. La partitura baja bajo la voz, así que la música sube
en las pausas:
python3 $SKILL/scripts/mix.py animations/<slug>/out/voice.wav animations/<slug>/out/score.wav animations/<slug>/out/mix.wav
Etapa 5: Renderizar, revisar, corregir
python3 $SKILL/scripts/render.py animations/<slug>/piece.html --audio animations/<slug>/out/score.wav
python3 $SKILL/scripts/qc.py animations/<slug>/out/<slug>.mp4
render.py escribe out/<slug>.mp4, masterizado a -14 LUFS. Muestra el progreso, y toma aproximadamente 1-2 minutos para 15
segundos de una pieza típica; ejecútalo en segundo plano si la pieza es pesada. Después de un cambio solo de sonido, agrega --remux
para intercambiar el audio en segundos sin redibujar.
qc.py señala tramos muertos, fallos de un fotograma y volumen, y escribe una hoja de contactos. No puede juzgar si el
movimiento se ve bien, así que lee también la hoja, luego recorre los momentos arriesgados fotograma a fotograma en recortes ampliados:
transiciones, texto que entra y sale, donde las capas se superponen, y un ciclo completo de cualquier movimiento repetido. Corrige y vuelve a renderizar hasta que esté limpio.
Entregar
Informa en el lenguaje llano del usuario: qué hiciste, cómo se usó cada referencia, qué revisaste y qué no pudiste revisar. No puedes oír la partitura ni verla a velocidad, así que dilo. Agrega:
- Un dato a tener en cuenta, si suavizaste una afirmación.
- Ajustes fáciles: 3 o 4 cambios específicos que podrían pedir a continuación.
- Si una referencia pertenece a otra persona y necesita consideración antes de uso comercial.