Skill para Claude Code e Codex

Vídeo do seu produto, feito com código

Você responde três perguntas e o agente escreve cada quadro em HTML, renderiza o MP4 em 16:9 e 9:16 e, se quiser narração, prende cada imagem à palavra que a sua voz está dizendo.

Banner: vídeo com código, seu produto em vídeo sem câmera e sem editor
Em resumo

O video-codigo é uma skill (um pacote de instruções e scripts) para o Claude Code e o Codex, os agentes de código da Anthropic e da OpenAI, que faz vídeos sem câmera e sem editor: cada quadro é escrito em código (HTML, Canvas ou SVG) e vira MP4. Serve para quem quer mostrar um produto, um projeto ou uma ideia em vídeo — lançamento, anúncio, explicativo ou aula. Se o vídeo for narrado, a voz é gerada no seu computador, sem pagar por voz, e cada imagem entra no instante em que a palavra é dita. Para usar, você precisa de Node, Python e FFmpeg; para a voz, do inemavox com GPU NVIDIA (sem ela, o vídeo sai só com música).

O que é

Um diretor de vídeo dentro do seu agente

A skill pergunta o que importa, propõe a direção, testa um trecho e só depois renderiza o vídeo inteiro.

Os seis tipos de vídeo: lançamento, anúncio com ganchos, explicativo, série de produtos, voz local, 16:9 e 9:16

🎬 Vários tipos de vídeo

A skill sabe dirigir lançamento, anúncio com vários ganchos, explicativo de produto, série com o mesmo visual, venda narrada e aula longa. Já vêm dois prontos para copiar: um explicativo narrado e um lançamento só com música.

🎙️ Voz presa à palavra

scripts/voz.py gera a narração com a sua voz clonada e mede o tempo de cada palavra. No HTML, pal('frase', 'palavra') diz quando cada coisa entra.

📐 16:9 e 9:16 juntos

O mesmo projeto se recompõe por formato. Um render para o YouTube, outro para Reels, Shorts e TikTok.

Como funciona

Do pedido ao MP4

Com voz, o relógio do vídeo é a fala. Sem voz, é a música.

3 perguntas→ roteiro.json→ voz.wav + tempos→ cenas em HTML→ prova de 5 s→ MP4 16:9 e 9:16→ revisão

1 · As perguntas

Sobre o que é, e para quem? (pode ser uma pasta, um repositório ou um site para ler) · Com voz ou só música? · Qual estilo? — o padrão INEMA ou um vídeo de referência.

2 · A voz

Cada frase é falada pelo Chatterbox com a voz clonada; o Whisper ouve, confere e marca o tempo de cada palavra. Frase que saiu errada é gerada de novo.

3 · O render

Um navegador sem janela abre a página, pede o quadro de cada instante (window.seek(t)) e o FFmpeg junta tudo com o áudio. Sem rede: fontes e imagens ficam no projeto.

Pré-requisitos

O que precisa estar na máquina

O instalador (instalar.sh) instala sozinho o Playwright e o Chromium, sem sudo. O resto ele só confere e mostra o comando para instalar.

Node, Python e FFmpeg

Node 18 ou mais novo, Python 3 com numpy, scipy e Pillow, FFmpeg no PATH.

# conferir
node -v && python3 -V && ffmpeg -version | head -1
# bibliotecas do Python (Ubuntu/Debian)
sudo apt install python3-numpy python3-scipy python3-pil
# outros sistemas
python3 -m pip install --user numpy scipy pillow

Playwright + Chromium

Um navegador sem janela, controlado por script, que tira a foto de cada quadro do vídeo. Vai para ~/.cache.

# o instalar.sh (passo 1) já roda isto
bash ~/projetos/video-codigo/scripts/preparar-entorno.sh

Voz (opcional, precisa de GPU NVIDIA)

