Producción de episodios animados
Resumen
Un episodio animado vertical, con voz, subtítulos y animación: arte de personajes, paneles, voces clonadas o de biblioteca, música, clips de imagen a video y sincronización labial, cortados por un motor que temporiza cada toma a partir del audio real del diálogo. Un único episode.json contiene todo el proyecto, y engine/episode.py ejecuta todas las fases desde él. Las habilidades hermanas realizan el trabajo de los proveedores.
Usa el motor; no escribas tus propios scripts de edición. La línea de tiempo, superposiciones, subtítulos, texto de derecha a izquierda, la mezcla, las duraciones y las uniones de sincronización labial ya están en engine/. Está probado al reconstruir un episodio real de 3.5 minutos: fotogramas idénticos, audio idéntico y la duración exacta que el original había fallado. Una edición hecha a mano redescubre cada error en references/troubleshooting.md.
El audio es el maestro. Las duraciones de las tomas, los tiempos de los subtítulos y las partes de sincronización labial provienen de los archivos de diálogo terminados. Nunca estimes un tiempo a partir del texto.
No puedes ver ni oír. Tú verificas fotogramas, duraciones y números. El ser humano juzga el parecido, las voces, la pronunciación, el ritmo y los chistes. Planifica sus puntos de control y mantenlos.
Requiere:
- Estas habilidades junto a esta: image-generation, elevenlabs-tts, generating-video-clips.
- Python 3 con
pip install -r <directorio-de-esta-habilidad>/requirements.txt(Pillow compilado con RAQM, numpy; OpenCV opcional). - ffmpeg 7 o más reciente.
- Fuentes: los estilos y subtítulos nombran claves de fuente (
bold,hblack,blacken el ejemplo) quefontsmapea a archivos.ttfinstalados. Para hebreo y latín, Rubik y Heebo (gratuitas, Google Fonts) funcionan bien;checkbloquea si falta alguna. - Claves en variables de entorno, establecidas en cada shell que ejecute el motor:
OPENAI_IMAGE_API_KEY,ELEVENLABS_API_KEY,GEMINI_API_KEY,FAL_KEY.
Para ver todo el pipeline funcionar sin llamadas a API, ejecuta python3 <directorio-de-esta-habilidad>/engine/episode.py /tmp demo, luego check y build el proyecto demo que crea.
El pipeline y sus puntos de control
Cada punto de control es una parada: envía el artefacto, pregunta, espera. Los comandos son python3 <directorio-de-esta-habilidad>/engine/episode.py PROYECTO <comando>. Costos medidos en 2026-10.
| # | Fase | Comando | Punto de control (el humano) | Costo |
|---|---|---|---|---|
| 1 | Historia y guion | script.md desde templates/script.template.md | el guion, y cada tema sensible | - |
| 2 | Biblia de personajes | templates/characters.template.md, luego characters en episode.json | - | - |
| 3 | Rostros, tarjetas, promocionar | chars face, chars card key=face.png, chars final keys | parecido, en una hoja de todas las tarjetas | ~$0.30 por personaje |
| 4 | Paneles | panels draft, luego panels final ids | cada panel, en una hoja | ~$0.30 por panel |
| 5 | Voces | una muestra por voz (elevenlabs-tts) | cada voz, de oído, antes del lote | centavos |
| 6 | Líneas | lines | el conjunto de oído, con marcas de tiempo; nombres A/B | centavos a unos pocos $ |
| 7 | Música y SFX | sound | la música | centavos |
| 8 | Animática | build (aún sin clips: fotos fijas con movimientos de cámara) | ritmo y orden, antes de cualquier gasto en video | gratis |
| 9 | Animación | animate, hojas, repeticiones con animate S --takes 2 + animate pick S K | movimiento, desde las hojas | ~$0.10 por segundo de clip, por toma |
| 10 | Sincronización labial | lipsync prep, puntos faciales en configuración, lipsync run | verificar fotogramas al azar | ~$0.13 por segundo |
| 11 | Editar y entregar | build, sheet, deliver | el humano ve el mp4 | gratis |
Comandos, entradas, salidas y manejo de fallos para cada fase: references/pipeline.md.
Escribir el guion
Reglas que se mantuvieron (detalles y un ejemplo práctico: references/script-writing.md):
- Un gancho en los primeros 3-4 segundos (una apertura en frío sobre el problema), luego el título. En menos de 30 segundos, pon el título y la tarjeta final como superposiciones en tomas de la historia y omite el montaje.
- Cada personaje recurrente habla al menos una vez. Un montaje de introducción, una palabra cada uno con su propia voz a aproximadamente 1.2-1.5 s por tarjeta, es económico y gusta.
- El texto en pantalla debe ser legible: aproximadamente 0.8 s más 0.06 s por carácter; 1.2-1.5 s para una tarjeta corta; 4-6 s para un título final. Asigna un
mindura las tarjetas. - Planta pistas temprano y resuélvelas. Los guiños a chistes recurrentes reales del grupo impactan más.
- Los temas sensibles son decisión del usuario. Enumera cada detalle privado que te gustaría usar (salud, dinero, relaciones, familia, peleas), pregunta por cada uno y usa solo lo que confirmen.
- Líneas de 12 palabras o menos, números en palabras. El texto en pantalla mantiene la ortografía normal; las correcciones de pronunciación van en
pronounce. - Música y efectos de sonido, incluso para narración. Al menos una base musical y algunos efectos (silbidos en cortes, un golpe en la revelación); una base silenciosa suena inacabada.
episode.json en una pantalla
templates/episode.example.json es un episodio pequeño completo; cada clave está en references/config-schema.md. Las partes que más editas:
characters: nombre mostrado, color, voz y los campos de indicaciones de la biblia de personajes.speakers: voces que nunca se dibujan, como un narrador ({"display": null, "voice": "<id>"}da subtítulos sin nombre).lines: id, hablante, texto con etiquetas de audio;trimylevelen líneas de una palabra.shots: imagen, líneas ("[email protected]"superpone la línea anterior), pads,mindur, cámara, fx, sfx, superposiciones, desplazamiento y velocidad del clip.music_cues:[cue, desde toma, hasta toma, volumen, desplazamiento]. El build advierte cuando un cue es más corto que su ventana.lipsync: qué tomas, qué líneas omitir, un punto facial por parte.prompts: anulachar_styleypanel_stylepara un estilo diferente (dibujo animado 3D, acuarela, fotorrealista).
Construir y revisar
- Agrupa las correcciones. Una compilación completa lleva minutos. Recoge todas las notas de una ronda de revisión (una toma de línea, un pad, un desplazamiento de clip), aplícalas todas y luego reconstruye una vez.
- Los segmentos se almacenan en caché y se rastrean.
buildre-renderiza exactamente las tomas cuyas entradas cambiaron: un clip nuevo o con sincronización labial, un panel promocionado, una línea editada, toma o estilo.build --only S05,S06fuerza esas tomas;--forcere-renderiza todo. - Una toma con sincronización labial se rehace después de cualquier cambio en su clip, desplazamiento, velocidad o líneas:
lipsync prep S05 && lipsync run S05. Hasta entonces, el build advierte que está obsoleto y usa el clip sin procesar. - Regenerar un activo existente necesita
--force(sound theme --force,animate S05 --force); sin él, los archivos existentes se conservan y solo se llenan los vacíos. - Revisa con hojas.
sheetpone 3 fotogramas por toma en una página. Cuando el humano nombra un momento por tiempo, extrae y lee esos fotogramas antes de responder (ffmpeg -ss T -i build/<output>.mp4 -frames:v 1 f.jpg). checkantes de cada compilación: activos faltantes, claves, habilidades hermanas y texto de superposición más ancho que el fotograma.- Las duraciones se verifican al final de cada compilación. El audio más corto que el video falla la compilación en lugar de cortar el final.
- Antes de enviar:
references/qa-checklist.md.
Trabajar con el humano
- Envía cada artefacto con tu herramienta de envío de archivos y ofrece revelarlo en Finder; no te limites a imprimir una ruta. El paso final es
delivery enviar ese archivo. - Para el audio, di qué escuchar y dónde ("en 0:41, ¿suena bien el nombre de Dani?"). Nunca digas que lo oíste.
- La pronunciación y las elecciones de voz son suyas: archivos A/B con marcas de tiempo (elevenlabs-tts).
- Antes de cada fase paga, da la estimación de costo; después, el total acumulado.
Cuando algo parece mal
| Síntoma | Solución |
|---|---|
| Tarjetas o títulos demasiado rápidos para leer | aumenta mindur / post: ~1.2-1.5 s por tarjeta corta, 4-6 s para el título final |
| Un título recortado en ambos bordes | check advierte; reduce el size del estilo o añade wrap |
| La música se detiene antes de que termine la sección | el build advirtió: aumenta los seconds del cue, sound <cue> --force; o divide la sección en dos cues |
| El final se corta | no puede pasar con el motor (mezcla de duración exacta, verificación de duración); en muxes hechos a mano, consulta deck-to-video |
| Una línea queda sepultada bajo la música | level_clips.py --report en esa línea, luego una toma más firme; baja el volumen de ese cue |
| Un personaje señala o actúa antes de su línea | clip_off más allá de eso, o divide la toma y recorta la primera parte con clip_cam |
| Las bocas no se mueven con las palabras | fase de sincronización labial; si se mueve la boca incorrecta, corrige su punto facial |
| Una cara más grande en la toma grupal | instala OpenCV (las caras se igualan), o mirror una tarjeta cuyo accesorio cubre a un vecino |
| El hebreo se renderiza invertido o sin unir | Pillow sin RAQM: check dice cómo solucionarlo |
| Un nombre o préstamo mal pronunciado | una entrada pronounce, A/B de oído |
Más, con causas: references/troubleshooting.md.
Habilidades relacionadas
- image-generation: tarjetas de personajes y paneles ("Personajes recurrentes y paneles de historia").
- elevenlabs-tts: voces, líneas de una palabra, pronunciación, música y SFX.
- generating-video-clips: clips, hojas de tomas, sincronización labial.
- deck-to-video: las mismas lecciones de ffmpeg para videos de diapositivas.