Cortometraje IA
Historia dentro, episodio fuera. Escribes la historia en un project.json (personajes,
localizaciones, tomas). scripts/drama.mjs se encarga de todo lo que cuesta dinero
o es fácil de hacer mal:
project.json ─ estimar ─ reparto ─ (voz) ─ tomas ─ ensamblar ─▶ episode.mp4 + .srt
gratis imagen de narración Seedance ffmpeg: normalizar,
validar referencia solo renderiza mezclar voz en off,
+ precios por personaje cada toma unir, subtítulos
y localización
Cómo se mantienen los personajes iguales: cada personaje recibe una hoja de referencia (retrato + vistas frontal/lateral/trasera). Cada toma pasa las hojas de los personajes que aparecen en ella a Seedance 2.0 como imágenes de referencia, y el prompt dice qué imagen es quién.
Reglas
- Ejecuta siempre
scripts/drama.mjs. No llames a la API con curl o fetch. El script almacena cada ID de tarea en el momento en que existe, así que un fallo o un tiempo de espera reanuda la misma tarea en lugar de pagar por ella de nuevo. Las llamadas hechas a mano pierden eso. - Lee
references/project-schema.mdyreferences/shot-writing.mdantes de escribirproject.json. La guía de escritura de tomas determina si el episodio parece una sola película o doce clips sin relación. - Ejecuta
estimateprimero y muestra al usuario el resultado: lista de tomas, duración total, modelos y la tabla de precios. Espera un sí antes decast/shots. El script rechaza cualquier paso de más de $1 sin--yes. Solo pasa--yesdespués de que el usuario haya aceptado esa cantidad. - Muestra al usuario las hojas de personaje antes de renderizar las tomas. Las
hojas cuestan alrededor de $0.02 cada una; las tomas cuestan 10–100× más. Si una cara,
una vestimenta o el estilo son incorrectos, corrige el
looky ejecutacast --redo <id>ahora. Cada toma lo heredará. - Para un proyecto nuevo, renderiza primero una toma (
shots --only s1). Mírala junto al usuario, luego renderiza el resto. Omite esto solo para proyectos muy cortos (tres tomas o menos) o cuando el usuario lo indique. - Nunca inventes un nombre de modelo. Usa solo los modelos de la tabla siguiente. Si el usuario pide otro, di que esta habilidad no lo soporta.
- Las tareas fallidas nunca se cobran. Dilo claramente cuando una falle, explica por qué (el script imprime el motivo y el siguiente paso), y ofrece reintentar.
- No menciones proveedores upstream ni enrutamiento. Habla de los nombres de modelo en este archivo y nada detrás de ellos.
- Nada de personas reales e identificables sin su consentimiento, y nada sexual, odioso o difamatorio sobre nadie real. Rechaza esas solicitudes.
Flujo de trabajo
S=/ruta/absoluta/hasta/esta/habilidad/scripts/drama.mjs # sabes tu directorio base; úsalo
node $S check # clave, saldo, ffmpeg
mkdir -p dramas/mi-episodio # una carpeta por episodio, en el espacio de trabajo del usuario
# escribir dramas/mi-episodio/project.json (consulta references/project-schema.md)
node $S estimate dramas/mi-episodio/project.json --prompts
node $S cast dramas/mi-episodio/project.json # luego MUESTRA las imágenes en cast/
node $S voice dramas/mi-episodio/project.json # solo modo narración
node $S shots dramas/mi-episodio/project.json --only s1 # comprueba una, luego:
node $S shots dramas/mi-episodio/project.json
node $S assemble dramas/mi-episodio/project.json --burn-subs
node $S status dramas/mi-episodio/project.json # en cualquier momento: progreso, gasto, lo que queda
- Los renders son lentos. Una toma suele tardar 2–8 minutos, y las tomas se ejecutan
3 a la vez. Antes de
shots, dile al usuario aproximadamente cuánto tiempo tomará. No los dejes mirando una terminal en silencio. - Cualquier comando se puede re-ejecutar de forma segura. El trabajo terminado se omite.
Las tareas en curso se retoman donde se quedaron. Las tomas fallidas solo se reintentan
con
--retry-failed. - Editar una toma después de renderizada no la vuelve a renderizar.
statusla marca como "inputs changed". Vuélvela a renderizar a propósito conshots --redo <id>; eso se paga de nuevo. - Muestra el resultado: la ruta del MP4 final, su duración y el
.srt. Luego di lo que se gastó:statusimprime la cantidad exacta facturada, leída de la API. - Todo se descarga en la carpeta del proyecto. Las URL de resultados de la API caducan después de 30 días, así que la carpeta es la copia que perdura.
Diálogo o narración
Elige antes de escribir las tomas:
"mode": "dialogue" | "mode": "narration" | |
|---|---|---|
| Quién habla | Personajes en pantalla, con sincronía de labios. Seedance genera las voces con el video. | Un narrador en off (texto a voz), mezclado sobre el sonido ambiente de cada toma. |
| Bueno para | Escenas impulsadas por conversación; mini dramas al estilo de acción real. | 漫剧 / dramas cómicos IA, adaptaciones de novelas, videos de resumen y narración de historias. |
| Consistencia de voz | La voz de un personaje puede variar un poco de una toma a otra. | Una voz idéntica para todo el episodio. |
| Duración de toma | Tú estableces duration (4–15 s). Mantén cada línea lo suficientemente corta para que quepa. | Se establece automáticamente para que quepa cada línea de narración, hasta 15 s. |
| Límites | Aproximadamente 1–2 líneas cortas por toma de 5 s. Sin control exacto sobre quién habla cuándo. | Los personajes no hablan en pantalla. |
Si el usuario no lo dice, usa narración para cualquier cosa descrita como 漫剧, un cómic, una novela o un resumen de historia. Usa diálogo para escenas basadas en conversación.
Modelos y costo
El script elige un video_model predeterminado según el estilo. Los looks estilizados
(anime, cómic, 国漫, caricatura, acuarela) usan dreamina-seedance-2-0-mini. Todo lo
demás usa seedance-2.0-mini. Sobrescríbelo en project.json cuando el usuario quiera
algo diferente.
| El usuario quiere | video_model | Resoluciones | Por segundo de video |
|---|---|---|---|
| Episodio estilizado (anime, cómic, 国漫); borradores | dreamina-seedance-2-0-mini | 480p / 720p | $0.0225 / $0.048 |
| Estilizado, un paso mejor que mini | dreamina-seedance-2-0-fast | 480p / 720p | $0.0644 / $0.1372 |
| Estilizado, calidad final hasta 1080p | dreamina-seedance-2-0 | 480p / 720p / 1080p | $0.10 / $0.22 / $0.55 |
| Personas fotorrealistas | seedance-2.0-mini | 480p / 720p | $0.044 / $0.095 |
| Fotorrealista, un paso mejor que mini | seedance-2.0-fast | 480p / 720p | $0.071 / $0.153 |
| Fotorrealista, calidad final hasta 1080p | seedance-2.0 | 480p / 720p / 1080p | $0.092 / $0.197 / $0.492 |
Otros costos:
- Hojas de personaje y localización:
nano-banana-2-1, $0.022 cada una a 1K. - Narración:
minimax-speech-2.8-turbo, $0.04 por cada 1,000 caracteres. Un clip corto se factura al menos $0.004.
Un episodio de un minuto (12 tomas × 5 s, 5 hojas) cuesta aproximadamente:
- $1.46 con
dreamina-seedance-2-0-mini480p - $2.99 con
dreamina-seedance-2-0-mini720p - $2.75 con
seedance-2.0-mini480p - $29.63 con
seedance-2.01080p
Sugiere 480p para la primera pasada. Una segunda pasada a 720p solo vuelve a renderizar las tomas
("resolution": "720p", luego shots --redo <ids>). Las hojas se mantienen.
Por qué existen las filas fotorrealistas: los modelos dreamina-* rechazan imágenes de referencia
que parezcan una persona real, y una hoja de personaje fotorrealista puede activar eso. El script
reconoce este rechazo y te indica que cambies a seedance-2.0-mini. La tarea rechazada no se cobra.
Los precios son precios de lista, verificados el 2026-09-30. status muestra lo que realmente se facturó.
La clave API
Ejecuta node $S check primero. La clave proviene de APIMODELS_API_KEY, o de
~/.apimodels/credentials, o de ~/.apimodels/credentials.json. El último es escrito
por npx apimodels-mcp login, así que un usuario que haya iniciado sesión en cualquier
herramienta de apimodels ya está configurado.
Si no hay clave, ejecuta node $S login tú mismo y dale al usuario el enlace que imprime.
Ellos inician sesión en apimodels.app y hacen clic en Autorizar. Se escribe una nueva clave
en ~/.apimodels/credentials y nunca aparece en esta conversación. Luego vuelve a ejecutar
check y continúa.
Si login no puede funcionar (sin navegador en la máquina), no pidas la clave en el chat.
Dale al usuario un comando para pegar en una nueva ventana de terminal, con la ruta del
script absoluta completada:
read -s KEY && printf %s "$KEY" | node /RUTA/ABSOLUTA/scripts/drama.mjs save-key && unset KEY
Las claves se crean en https://apimodels.app/console/api-keys.
Manejo de la clave:
- Nunca la repitas.
- Nunca la pases como argumento de comando.
- Nunca la escribas en la carpeta del proyecto.
- Si alguna vez aparece una clave en la conversación, dile al usuario que la rote.
Errores
El script imprime el motivo y el siguiente paso. En palabras sencillas:
| Ves | Significado | Haz |
|---|---|---|
401 | Clave incorrecta o faltante | Vuelve a ejecutar login |
402 | Saldo insuficiente | Recarga en https://apimodels.app/console/credits. Las tomas terminadas se conservan. |
| "parece una persona real" | dreamina-* rechazó una imagen de referencia | Cambia video_model a seedance-2.0-mini, luego shots --retry-failed |
| Rechazo por revisión de contenido | El prompt o una línea fue rechazada | Reformula esa toma. Reintentar el mismo texto no ayudará. |
| Ocupado / tiempo de espera | Carga upstream | Ejecuta shots --retry-failed un poco más tarde |
| "aún ejecutándose" | Más de 25 minutos | Vuelve a ejecutar shots más tarde; retoma la tarea, sin cobro |
| código de salida 3 | El paso cuesta más de $1 | Confirma la cantidad con el usuario, luego añade --yes |
El éxito no es 100%: una toma ocasional falla, y un reintento suele funcionar.
Lo que esta habilidad no hace
Dilo directamente en lugar de improvisar:
- No garantiza una consistencia perfecta. Las caras pueden variar en tomas amplias, y con tres o más personajes en un mismo encuadre. Mantén 1–2 personajes por toma (consulta shot-writing).
- Ninguna toma dura más de 15 s. Los momentos más largos se dividen en varias tomas.
- No sincroniza labios con una pista de voz grabada por el usuario.
- No controla el primer fotograma exacto de una toma. Las tomas se guían por imágenes de referencia y el prompt.
- Los tiempos de los subtítulos son aproximados. Se distribuyen uniformemente dentro de
cada toma. Edita el
.srtsi la sincronización exacta importa. - No publica en ninguna parte. El resultado es un MP4 local más un SRT.