A voz usa o inemavox instalado em ~/projetos/inemavox: o Chatterbox (modelo que fala com uma voz copiada de uma gravação, a "voz clonada") e o Whisper (modelo que ouve o áudio e marca o tempo de cada palavra). Precisa também do Miniconda (gerenciador de ambientes Python; o instalador oficial vai para ~/miniconda3) e de uma gravação limpa de 10–20 s da sua voz em .wav. No primeiro uso os modelos baixam alguns GB. Se o seu conda ou o inemavox estiverem em outro lugar, aponte com CHATTERBOX_PYTHON=/caminho/python3 e INEMAVOX_DIR=/caminho/inemavox. Sem GPU ou sem o inemavox, faça vídeos só com música.

# os três precisam existir
ls ~/miniconda3/envs/chatterbox/bin/python3 \
   ~/projetos/inemavox/chatterbox_tts_worker.py \
   ~/projetos/inemavox/venv/bin/python
# instalar (testado: Python 3.11, chatterbox-tts 0.1.6)
git clone https://github.com/inematds/inemavox ~/projetos/inemavox
conda create -n chatterbox python=3.11 -y
~/miniconda3/envs/chatterbox/bin/pip install chatterbox-tts==0.1.6
cd ~/projetos/inemavox && python3 -m venv venv && venv/bin/pip install faster-whisper soundfile numpy
Guia de uso · passo a passo

Seu primeiro vídeo com código

O jeito normal é só pedir ao agente (passo 2): ele escreve o roteiro e as cenas e roda tudo. Os comandos dos passos seguintes são o que ele roda — e servem para você refazer uma etapa à mão. Para isso, rode antes no terminal ($K é a pasta do kit, $P a do seu vídeo):

K=~/projetos/video-codigo                      # onde o kit foi clonado
P=~/videos/trabalho/2026-11-06-meuapp         # uma pasta por vídeo
mkdir -p "$P"
1

Instale a skill

Clona o repositório, liga a skill no Claude Code e no Codex e instala o navegador do render.

git clone https://github.com/inematds/video-codigo ~/projetos/video-codigo
bash ~/projetos/video-codigo/instalar.sh  # ✓ skill em ~/.claude/skills/video-codigo

Teste a instalação renderizando o exemplo pronto (não precisa de voz nem de GPU; leva cerca de 1 minuto):

cd ~/projetos/video-codigo/exemplos/lancamento && node ../../scripts/render-video.mjs --project . --output teste.mp4 --audio audio/lancamento/mezcla.wav --overwrite
2

Peça o vídeo

Diga o assunto e, se tiver, onde está o material. O agente faz as três perguntas que faltarem. Para narrar com a sua voz, diga onde está a gravação .wav.

/video-codigo faz um vídeo de 40 s do meu app, lê a pasta ~/projetos/meu-app, narrado com a voz de ~/minha-voz.wav, estilo INEMA
↷

Sem voz? O relógio é a música

Sem narração você não precisa de roteiro nem de GPU. O mais simples é pedir ao agente ("só com música, 20 s") — ele escreve as cenas. Para partir do exemplo de lançamento à mão, saiba o que mudar no <script> do index.html:

• window.videoSpec = {… duration: 21} — a duração do vídeo em segundos; use a mesma da música.
• SEG — a lista das etapas: a e b são os segundos em que cada etapa entra e sai, rot e sub são o título e a linha de baixo.
• S — onde fica e que tamanho tem a forma amarela em cada segundo (t), que é o que liga uma etapa à outra.
• function conteudo — o desenho dentro da forma em cada etapa (módulos, página, play, terminal, conversa). Troque pelos do seu produto.

cp -r $K/exemplos/lancamento/{index.html,motion.mjs,inema} $P/
python3 $K/scripts/mezcla.py --projeto $P --id meuapp --duracao 21 --musica energica --lufs -14  # mesma duração do videoSpec

Depois vá ao passo 7 (prova) e ao 8 (render, com --audio $P/audio/meuapp/mezcla.wav).

