Cómic que cuenta historias
Convierte un tema en un video corto vertical de 110–135 segundos: bocetos que se dibujan trazo a trazo, burbujas de diálogo que aparecen una a una, narración en off y subtítulos grandes.
Producto: <proyecto>/out/final.mp4 (1080×1920).
El audio es el hilo conductor. Si extraes solo la pista de sonido, debe contar una historia comprensible; las imágenes agregan dramatismo, pero no son imprescindibles para entenderla.
Cinco pasos
① Definir la historia → <proyecto>/story.json
Crea el directorio y copia la plantilla:
mkdir -p <proyecto>/raw && cp templates/comic/story.example.json <proyecto>/story.json
Primero rellena las tres primeras líneas del archivo. Si no puedes rellenarlas, no escribas viñetas:
"story_line": "Quién / qué quiere / qué se lo impide / resultado, en una frase",
"question": "La pregunta con la que arranca el video",
"answer": "La respuesta que se da en la última viñeta y resuelve la pregunta"
question debe señalar un punto que no se entienda, no preguntar «qué es esto». La respuesta no debe ser una línea de tiempo.
Luego escribe la narration (narración) y los bubbles[].text (texto de burbujas) de cada viñeta. La narración debe tener entre 440 y 540 caracteres (contando signos de puntuación), que a 4.0 caracteres/segundo da unos 110–135 segundos.
python scripts/pipeline.py <proyecto> --stage script # Pero no pases de aquí
Criterios de aprobación de ①: las tres primeras líneas están completas → el número de caracteres está en el rango → cada viñeta tiene narración → las burbujas no salen del encuadre → la función en charts.py existe.
② Generar imágenes → <proyecto>/raw/<id>.png
Escribe todos los prompts primero, y luego genera todas las imágenes de una sola vez. Generar una por una lleva una o dos horas, y cambiar prompts a mitad de camino hace que el estilo varíe.
python scripts/comic_gen.py <proyecto> --list # Muestra los prompts que faltan; los ya generados se saltan
Genera cada imagen según los prompts impresos y guarda las imágenes en raw/. Debe ser imagen a imagen, usando como referencia assets/reference/01-style-anchor.png con similitud baja.
python scripts/contact_sheet.py <proyecto> # Crea una hoja de contacto para revisión
python scripts/pipeline.py <proyecto> --stage image
Criterios de aprobación de ②: en la hoja de contacto solo revisa dos cosas: que los personajes correctos estén presentes y que no haya zonas completamente negras o en blanco. El resto (texto suelto, diferencias de altura de media cabeza, líneas sucias, colas desplazadas unos píxeles) ignóralo y continúa.
③ Producir el video → final.mp4
python scripts/comic_run.py <proyecto>
Ejecuta en orden: narración → capa de burbujas / infografía → limpia la portada → renderiza trazo a trazo → compone el video vertical → quema los subtítulos.
Para repetir un solo paso usa el correspondiente comic_*.py.
④ Verificar
python scripts/verify_media.py --file <proyecto>/out/final.mp4 --expect <segundos>
ffmpeg -y -ss 3 -i <proyecto>/out/final.mp4 -vframes 1 <proyecto>/check/03.png
Toma dos fotogramas (segundo 3, y el 75% de la duración total de la viñeta) y compara: ¿la imagen se mueve? ¿el color de fondo es correcto? ¿los subtítulos salen del encuadre? Luego extrae la pista de audio y escúchala con los ojos cerrados: si puedes decir «quién quería qué, qué pasó, y cómo terminó», está aprobado.
⑤ Entregar
<proyecto>/out/final.mp4. Si se necesita una versión horizontal, usa out/story_flat.mp4.
Diez reglas estrictas
Las tres primeras son sobre la historia: si se incumplen, el oyente no entenderá de qué se habla. Las siete restantes son sobre la producción: si se incumplen, la imagen o el audio estarán mal.
1. Rellena primero story_line / question / answer. Si no puedes, no escribas viñetas.
Sin estas tres líneas, al terminar las ocho viñetas descubrirás que la historia es dispersa, y es el retrabajo más costoso.
2. Elige la estructura según la relación protagonista-resistencia; no uses la misma plantilla para todos los temas.
| Protagonista vs Resistencia | Estructura |
|---|---|
| Un oponente concreto, ida y vuelta | Ataque → defensa → contraataque → defensa → golpe final → defensa |
| El camino que ya no funciona | El oficio se muere → prueba varias opciones → surge algo inesperado → apuesta todo → funciona → descubre qué vendía realmente |
| Un fenómeno que no se explica, investigando hacia atrás | Hecho extraño → encuentra a la persona → su dificultad en ese momento → cómo lo resolvió |
| Llega a la cima y es derribado por algo insignificante | Cima → una grieta → nadie la toma en serio → apuesta mal → colapso |
El número de viñetas sigue a la historia: de 5 a 9 viñetas está bien.
3. No numeres eventos paralelos como «asaltos». Si cambias «primer asalto» por «primera vez» y la historia no pierde nada, entonces no era un asalto, era una etiqueta pegada — bórrala. Del mismo modo, evita jerga de comentarista como «sube la apuesta», «cima», «la verdad sale a la luz», «el pasado oculto»; el oyente oye claves, no contenido.
4. La narración debe ser una historia completa y comprensible; los diálogos deben decirse. Frases como «respondió algo», «aprobó dos palabras», «una frase lo despertó»: el oyente sabe que alguien habló, pero no qué dijo. Que las burbujas repitan la narración no es un error; los subtítulos son una repetición del audio.
5. El modelo generativo solo dibuja bocetos; el texto lo superpone el código. Incluye en el prompt «no dibujes texto» como medida preventiva, no como criterio de aprobación.
6. Las burbujas no entran en el motor de renderizado. El motor rasteriza los colores a negro; las burbujas se superponen en tiempo de composición, con un ritmo más controlable.
7. No pases element_plan.
Si lo pasas, cada objeto se dibuja durante un máximo de 1.6 segundos y se detiene; toda la viñeta se llena en dos segundos. Sin él, el presupuesto se distribuye según la raíz cuadrada del área, y la duración total es constante.
8. Debe ser imagen a imagen, con similitud baja con la imagen de referencia (0.3–0.5). Con similitud alta, el modelo copia la pose de la referencia e ignora la acción que escribiste.
9. Escribe a los personajes en characters, y en el prompt refiérete a ellos con {nombre}; cada par debe diferir en al menos tres aspectos.
Detalla tocado, barba, ropa y complexión. El protagonista debe llevar un tocado distintivo (paño suave / sin corona); las coronas cuadradas, diademas y cascos son para el oponente y los soldados.
10. Usa colorkey + overlay para el fondo; los subtítulos se queman en el ASS y se declara PlayResX/Y.
Con blend=all_mode=multiply el fondo se vuelve verde fluorescente; los subtítulos SRT al ser procesados por libass caen en un sistema de coordenadas 384×288 y el texto sale del encuadre.
Consulta según el problema
| Situación | Lee |
|---|---|
| No sabes cómo convertir un tema en historia, qué poner en cada viñeta, cómo terminar | references/story.md |
| Escribir prompts, definir personajes, maquetar burbujas, TTS, parámetros de renderizado y composición | references/production.md |
| Error en imagen / audio / duración | references/troubleshooting.md |
| Plantillas de prompts y palabras de restricción inversa | references/prompt-recipes.md |
| Sílabas de voz / timbre | references/voice-design.md |
| Error 403 de edge-tts | references/apiz-tts-fallback.md |
Directorio
<proyecto>/
├── story.json Configuración única: título, tres líneas de historia, narración/burbujas/prompt por viñeta
├── charts.py Funciones de dibujo para viñetas de infografía (solo si hay viñetas chart)
├── raw/ Imágenes originales del modelo generativo ← las pones tú
├── boards/ bubbles/ charts/ audio/ out/ ← salidas de los scripts
└── subs.ass
Primera vez
bash scripts/setup.sh # macOS / Linux / Git Bash
powershell -ExecutionPolicy Bypass -File scripts/setup.ps1 # Windows
python scripts/self_test.py # 6 autocomprobaciones, ejecutar una vez