¿Qué hace Duo Sketch Reel (Nerd + Claude)?
Un sketch 3D en el que el Nerd entra en pánico y Claude (el robot naranja) responde con total serenidad. Todo es
Blender procedimental: el set, ambos personajes, la actuación, las luces, las cámaras, los monitores, la superposición, la banda sonora y los efectos de sonido se construyen a partir de
un único archivo por episodio, storyboard.json. Un nuevo episodio son datos, no código. No hay generación de imágenes ni vídeo en ningún momento.
Un episodio es una carpeta: <cualquier_cosa>/<AAAA-MM-DD>_<slug>/ con storyboard.json y research.md. El
pipeline escribe todo lo demás dentro de ella (assets/, project/, renders/, final.mp4, cover.png, qa/).
Dos episodios terminados viven en examples/ del repositorio: copia uno para empezar.
Flujo de trabajo (en orden, no saltar)
- Tema (5 min). Un problema real de desarrollo/IA y UN consejo que un desarrollador pueda usar hoy. El chiste va sobre
lo que el espectador hace con su IA, no sobre una herramienta. Reglas y banco de ideas:
references/retention.md. - Investigación →
research.md: cada hecho que aparezca en pantalla / en la voz / en el pie de foto con URL + fecha comprobada, fuentes primarias (documentación oficial, README, código fuente). Una sección separada "Ficción" para las partes inventadas de la historia del sketch (tiempos, números, nombres). Elimina lo que no puedas verificar y dilo. - Guión + storyboard →
storyboard.json(copia un ejemplo y reescríbelo). Esquema y vocabulario:references/storyboard.md. Objetivo: 30-40 s, 10-14 líneas, primera palabra ≤ 0.5 s, un corte cada 1.5-3 s, el Nerd abre, Claude cierra, el último fotograma enlaza con el primero. - Borrador gratuito (macOS):
pipeline.sh <episodio> --say stills(voces del sistema, sin créditos). Mirarenders/stills/sheet.jpg(un fotograma por final de compás). Corrige problemas de encuadre/colisiones de superposición, vuelve a ejecutar. ¿No tienes macOS? Omite--say: graba o genera las tomas primero (paso 5), luego ejecutastills. - Voces. Un archivo de audio por línea en
assets/audio/dialogue_raw/<id de compás>.mp3(L01.mp3, ...). Los episodios de referencia usan ElevenLabseleven_v4con dos voces de librería - Nerd = "Quinn - Soft Nerd Boy", Claude = "Sarcastic Nigel" - y etiquetas de audio en cada compás de sutts(p.ej.[deadpan] It was ugly.). Con el conector de ElevenLabs en Claude: estima primero una línea (≈ 1 crédito por carácter incluyendo etiquetas), luego una generación por línea, y descarga cada toma desde sucontent_url. Un episodio de 11 a 14 líneas cuesta ≈ 700-900 créditos. Tus propias grabaciones también funcionan: mismos nombres de archivo. - Construcción real + stills:
pipeline.sh <episodio> stills.project/whisper_check.txtlista guión vs oído por línea (ratio < 0.8 = escúchala). Las tomas son más largas que el borradorsay: comprueba la hoja de nuevo. - Final:
pipeline.sh <episodio> final(16 muestras, 3 workers ≈ 3 s por fotograma en un Mac M-series: un sketch de 38 s ≈ 1 h; ejecútalo en segundo plano). Renderizafinal.mp4, la variante B-hookfinal_b.mp4,cover.png, y ejecutaqa.py→qa/report.md(debe decir Bloqueos: ninguno).
Reglas estrictas
- Personajes: no rediseñar al Nerd ni a Claude (
engine/scene/nerd.py,mascot.py). Claude no tiene boca: "habla" con compresión corporal, rebotes, ojos y brazos. - Un sketch puede inventar su historia (eso es comedia), nunca una característica del producto, número, benchmark o cita.
- Los remates (sellos, llaves, marcas) van 0.2-0.3 s antes de la palabra que ilustran, nunca en la última palabra.
- Borrador gratuito antes que voces de pago; stills antes del render final.
Archivos
pipeline.sh <episodio> [--say] [build|stills|draft|final]engine/scene/Lado de Blender:build_scene.py(entrada),animate.py(actuación/luces/cámaras desde el storyboard),env.pyset,nerd.py,mascot.py,lights.py,tl.py(anclajes, compartidos con scripts).engine/scripts/:build_timeline.py(tomas → línea temporal + palabras whisper + lipsync),make_screens.py(plantillas de monitor),make_overlay.py(gancho, subtítulos, elementos, tarjeta de título, captions.srt),make_audio.py+synth.py(banda sonora/EFX),master_audio.py(-14 LUFS),stills.py,draft.sh,render_final.sh,encode.sh,make_cover.py,cover_title.py,qa.py,make_textures.py.- Herramientas y rutas (variables de entorno, macOS por defecto):
BLENDER(binario Blender 5.x),DUO_PYTHON(un Python con numpy, scipy, soundfile, pillow; por defecto~/.venvs/duo-reel/bin/python),WHISPER_MODEL(modelo whisper.cpp, por defecto~/whisper-models/ggml-medium.en.bin),whisper-cliyffmpegen PATH, fuentesDUO_FONT_DISPLAY/DUO_FONT_MONO/DUO_FONT_SANS/DUO_FONT_EMOJI. references/storyboard.md(esquema, cada preajuste),references/retention.md(gancho/estructura/temas),references/lessons.md(cosas que salieron mal una vez).