3

Roteiro com uma frase por instante

Arquivo $P/roteiro.json. Cada frase tem um id: é nele que a imagem se prende. Em voz, o caminho da sua gravação. O dicionario troca o que aparece na tela pelo que a voz deve ler.

{"id": "meuapp", "pausa": 0.28, "voz": "/home/voce/minha-voz.wav",
 "dicionario": [["16:9", "dezesseis por nove"]],
 "blocos": [{"id": "abertura", "frases": [
   {"id": "hook", "texto": "Este vídeo não tem câmera."},
   {"id": "codigo", "texto": "Cada quadro foi escrito em código."}]}]}
4

Gere a voz com o tempo de cada palavra

Roda no seu computador. Sai $P/voz/meuapp/voz.wav e $P/voz/meuapp/tiempos.js (o tempo de cada palavra); frase abaixo de 80% de semelhança é refeita sozinha. Cada frase é ouvida pelo Whisper: se não bate com o texto (ou um número sai trocado), é gerada de novo, até --tentativas vezes. O relatório fica em $P/voz/meuapp/checagem.md, com o que o Whisper ouviu — leia as frases marcadas com ⚠.

python3 $K/scripts/voz.py --projeto $P $P/roteiro.json  # ex.: meuapp: 41.9 s · 12 frases · 107 palavras
5

Música por baixo

Música original sintetizada (energica, 120 batidas por minuto; tranquila, 84; ou --pista com a sua música), 24 dB abaixo da voz enquanto se fala. --lufs -14 deixa o volume final no nível que YouTube e Instagram usam (assim a plataforma não abaixa nem estoura o som). Sem voz, passe --duracao em segundos. A música se prende aos cortes das cenas: cada troca de cena cai num tempo forte, na troca de acorde, sem pulo de volume. No fim o script confere isso, a voz na frente e a ausência de whoosh, e grava trilha.json.

python3 $K/scripts/mezcla.py --projeto $P --id meuapp --musica tranquila --lufs -14  # → $P/audio/meuapp/mezcla.wav
6

Cenas presas à fala

Parta do exemplo narrado: ele já traz o tema, o motor de tempo e o esqueleto que o render usa (videoSpec = tamanho e duração, seek(t) = desenha o instante t, renderReady = avisa quando fontes e imagens carregaram). Troque o texto das cenas e, em todo pal('frase', 'palavra'), ini('frase') e data-in, os id e palavras pelos do seu roteiro. Se sobrar algum do exemplo, o render para e diz qual: Não encontrei «câmera» na frase hook do roteiro.

cp -r $K/exemplos/explicativo-narrado/{index.html,engine.mjs,motion.mjs,declarativo.mjs,inema} $P/
cp $P/voz/meuapp/tiempos.js $P/   # os tempos da sua voz
// no <script> do index.html: cada elemento entra na palavra dita
pop($('.code', c1), t, pal('codigo', 'escrito'));   // entra quando a voz diz "escrito"
pop($('.onda', c1), t, ini('voz'));                 // entra no começo da frase "voz"
7

Prova antes do render inteiro

Tire quadros soltos nos momentos difíceis, nos dois formatos, e olhe antes de gastar tempo com o vídeo todo. --still é o segundo do vídeo (tem que estar dentro da duração; num roteiro de 5 s, use 2 ou 3).

node $K/scripts/render-video.mjs --project $P --output $P/prova.png --still 2
node $K/scripts/render-video.mjs --project $P --output $P/prova-v.png --still 2 --width 1080 --height 1920

Confira também se todo texto fica o tempo de ser lido (1 s + 0,3 s por palavra, mínimo 1,5 s) e grave os cortes das cenas; depois rode a música de novo para ela se prender a eles.

