Communitygithub.com

Comic Story Video – 漫画面讲故事

Convierte cualquier tema en un video vertical de «las imágenes cuentan la historia»: bocetos generados trazo a trazo, burbujas de diálogo superpuestas con código, narración en off y subtítulos grandes. El audio es el hilo conductor: la narración debe ser una historia comprensible por sí sola.

¿Qué es Comic Story Video – 漫画面讲故事?

Esta habilidad transforma cualquier tema en un video corto vertical (110–135 segundos, 1080×1920) que simula un cómic en movimiento: los bocetos se dibujan trazo a trazo, los globos de diálogo aparecen uno a uno, y la narración en off se acompaña de subtítulos grandes. El audio es el elemento principal: si escuchas solo la pista de sonido, debe contar una historia completa y coherente; las imágenes refuerzan, pero no son necesarias para entenderla. El flujo de trabajo consta de cinco etapas: 1) definir la historia en un archivo JSON con los campos obligatorios `story_line`, `question` y `answer`; 2) generar las imágenes con prompts que eviten texto (el modelo solo dibuja bocetos); 3) producir el video combinando narración TTS, burbujas, subtítulos y animación de trazado; 4) verificar que la duración, el movimiento y los subtítulos sean correctos; 5) entregar el archivo final. La herramienta impone reglas estrictas de narrativa (como elegir una estructura según la relación protagonista-resistencia) y de producción (no usar `element_plan`, forzar imagen a imagen con baja similitud, y evitar que el motor rasterice burbujas). Está diseñada para plataformas como Claude Code, Cursor o Codex, y es ideal para creadores de contenido que quieran producir videos de divulgación histórica, científica o humorística al estilo «cómic que cuenta historias».

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/liangdabiao/comic-story-video/tree/HEAD

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

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 ResistenciaEstructura
Un oponente concreto, ida y vueltaAtaque → defensa → contraataque → defensa → golpe final → defensa
El camino que ya no funcionaEl 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ásHecho extraño → encuentra a la persona → su dificultad en ese momento → cómo lo resolvió
Llega a la cima y es derribado por algo insignificanteCima → 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ónLee
No sabes cómo convertir un tema en historia, qué poner en cada viñeta, cómo terminarreferences/story.md
Escribir prompts, definir personajes, maquetar burbujas, TTS, parámetros de renderizado y composiciónreferences/production.md
Error en imagen / audio / duraciónreferences/troubleshooting.md
Plantillas de prompts y palabras de restricción inversareferences/prompt-recipes.md
Sílabas de voz / timbrereferences/voice-design.md
Error 403 de edge-ttsreferences/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

Skills relacionados