PTENES
Historia → desglose → película

La historia se convierte en desglose de planos, y el desglose se convierte en película.

Pipeline vertical narrado, con el proveedor de imagen y video seleccionable mediante un parámetro, y un contrato en YAML que puedes revisar antes de gastar.

Cámara de cine sobre dolly, ilustración de portada de videoanima.
Qué es

Un pipeline de dirección, no un generador de clips sueltos

La diferencia entre una película y una presentación de diapositivas está en el desglose: cada plano sabe cuál es su encuadre, su movimiento y dónde termina el gesto. Eso es lo que videoanima escribe antes de generar cualquier imagen.

🎞️ Gramática de dirección

El encuadre, el ángulo, el movimiento, la velocidad, el look y el ritmo se convierten en fragmentos de prompt: vocabulario destilado de un análisis de estilo, no adjetivos improvisados.

🔀 Proveedores intercambiables

Imagen en agnes, inemaimg o kie; video en agnes, kling, klingai o kie. Cada trampa medida vive en su adaptador.

🎯 Compuerta de movimiento

Cada clip se mide después de generarlo; los que quedan estáticos se rehacen. Hay un negative prompt contra still frame y keyframes A/B para que el generador tenga algo que animar.

⚠️ En ajuste — no es una versión estable.

El pipeline funciona de punta a punta, pero está en un ciclo abierto de corrección a partir de las películas que él mismo produjo. El primer corte salió mal (escenas estáticas, personaje inconsistente, narración entrecortada): lo que se midió y lo que cambió a raíz de eso está en el post mortem doc/pos-mortem-montanha-leao.md. Aún pendiente: la narración alarga los planos más allá del ritmo planificado, los SFX se agregan sin escucharlos antes y la referencia encadenada entre planos (el plano N usa el N−1) no está implementada.

Cómo funciona

Seis etapas idempotentes, cada una omite lo que ya existe en disco

Todo está en output: un id independiente se resuelve en ~/projetos/output/videoanima/<id>/decupagem.yaml. O historias/<id>/ del repo es solo una semilla: en la primera ejecución, el desglose de planos se copia al output, y el de ahí pasa a ser el vigente.

Desglose YAML→ Coherencia del ritmo→ Imágenes ancla de los personajes→ Keyframes A y B→ Clips→ Pista y SFX→ Narración→ Montaje
1

Antes de gastar

Primero se valida el ritmo y la vista previa del costo aparece antes de la primera llamada paga. --so-decupagem valida sin generar nada.

2

Consistencia del personaje

Una imagen ancla se genera con text2img y las demás se derivan de ella con img2img; generarlas en paralelo produciría individuos diferentes, porque ninguno de esos generadores tiene una seed de identidad.

3

Qué no hace el generador

Slow y speed-ramp, handheld, zoom-punch, pista con ducking, SFX y loudnorm se incorporan al montaje con ffmpeg.

Requisitos previos

Qué debe estar en marcha

Python 3 y ffmpeg son obligatorios. Los servicios locales y las claves dependen de los proveedores que elijas.

ffmpeg + Python 3

Todo el montaje se hace con ffmpeg. Sin él, la película no queda lista.

# verifica
ffmpeg -version
python3 --version

inemavox (narración)

TTS local en localhost:8010, motor chatterbox. La voz viene del desglose (voz:).

# debe responder
curl localhost:8010/health

inemaimg (opcional)

Servidor de imagen local en localhost:8000. Necesario para --img inemaimg — el camino para personajes infantiles, que pasan por el filtro de Agnes.

# solo si vas a usar --img inemaimg
curl localhost:8000/health

Ollama (opcional)

LLM local en localhost:11434, usado por el desglose automático (decupagem_llm.py).

# solo para el desglose mediante LLM
curl localhost:11434/api/tags

Claves de proveedores

Leídas en runtime desde los .env del ecosistema: nada se copia al repo.

# AGNES_API_KEY, KIE_API_KEY, FAL_KEY
# en ~/projetos/openpcbotv2/.env
# o ~/projetos/wifi/.env

Combinaciones que requieren una URL pública

