Kit para Claude Code · voz local · sin API de pago

Video explicativo sin rostro, del enlace al 1080p

Tú pasas el enlace de una herramienta. El agente investiga, escribe el guion, tú lo apruebas, y cada frase se convierte en una escena con captura real, imagen 3D y subtítulos palabra por palabra.

Banner de video-sem-rosto: video explicativo sin cámara y sin avatar
En resumen

video-sem-rosto es un kit (una "skill") que enseña a Claude Code a hacer videos explicativos en horizontal sin grabar nada: sin cámara, sin avatar. Sirve para quien quiere explicar una herramienta, un repositorio o una novedad en video sin aparecer y sin pagar un servicio de voz. La voz se genera en tu computadora con una voz clonada, y las escenas muestran la página real del sitio, imágenes 3D y subtítulos sincronizados. Para usarlo, necesitas Claude Code, ffmpeg, Python e inemavox (que hace la voz y la transcripción) funcionando en tu máquina.

Qué es

Un estudio de motion design que el agente opera

Cada escena es una página HTML animada en el tiempo exacto del habla. Chromium avanza cuadro a cuadro y ffmpeg monta el video.

Las etapas del kit: investigación, guion aprobado, voz local, capturas reales, render 1080p60 y QC

🎙️ Voz local, verificada

Chatterbox genera cada frase con la voz clonada; Whisper local la escucha, la compara con el guion y manda generar de nuevo la frase que salió mal. Ninguna API de pago.

🖼️ Captura real con zoom

El capture.py abre la página, encuentra el texto que cita la voz y devuelve su posición, para que el zoom y el anillo caigan exactamente ahí.

✅ Puertas de calidad

No se genera nada antes de que el guion esté aprobado. Al final, el qc.py verifica 1920x1080, 60 fps, bitrate, −14 LUFS y cuadros negros, y arma una hoja para revisar.

Cómo funciona

Del enlace al video, en 8 etapas

Voz, imágenes y capturas corren en paralelo. Las escenas se escriben leyendo el tiempo de cada palabra en el words.json.

Investigación de la fuente oficial→ Guion→ Tú apruebas→ Voz + tiempo por palabra→ Imágenes 3D y capturas→ Escenas (job.py)→ Render 1080p60→ QC

3 looks

reel (papel ↔ negro, chips, 3D), cinema (imagen real primero, letterbox) y ledger (notas de versión, contadores). Alterna entre videos.

Tema INEMA

Negro #0c0c10, papel claro, amarillo #FACC15, títulos en Sora y cuerpo en Inter, aplicados en los tres looks. FV_THEME=original vuelve a la paleta crema/naranja.

Sonido limpio

Solo la voz, a −14 LUFS, y una pista opcional baja. Sin whoosh en los cortes (FV_WHOOSH=1 lo activa, si quieres).

Requisitos previos

Lo que debe estar en la máquina

El setup.sh verifica todo y se detiene con el mensaje de lo que falta.

Python 3 + ffmpeg

Motor de las escenas y codificación del video.

# Ubuntu
sudo apt install python3-venv ffmpeg

inemavox (voz y transcripción)

Proyecto abierto de INEMA que trae el worker de Chatterbox y un venv con faster-whisper. El kit usa ambos por ruta (INEMAVOX_DIR cambia la ubicación).

git clone https://github.com/inematds/inemavox ~/projetos/inemavox
cd ~/projetos/inemavox && python3 -m venv venv
venv/bin/pip install faster-whisper soundfile numpy

Chatterbox (genera la voz)

Modelo abierto de voz que clona la voz a partir de un audio corto. Corre en un entorno conda propio (CHATTERBOX_PYTHON cambia la ruta).

# Miniconda (si no lo tienes): https://docs.anaconda.com/miniconda/ — se instala en ~/miniconda3
# otro lugar: export CHATTERBOX_PYTHON=.../envs/chatterbox/bin/python3
conda create -n chatterbox python=3.11 -y
~/miniconda3/envs/chatterbox/bin/pip install chatterbox-tts soundfile

Tu voz de referencia

10 segundos de habla limpia, sin música, en .wav 24 kHz mono. Grábala con el celular y conviértela:

ffmpeg -i gravacao.m4a -ss 2 -t 10 -ac 1 -ar 24000 ~/minha-voz.wav
echo 'export FV_VOICE=~/minha-voz.wav' >> ~/.bashrc && source ~/.bashrc

Claude Code

Es quien sigue el SKILL.md: investiga, escribe el guion y las escenas, ejecuta los scripts.

claude

Codex CLI (opcional)

Genera las imágenes 3D con la suscripción de ChatGPT (sin API): npm i -g @openai/codex y codex login. Sin él: FV_IMG=flux si tienes un servidor flux2-klein local, o haz el video solo con capturas, logos e íconos.

codex login

GPU (recomendado)

La voz y Whisper corren bastante más rápido en GPU; ambos pasan a CPU si es necesario.

nvidia-smi

Términos que aparecen en la guía

Whisper: modelo que transcribe habla; aquí escucha cada frase para medir si salió bien y marcar el tiempo de cada palabra. LUFS: medida de volumen percibido; −14 es el estándar de YouTube. Hoja de contacto (stills): una imagen con varios cuadros del video, para revisar todo de una vez. Look: el estilo visual del video — reel (predeterminado), cinema (imagen real a pantalla completa, franjas negras de cine) o ledger (aspecto de notas de versión); elige con Video(job, look="cinema"). flux2-klein: generador de imágenes que corre en local; el kit lo llama en localhost:8000 (FV_FLUX_URL) solo si tienes ese servidor.

