Corto animado: idea → guion → voz → MP4 finalizado
El estilo: personajes planos 2D tipo "bean-head" (dibujados como "cartas" con contornos de ciruela) en un mundo 3D colorido con contornos de tinta negra, texturas pintadas, profundidad de campo y cámaras deslizantes. La salida es 1080x1920, 30 fps, exactamente tan larga como la voz. La voz del usuario no se modifica. La música de fondo y los efectos de sonido se sintetizan: música 16 dB por debajo de la voz, efectos de sonido al 50 % del nivel de la voz o menos. Probado en "The Soldier Who Never Left" (19.7 s, 8 tomas).
Si esta habilidad llegó como archivos en el chat
El usuario puede enviar SKILL.md y cartoon-short-kit.zip y decir algo como "lee esta habilidad, instálala y úsala" (اقرأ هذه المهارة، وثبّتها، واستخدمها). Entonces:
- Lee todo este archivo y síguelo. No expliques qué es una habilidad ni hagas preguntas de configuración.
- Descomprime el kit en una carpeta con permisos de escritura (ver 4.0). Confirma que
engine/main.jsyvendor/three.module.jsestán ahí. - Si este entorno tiene una carpeta de habilidades personales (por ejemplo
~/.claude/skills/), copiaSKILL.mdy el kit encartoon-audio-short/. Si no tiene ninguna, no digas que está instalado permanentemente: di en una línea que está listo para este chat y que los dos archivos deben enviarse de nuevo en un nuevo chat. - Responde en una línea corta y ve directamente a la Etapa 1.
Idioma: árabe o inglés
- Chat: responde en el idioma de los mensajes del usuario desde la primera respuesta. Si escriben en árabe o piden árabe, cada mensaje está en árabe: preguntas, etiquetas de opciones y descripciones, la lista de tareas, ideas, notas de progreso, errores y la nota de entrega. Usa palabras cotidianas simples y adapta su dialecto si escriben en uno. El inglés solo se queda para nombres de archivos y comandos, en su propia línea para que el texto de derecha a izquierda no los desordene.
- Guion: el idioma del guion sigue el del chat a menos que pidan otra cosa. "أريد أفكار بالعربي" escrito en cualquier pregunta significa Etapa 2, en árabe.
- Variedad árabe: escribe árabe estándar simple a menos que escriban o pidan un dialecto (iraquí, egipcio, del Golfo, levantino, etc.). No te detengas a preguntar. Termina la respuesta del guion con una línea: "تريده بلهجة ثانية؟ اكتب اللهجة وسأعيد كتابته." Nunca mezcles estándar y dialecto en un mismo guion a menos que lo pidan.
- Preguntas fijas en árabe. Usa este redactado:
- "من أين نبدأ؟" (¿Por dónde empezamos?)
- "الصوت جاهز" (La voz está lista): Sube el archivo de audio, junto con el texto si existe, y haré el video.
- "عندي نص" (Tengo un texto): Lo mejoraré y te daré consejos de grabación, luego haré el video después de subir la voz.
- "أحتاج إلى أفكار ونص" (Necesito ideas y un texto): Propondré diez ideas originales, luego escribiré el texto para la idea que elijas.
- "كم مدة الفيديو؟" (¿Cuánto dura el video?)
- "من 20 إلى 30 ثانية (مُوصى به)" (De 20 a 30 segundos, recomendado): Aproximadamente 40 a 60 palabras.
- "من 30 إلى 45 ثانية" (De 30 a 45 segundos): Aproximadamente 60 a 90 palabras.
- "من 45 إلى 60 ثانية" (De 45 a 60 segundos): Aproximadamente 90 a 120 palabras.
- "من أين نبدأ؟" (¿Por dónde empezamos?)
Reglas
- Las historias, personajes y tomas siempre son originales. Nunca recrees el video de otro creador toma por toma. Ofrece una versión original de la misma idea.
- No uses personas reales vivas nombradas como personajes, ni mascotas de marca o logotipos.
- Sin subtítulos a menos que el usuario lo pida. El texto diegético (un mensaje tallado, un letrero) está bien, y debe leerse correctamente (no reflejado). Los letreros, etiquetas y titulares usan el idioma del guion: un video en árabe lleva "بِيعَ", no "SOLD". Dibújalos como en 4.3.
- Nunca edites ni reajustes el tiempo de la voz. La imagen se sincroniza con ella, y cada reacción visual ocurre 0-3 fotogramas antes de su palabra.
- Niveles de audio: la música de fondo se sitúa a 16 dB por debajo de la voz (RMS con puerta), por lo que la narración se mantiene clara. Los efectos de sonido se sitúan al 50 % o ligeramente menos, con picos limitados para que ningún golpe sobresalga sobre la narración. Siempre mezcla con
mix.py, nunca a mano. No uses ducker ni compresión que cambie esta proporción; solo una ganancia lineal más un limitador de picos en toda la mezcla. - Mantén al usuario informado con una lista de tareas. Envía una hoja de contactos de fotogramas antes de la renderización larga.
Etapa 1: Recepción (siempre primero)
Si ya hay un archivo de audio adjunto, salta a la Etapa 4. Si también se dio un guion, úsalo para la sincronización. De lo contrario, haz una pregunta AskUserQuestion (o texto plano si esa herramienta falta): "¿Por dónde empiezas?"
- La voz está lista: pídeles que la suban, junto con el texto del guion si lo tienen (el guion hace exacta la sincronización). Ve a la Etapa 4 cuando llegue.
- Tengo un guion, necesito la voz: ajusta el guion según la Etapa 3 si es necesario, devuélvelo con consejos de grabación, pide la subida, luego ve a la Etapa 4.
- Necesito ideas de video y un guion: ve a la Etapa 2. También pregunta la duración objetivo si no la han dicho. La predeterminada es 20-30 s; se permite 45-60 s. En un chat en árabe, usa el redactado de la sección Idioma.
Etapa 2: 10 ideas de video
Da exactamente 10 ideas en una respuesta, numeradas, y pide al usuario que responda con un número (o "más"). Cada idea incluye:
- Título (5-8 palabras, que despierte curiosidad, ej. "El soldado que nunca se fue").
- Frase gancho: la primera frase hablada, una paradoja presentada como hecho ("Un hombre vendió la Torre Eiffel. Dos veces.").
- El giro en una línea (la recompensa irónica que termina el video).
- Por qué se anima bien: los 2-3 grandes momentos visuales (un derrumbe, una revelación, una persecución).
- Verdad o leyenda: di claramente si es historia documentada, relato controvertido o folclore.
Lo que hace que una idea sea "perfecta" para este formato:
- Una historia sorprendente con una causa y efecto físicos que se puedan mostrar.
- Un personaje común y corriente claro, apuestas que escalan y un giro en la última línea.
- Un escenario que pueda construirse con formas 3D simples más cartas de dibujos animados (pueblos, puentes, barcos, castillos, desiertos, laboratorios, palacios).
- Mezcla las 10 entre épocas y temas: antiguo, medieval, 1800, moderno, ciencia, animales, inventos, desastres, leyes extrañas, accidentes afortunados.
- Para cualquier cosa presentada como verdadera, verifica los datos clave con una búsqueda web antes de ofrecerla. No presentes una leyenda viral como un hecho. Si el usuario la quiere de todas formas, enmárcala como "la leyenda dice".
- No uses personas reales vivas como blanco de una broma, nada gráfico y nada político.
Para ideas en árabe:
- Escribe el título, gancho, giro y notas en árabe. Escribe el gancho como una oración árabe natural, no una traducción. Da a los nombres extranjeros su ortografía árabe habitual.
- Mezcla historias de la historia árabe e islámica y la ciencia con historias mundiales, para que la lista se sienta hecha para esta audiencia.
- Busca tanto en árabe como en inglés. Las historias árabes populares también se difunden sin fuentes, así que etiquétalas con Verdad o leyenda de la misma manera.
- Nunca muestres profetas, sus compañeros u otras figuras sagradas como personajes. No bromees sobre religión, sectas, tribus o nacionalidades.
Etapa 3: Guion (después de que elijan)
Escribe solo la narración (sin acotaciones en el texto hablado). El inglés tiene un tamaño de aproximadamente 3.7 palabras/s: 20 s ≈ 75 palabras, 30 s ≈ 110, 60 s ≈ 220. El árabe es más lento, aproximadamente 2 palabras/s: 20 s ≈ 40 palabras, 30 s ≈ 60, 60 s ≈ 120. Las palabras árabes llevan más sílabas, y las voces árabes reales medidas daban 1.6-2.1 palabras/s. Fórmula:
- Gancho (oración 1, sin introducción): el hecho absurdo.
- Escenario en 1-2 líneas: cuándo, dónde, quién, un detalle concreto.
- Escalada, 2-4 compases, cada uno más grande. Otros dudan o se burlan. Usa una broma de exageración.
- Misterio o giro: "Pero cuando..." / "Verás," introduce el mecanismo real, a menudo con una analogía cotidiana.
- Giro / recompensa: corto, irónico y las últimas palabras del video. Usa inglés hablado sencillo, contracciones, oraciones de unas 8-15 palabras y números escritos como palabras. Nunca describas lo que el espectador ya ve.
Para un guion en árabe:
- Mantén las oraciones en unas 6-12 palabras y usa la misma fórmula de cinco partes. Los giros como "لكن عندما…" y "والسبب؟" funcionan bien.
- Escribe números y años como palabras (ألف وتسعمئة وأربعة وتسعون), y deletrea palabras extranjeras y nombres de marca en letras árabes, para que la voz los lea correctamente.
- Puntúa para la voz: "،" y "." para las respiraciones, "…" para una pausa antes de una revelación y "؟" para preguntas. La sincronización también usa esta puntuación.
- Da un bloque de voz copiable listo para pegar en el generador de voz:
- Tashkeel en cada palabra, lo que ayuda más en nombres y palabras con más de una lectura. Omite las terminaciones de caso que un narrador no diría y escribe el dialecto tal como se habla. Si piden que no haya tashkeel, o suena mal, elimínalo.
- Etiquetas de audio para Eleven v3 en inglés, como [excited], [curious], [serious], [whispers], [warmly]. Usa una o dos por grupo de oraciones como máximo, solo donde las palabras lo merezcan.
- "G" iraquí: escribe گ y چ donde el sonido hablado lo necesite (تِگْدَر, لْگِيت), ya que ك se lee como "k".
- Partes: para un guion de más de unos 700 caracteres, divídelo en partes numeradas al final de las oraciones.
- El recuento de palabras y la duración usan la tasa árabe anterior, ignorando etiquetas y tashkeel.
Luego responde con:
- El guion en un bloque copiable, con el recuento de palabras y la duración estimada.
- Un plan visual de un párrafo (las tomas que animarás).
- Consejos de grabación: una voz de narrador constante y cálida; ElevenLabs funciona bien (una voz de narrador grave, velocidad aproximadamente 1.05-1.1, estabilidad aproximadamente 45-55 %). Mp3 o wav está bien. Deja pausas naturales al final de las oraciones. Exporta sin música.
- Consejos de grabación en árabe: usa Eleven v3, porque los modelos antiguos leen las [etiquetas] en voz alta. Empieza con Estabilidad en Natural y velocidad alrededor de 0.95, y prueba las primeras oraciones antes de generar todo. Con otro generador, elimina primero las etiquetas. Su propia voz también funciona, sin las etiquetas ni el tashkeel.
- La solicitud: "Sube la voz cuando esté lista y haré el video completo." Mantén el texto final del guion. Impulsa la sincronización en la Etapa 4, por lo que no se necesita reconocimiento de voz. Si grabaron una versión modificada, pide el texto final.
Etapa 4: Construir el video (después de subir la voz)
Haz todo desde aquí sin parar. Pregunta solo si la sincronización no se puede resolver.
4.0 Obtener el kit
El kit de código contiene el motor, las herramientas, el ejemplo de trabajo, three.js r160 incluido, la biblioteca Pen toon.ts de github.com/mromidev/claude-animated-shorts (ambos MIT) y la fuente árabe Lalezar (SIL OFL). Encuéntralo en este orden y trátalo como solo lectura:
- Una carpeta
kit/junto a esteSKILL.md, encontrada confind / -name SKILL.md -path "*cartoon-audio-short*" 2>/dev/null. - Una carpeta
cartoon-short-kitya descomprimida. cartoon-short-kit.zipentre los archivos enviados en este chat:find / -name "cartoon-short-kit*.zip" 2>/dev/null, luego descomprímelo en~/cartoon-short-kit-src/. El kit es la carpeta interior que contieneengine/.
Luego ejecuta bash <kit>/tools/setup.sh ~/shorts/<slug>. Copia el motor y las herramientas en el proyecto, instala three.js incluido, elimina los tipos de toon.ts con module.stripTypeScriptTypes de Node 22 y enlaza Playwright. No se necesita red. Si faltan los archivos incluidos, recurre a npm o un clon de git.
- Requisitos: Node 22.6+, Python 3 con numpy + Pillow, ffmpeg y Playwright con Chromium (
npm i -g playwright && npx playwright install chromiumsi falta). - Si los registros de paquetes están bloqueados, git a través de GitHub suele funcionar. Nunca deshabilites TLS ni evites el proxy.
- Chromium: usa el navegador Playwright preinstalado con
--use-angle=swiftshader --enable-unsafe-swiftshader --ignore-gpu-blocklist. Eso da WebGL por CPU a aproximadamente 3-10 s por fotograma.
4.1 Sincronización
Ejecuta python3 timing.py voice.mp3 script.txt --out work. Añade --lang ar para árabe si no hay guion. El guion puede ser el bloque de voz exacto: elimina [etiquetas] y tashkeel, y también divide las frases en la puntuación árabe.
- Con whisper o faster-whisper instalado, usa marcas de tiempo de palabras. Para árabe usa un modelo multilingüe y mantiene las propias palabras del guion, por lo que una palabra de dialecto malinterpretada no puede cambiar el texto.
- De lo contrario, alinea las frases del guion (divididas por puntuación) con segmentos de voz detectados por silencio, con un DP que empareja sílabas con duración y penaliza los finales de oración dentro de un segmento y los espacios largos dentro de una frase.
- Sin ASR y sin guion, pide el guion. Claude no puede oír audio.
- Comprueba
work/phrases.json: las pausas deben caer al final de las oraciones. Fotogramas totales = round(duración × 30).
4.2 Plan de tomas (work/PLAN.md antes del código)
Haz una fila por toma: fotogramas, palabras, escenario, luz, movimiento de cámara, personajes/poses/expresiones, efectos y señal de SFX.
- El fotograma 0 ya es la imagen del gancho.
- Normalmente una toma por frase. Fusiona frases muy pequeñas en la siguiente toma.
- Ilustra cada oración literalmente. Los accesorios llevan las bromas.
- Varía los tamaños de toma: primer plano medio de gancho → plano general de revelación → plano de dos → inserto de primer plano del objeto clave → primer plano de reacción → movimiento de entorno para la recompensa.
- Usa la luz para los compases: día para normal, dorado para decadencia o drama, azul noche para explicación. Un salto temporal obtiene un destello blanco de 6 fotogramas.
- La línea del giro obtiene un golpe (la música se detiene, golpe bajo, zoom con balanceo). La recompensa física de la última toma llega con la palabra final.
4.3 Mundo (web/main.js)
Mantén las secciones del motor: materiales toon, contrato de tinta, add/tbox, cielo, luces, cartas, objetivos de renderizado/post, applyLight, drawActors, swapForNd, renderFrame. Reemplaza el mundo de ejemplo entre // ---------- world ---------- y // ---------- cards ----------, más las partes de historia de worldState().
- Construye a partir de primitivas con texturas de lienzo pintadas (
paint.js: tablones, vigas, madera podrida, piedra, musgo/hiedra, hierba, tierra, yeso, tejas, mármol, banderas, texto tallado). Escribe nuevos pintores en el mismo estilo plano con costuras oscuras. - Usa
tboxpara densidad de texel constante, un degradado toon de 2 pasos y niebla = color del horizonte. - Fondo: colinas (esferas medio enterradas), montañas (conos + casquetes de nieve), cipreses/ pinos, casas lejanas, carteles de nubes pintadas.
- Piezas de escenografía (derrumbes, caídas, puertas) son grupos pivotados impulsados por progreso 0..1 desde
worldAt(f), con partes suavizadas y escalonadas. - El texto diegético curvo usa UV planares. Comprueba que no esté reflejado.
- Texto árabe en cualquier cosa: usa
P.signCanvas(text, opts)conP.tex()para letreros y etiquetas,P.drawText()en tu propio lienzo, oP.carvedText()para grabados. Cargan la fuente incluida, establecen de derecha a izquierda y dibujan cadenas completas. Nunca dibujes letra árabe por letra.
4.4 Cartas (dibujos de personajes y accesorios)
Dibuja personajes en lienzos de 480×480 con tinta negra y rellenos planos, usando colores vivos (piel naranja-marrón, pantalones azul medianoche, chaqueta rojo óxido, etc.). La paleta de plantilla está en src/palette-*.txt. Haz que los brazos y las piernas lleguen al borde del lienzo para que las escenas de objetos funcionen. Exporta como PNG indexado o PNG opaco con fondo negro: "texto de depósito".
- Guarda en
kit/cards/con nombres de 8.3 para compatibilidad con sistemas de archivos antiguos. - Los accesorios son objetos en fondos negros de 480×480, a veces con agujeros de luz.
- La cámara sostiene una carta con la pinza de
pickReset(hand.x, hand.y, hand.z). A 3.5 unidades de la cámara, una carta de 480 píxeles se acerca a la cámara de 27 mm (equivalente a 35 mm). - Animación: parpadeos y boca. Los parpadeos son 3 fotogramas, la boca se mueve en ciclos de 4-10 fotogramas. Alinea el pico de apertura con la sílaba tónica.
4.5 Renderización
Ejecuta node --max-old-space-size=4096 web/main.js. Produce fotogramas numerados en web/out/ como PNG. El script render-all.sh los agrupa en lotes sin superposición.
- Luego ejecuta
python3 tools/master.pypara fusionar en un MP4 con la mezcla de audio correcta. - Envía una hoja de contactos de fotogramas (cada 4º fotograma en una cuadrícula) para que el usuario pueda aprobar la dirección visual antes de la renderización larga.
- No entregues el video a medio renderizar.
Etapa 5: Entrega
Entrega el archivo MP4 con un mensaje que incluya:
- La duración real y el número de tomas.
- Un recordatorio de que los derechos de autor de la historia pertenecen al usuario (todo el contenido es original).
- Una oferta: "¿Quieres cambiar algo o hacer otro?" ("تريد تغيير شيء أم عمل آخر؟" en árabe).