klingai e kie necesitan el keyframe en una URL pública; combínalos con --img agnes o --img kie.

# combinación válida
--img kie --video klingai
Guía de uso · paso a paso

Del ejemplo a la película montada

Todos los comandos se ejecutan desde la raíz del repo. El orden importa: valida el ritmo y el costo antes de cualquier llamada paga.

1

Valida el desglose de planos sin gastar

Comprueba la coherencia del ritmo y muestra la vista previa del costo. No genera imágenes, clips ni audio.

python3 rodar.py exemplo --so-decupagem  # valida el ritmo + el costo, no gasta
2

Edita el desglose activo

La primera ejecución copia la semilla del repo al output. A partir de ahí, edita la del output: esa es la que cuenta.

# semilla en el repo (solo la primera vez)
historias/exemplo/

# la viva, que tú editas
~/projetos/output/videoanima/exemplo/decupagem.yaml
3

Detente en los keyframes y revisa la hoja de contacto

Genera las anclas del personaje y los keyframes A/B, arma la hoja de contacto y se detiene. Aquí puedes detectar inconsistencias en el personaje antes de pagar por los clips.

python3 rodar.py exemplo --so-imagens
4

Ejecuta el pipeline completo

Elige los proveedores de imagen y video. El valor predeterminado de ambos es agnes (costo US$ 0, envío por lotes).

python3 rodar.py exemplo --img agnes --video agnes

# Kling vía fal.ai, con keyframe en URL pública
python3 rodar.py exemplo --img kie --video klingai
5

¿Un personaje niño? Cambia el proveedor de imagen

Medido en 2026-08-01: Agnes devuelve HTTP 400 de forma determinística para "boy"/"child"; el mismo prompt con un adulto funciona.

python3 rodar.py minha-historia --img inemaimg --video agnes
6

Sin confirmación y con un prompt mínimo

--sim no pregunta antes de gastar. --prompt-minimo envía solo la instrucción de movimiento al generador de video; es útil cuando el prompt largo está dificultando la animación.

python3 rodar.py exemplo --sim --prompt-minimo
7

Retoma donde lo dejaste

Cada etapa omite lo que ya existe en el disco. Borra el artefacto que quieras rehacer y vuelve a ejecutarlo: solo ese se genera de nuevo.

# rehace solo el clip del plano 07
rm ~/projetos/output/videoanima/exemplo/clipes/p07*.mp4
python3 rodar.py exemplo
Ejemplos

Películas creadas con el pipeline

Fotogramas de las películas verticales producidas durante el ciclo de corrección; son las mismas que alimentaron el post mortem.

Fotograma de la película montanha-leao-v2: niño con mochila y perro en la cima de una montaña al atardecer.
montanha-leao-v2 — la versión rehecha después del post mortem, con look por bloque para que la luz no parezca de mediodía al llegar de noche.
Fotograma de la película neve-resgate: niño con abrigo rojo avanzando por la nieve entre faroles encendidos.
neve-resgate — v3, con tipo_plano y la biblia de entornos; el plan de estado no se envía a ningún generador.
Roadmap

Qué ya cambió y qué sigue pendiente

El roadmap se guía por los defectos medidos en las propias películas: cada elemento surgió de un corte que salió mal.

Listo
Movimiento medido, no prometidoKeyframes A y B por plano, negative prompt contra still frame y una compuerta que mide el movimiento del clip y vuelve a generar lo que quede estático.
Listo
v3: tipo de plano y look por bloquetipo_plano: tableau no se envía a un generador de video: la cámara se mueve sobre la imagen estática. blocos aplica el look adecuado a la franja de planos, en lugar de que los 50 planos hereden un "daylight" global.
Listo
Audio en capas separadasLa voz y la música dejaron de competir por la misma pista: la película dejó de salir muda.
Abierto
Narración x ritmoLa narración todavía alarga los planos más allá del ritmo planificado en el desglose.
Abierto
SFX sin escucha previaLos efectos se incorporan a la película sin escucharlos antes para revisarlos.
Abierto
Referencia encadenadaEl plano N usando el N−1 como referencia todavía no se implementó; es el camino para lograr continuidad entre planos.