En la 1.ª ejecución Whisper large-v3 (~3 GB) y Chatterbox descargan los pesos de los modelos. Si Playwright se queja de una biblioteca del sistema: sudo .venv/bin/python -m playwright install-deps chromium.

Guía de uso · paso a paso

Instala una vez, pide cuantos quieras

Usa TMPDIR=$(mktemp -d /tmp/fv.XXXX) delante del render y de la captura: Chromium aborta si la ruta temporal es demasiado larga.

1

Clona e instala

Crea el .venv del proyecto (Playwright + Pillow), verifica voz y Whisper y enlaza la skill en ~/.claude/skills/video-sem-rosto.

git clone https://github.com/inematds/video-sem-rosto ~/projetos/video-sem-rosto
cd ~/projetos/video-sem-rosto && bash setup.sh   # tiene que terminar con SELFTEST PASS
2

Ajusta el perfil

El PROFILE.md guarda voz, llamada a la acción, visual y palabras prohibidas; la skill lo lee antes de cada video. Viene con el perfil de INEMA (llamada a inema.club, publicación con yt-pubx, avisos en el bot): cambia nombre, llamada, canal y reglas por los tuyos. Los pasos de publicación del SKILL.md que citan herramientas de INEMA son opcionales.

nano PROFILE.md   # tu nombre, tu voz, tu llamada (~3:00 y al final), tu canal
3

Pide el video en Claude Code

El agente investiga la fuente oficial, escribe script.txt y el guion con tiempos, y se detiene esperando tu aprobación. Después de tu "ok", él mismo ejecuta los pasos 4 a 7; los comandos de abajo sirven para ejecutarlos a mano o entender lo que ocurre.

haz un video sin rostro sobre https://github.com/dono/projeto — unos 8 minutos, muéstrame el guion antes
4

A mano: carpeta del video y voz con tiempo por palabra

Para ejecutar sin el agente, empieza por el ejemplo de ~40 s (trae la marca INEMA en el texto de las escenas: cámbiala en el job.py). El tts.py lee $P/script.txt y genera vo.mp3, words.json y vo_qc.json (similitud de cada frase).

P=~/videos/teste; mkdir -p $P/{img,cap}
cp templates/exemplo_30s.py $P/job.py && cp templates/exemplo_30s.txt $P/script.txt
python3 scripts/tts.py $P   # usa FV_VOICE; FV_LANG=pt
5

Imágenes 3D y capturas (en paralelo)

c_ = fondo claro, d_ = oscuro; un objeto por imagen. La captura devuelve un .json con el recuadro de cada texto pedido.

python3 scripts/images.py $P/img d_clap="a film clapperboard beside an empty tripod" d_monitor="a widescreen monitor with a play button"
TMPDIR=$(mktemp -d /tmp/fv.XXXX) .venv/bin/python scripts/capture.py https://github.com/inematds/yt-pubx $P/cap/gh.png "README"
6

Escenas, verificación y render

El job.py del ejemplo usa img/d_clap.png, img/d_monitor.png y cap/gh.png (generados en el paso 5). Los tiempos de las escenas son los de la voz del ejemplo: con tu voz, ajusta los v.scene(inicio, fin, …) leyendo el words.json. Video largo: templates/job_full_template.py. Primero la hoja de escenas, después el render.

TMPDIR=$(mktemp -d /tmp/fv.XXXX) .venv/bin/python $P/job.py stills   # out/stills.jpg
TMPDIR=$(mktemp -d /tmp/fv.XXXX) .venv/bin/python $P/job.py          # out/video-sem-rosto-teste.mp4
7

QC

Verifica tamaño, fps, bitrate, volumen y cuadros negros; sale con error si algo reprueba y graba una hoja de 16 cuadros.

python3 scripts/qc.py $P/out/video-sem-rosto-teste.mp4
Ejemplos

Dos videos hechos con el kit, en dos looks

Voz local, tema INEMA, 1080p60, −14,3 LUFS. Descarga los dos en 1080p60 en la release 1.0.1.

Ejemplo 1 · look reel (por defecto): el propio kit en ~40 s — papel ↔ negro, render 3D, chips y subtítulos karaoke (narración en portugués).
Ejemplo 2 · look ledger: yt-pubx en ~35 s — terminal, lista de cambios, pasos numerados y subtítulos estilo terminal (narración en portugués).

Abajo: la hoja de contactos y un cuadro del ejemplo 1.

Hoja con 16 cuadros del video de prueba
Hoja de contacto generada por el qc.py: papel ↔ negro, tarjeta amarilla, captura real, subtítulos karaoke.
Cuadro del video de prueba con chips Título, Captura real, Imagen 3D y Subtítulo
Escena "Cada frase, una escena": cada etiqueta entra en el tiempo de la palabra hablada.
Roadmap

Lo que viene después

El kit ya hace el video completo. Los próximos pasos son de integración con lo que INEMA ya usa.

1.0 · hecho
Kit funcionandoVoz local verificada, tema INEMA, 3 looks, QC, ejemplo de 40 s, setup con autotest.
próximo
Miniaturas y descripción en un scriptHoy el agente hace las miniaturas y la descripción con capítulos siguiendo el SKILL.md; el próximo paso es un script que lo haga solo.
después
EN/ES en un comandoTraducir el script.txt, generar la voz en FV_LANG=en|es y reaprovechar las escenas.