node $K/scripts/checar-leitura.mjs --project $P --salvar-cortes $P/audio/meuapp/cortes.json  # sai 0 = tudo legível; 1 = algum texto some cedo
python3 $K/scripts/mezcla.py --projeto $P --id meuapp --musica tranquila --lufs -14  # a música agora cai nos cortes
8

Render e revisão

Um MP4 por formato e uma folha de quadros para conferir o vídeo inteiro de uma vez.

node $K/scripts/render-video.mjs --project $P --output $P/renders/meuapp-16x9.mp4 --audio $P/audio/meuapp/mezcla.wav
node $K/scripts/render-video.mjs --project $P --output $P/renders/meuapp-9x16.mp4 --width 1080 --height 1920 --audio $P/audio/meuapp/mezcla.wav
python3 $K/scripts/inspect-video.py $P/renders/meuapp-9x16.mp4 --output-dir $P/reviews
9

Modo b-roll: vídeo de pessoa falando

Para aula, depoimento ou avatar: a gravação não é cortada. A partir da transcrição com o tempo de cada palavra, o kit decide frase a frase o que a tela mostra — a pessoa inteira, a pessoa num círculo com o conceito desenhado em traço, ou um gráfico em tela cheia — e monta o projeto pronto para renderizar. Revise $P/plano.md e edite $P/plano.json antes do render.

# transcrição local com o tempo de cada palavra
cd ~/projetos/inemavox && venv/bin/python transcrever_v1.py --in aula.mp4 --outdir $P/transcricao --src pt --words
# plano + molde + quadros + áudio; --rosto = onde está o rosto
python3 $K/scripts/broll-plano.py --fala aula.mp4 --transcricao $P/transcricao/transcript.json --projeto $P --rosto 0.58,0.45,0.38
# depois de editar o plano.json
python3 $K/scripts/broll-plano.py --projeto $P --replanejar
node $K/scripts/checar-leitura.mjs --project $P
node $K/scripts/render-video.mjs --project $P --output $P/renders/aula-broll.mp4 --audio $P/audio/fala.wav
Exemplos

Três vídeos feitos com o próprio kit

Código, roteiro e áudio de cada um estão em exemplos/. Nenhum quadro foi filmado. O primeiro sucesso mais rápido, sem voz nem GPU: renderize o exemplo de lançamento.

cd $K/exemplos/lancamento && node ../../scripts/render-video.mjs --project . --output teste.mp4 --audio audio/lancamento/mezcla.wav --overwrite
Filme de produto do atende-leads (63 s) — recria as telas reais: leads esperando no WhatsApp, o agente que qualifica, o chamado no Telegram que passa da Ana ao Bruno em 2 min, o painel da equipe, a sugestão de resposta e a venda. Cursor clicando, voz do Nei presa a cada palavra. Caso de exemplo. versão 9:16 · YouTube
Explicativo narrado (44 s) — voz local do Nei; código digitando, marcas de tempo de cada palavra e o quadro 16:9 virando 9:16 na palavra certa. versão 9:16 · YouTube
Lançamento só com música (21 s) — um plano só: a mesma forma vira curso, guia, vídeo, kit, comunidade e o ponto do INEMA.CLUB. versão 9:16 · YouTube
Próximos passos

O que já existe e o que vem

Feito = está no repositório e foi usado nos exemplos.

Feito
Skill, voz local e tema INEMASKILL.md e referências em português, voz.py com Chatterbox + Whisper, tema com fontes locais, dois exemplos em 16:9 e 9:16.
Feito
Qualidade conferida sozinha (1.2)Verificador de tempo de leitura, voz checada pelo Whisper (com números), música presa aos cortes e modo b-roll para vídeo de pessoa falando.
Próximo
Exemplo pronto de anúncio com vários ganchosA skill já sabe fazer; falta um exemplo renderizado com o mesmo corpo e cinco aberturas diferentes.
Depois
Exemplo pronto de série de produtosUm vídeo por produto com o mesmo visual, a partir de uma lista.