MÓDULO 2.2

🛠️ Setup & pré-requisitos

Instale Node.js 22+, FFmpeg, Chrome headless e o TTS Kokoro. Configure tudo do zero até executar npx hyperframes init com sucesso.

6
Tópicos
20
Minutos
Prático
Nível
Setup
Tipo
HyperFrames CLI npx hyperframes Node.js v22+ runtime FFmpeg C:\ffmpeg\bin -nostdin Chrome headless browser ensure Kokoro TTS PT-BR pf_dora hyperframes doctor ✓ diagnóstico AMBIENTE DE SETUP
1

⚙️ Node 22+ e FFmpeg

Dois binários obrigatórios: Node.js na versão 22 ou superior e FFmpeg acessível no PATH. Sem eles o HyperFrames não consegue renderizar um único frame.

Por que Node 22+ especificamente?

O HyperFrames usa ESM nativo e APIs de fs/promises presentes a partir do Node 18, mas a versão 22 traz o --experimental-strip-types e o V8 atualizado que acelera o parse das composições. Versões antigas (16, 18) podem funcionar parcialmente mas causam avisos e comportamentos inesperados no build-index.mjs.

Verificar versão e instalar via nvm (git-bash / WSL)
# Verificar versão atual
node --version
# deve retornar v22.x.x ou superior
# Se precisar instalar via nvm
nvm install 22
nvm use 22
nvm alias default 22
Instalar FFmpeg e adicionar ao PATH (Windows)
# 1. Baixar release estática de ffmpeg.org/download.html
# 2. Extrair em C:\ffmpeg (deve ter bin\ffmpeg.exe dentro)
# 3. Adicionar ao PATH via PowerShell (Admin)
[Environment]::SetEnvironmentVariable("Path",
"$env:Path;C:\ffmpeg\bin",
"Machine")

# 4. Verificar (novo terminal)
ffmpeg -version
# deve mostrar ffmpeg version 6.x ou 7.x
✓ Caminho correto
  • FFmpeg em C:\ffmpeg\bin\ffmpeg.exe
  • PATH configurado na variável de sistema (não usuário)
  • Node 22+ verificado com node --version
  • Abrir novo terminal após alterar PATH
✗ Armadilhas comuns
  • Usar FFmpeg instalado pelo choco sem verificar PATH
  • Node 16 ou 18 — causa erros no ESM nativo
  • Testar ffmpeg no terminal antigo (PATH não atualizado)
  • ffmpeg.exe fora do subdiretório bin
Conceitos-chave
⚙️
Node 22+
ESM nativo
🎞️
FFmpeg
C:\ffmpeg\bin
🌿
nvm
Gerenciar versões
🔗
PATH
Var. sistema
2

⌨️ ffmpeg -nostdin no git-bash

O gotcha mais silencioso do setup: rodar FFmpeg dentro do git-bash sem -nostdin causa exit 0 sem gerar nenhum arquivo. Nenhum erro visível — simplesmente nada é criado.

⚠️ Gotcha crítico — sai exit 0 sem arquivo

No git-bash (MinTTY), o FFmpeg tenta ler stdin e bloqueia silenciosamente. O processo termina com código 0 (sucesso), mas nenhum MP4 é gerado. É o bug mais difícil de diagnosticar porque tudo parece ter funcionado.

✗ Problema (git-bash)
# Sai exit 0, sem arquivo!
ffmpeg -i frames/%04d.png \
-c:v libx264 output.mp4
# Nenhum erro — e nenhum MP4
✓ Solução (-nostdin)
# Correto no git-bash
ffmpeg -nostdin \
-i frames/%04d.png \
-c:v libx264 output.mp4
# Gera o MP4 corretamente
💡
O HyperFrames já inclui -nostdin

O CLI do HyperFrames (npx hyperframes render) passa -nostdin automaticamente nas chamadas internas ao FFmpeg. Você só precisa se preocupar se for invocar FFmpeg diretamente no git-bash para pós-processamento manual, script de concatenação etc.

📊 Por que acontece?
MinTTY (git-bash)
Emula terminal POSIX. Quando FFmpeg detecta que stdin é um TTY, espera input do usuário — que nunca vem.
Exit code 0
FFmpeg fecha a leitura de stdin e termina normalmente, sem erro — mas sem processar nada. Comportamento ambíguo por design.
-nostdin
Desativa a leitura de stdin completamente. FFmpeg processa o arquivo de entrada sem bloquear no TTY.
Conceitos-chave
⚠️
MinTTY
TTY no git-bash
🔇
-nostdin
Flag obrigatório
0️⃣
Exit 0
Silencioso
🔄
CLI auto
Já incluso
3

🌐 Chrome headless do HyperFrames

O HyperFrames traz seu próprio Chrome headless — não depende do Chrome instalado no sistema. Um único comando baixa e vincula a versão exata testada com o CLI.

Por que um Chrome dedicado?

Versões diferentes do Chrome renderizam CSS e animações GSAP com diferenças sutis de pixel. Para que o output seja determinístico (mesmo HTML → mesmo MP4), o HyperFrames trava em uma versão específica do Chromium via Puppeteer, baixada e gerenciada internamente. Você não precisa tocar no Chrome do sistema.

Baixar o Chrome headless (apenas uma vez)
# Baixa e instala o Chromium na versão travada pelo HyperFrames
npx hyperframes browser ensure

# Output esperado:
✓ Chromium 121.0.6167.85 already installed
# ou
⬇ Downloading Chromium 121.0.6167.85 (~170MB)...
✓ Done
O que o comando faz internamente
1

Lê a versão travada no package.json do HyperFrames

O campo puppeteer.chromiumRevision define exatamente qual build do Chromium usar — nada de "latest".

2

Verifica cache local (~/.cache/puppeteer/)

Se o build já existe, pula o download. O segundo projeto criado não espera nada — instantâneo.

3

Baixa ~170MB do CDN do Chromium se necessário

Apenas na primeira vez ou quando a versão do HyperFrames é atualizada. Conexão estável recomendada.

💡
Verificar onde o Chrome foi instalado
npx hyperframes browser path
# mostra o caminho completo do executável
Conceitos-chave
🌐
Chromium
Versão travada
🎭
Puppeteer
Gerenciador
💾
Cache
~/.cache/puppeteer
🔒
Determinístico
Pixel-perfect
4

🔊 TTS Kokoro

Narração PT-BR 100% local, sem chave de API. Kokoro tem seu próprio fonemizador de português, dispensando o espeak-ng. Na primeira execução, baixa ~340MB de modelo.

✓ Instalação correta
  • pip install kokoro-onnx soundfile
  • Python 3.10+ no PATH
  • Primeira execução: aguardar ~340MB de download
  • Voz padrão: pf_dora com --speed 0.98
✗ Não instale
  • espeak-ng — Kokoro não precisa e cria conflito
  • Outros pacotes TTS que dependem de espeak
  • Interromper o primeiro download do modelo
  • Usar speed 1.0+ — soa mecânico em PT-BR
Instalar e gerar primeiro áudio
# Instalar (uma vez)
pip install kokoro-onnx soundfile

# Gerar narração via HyperFrames TTS
npx hyperframes tts "assets/txt/s1.txt" \
--voice pf_dora \
--speed 0.98 \
--output assets/audio/s1.wav

# Na 1ª execução — saída esperada:
⬇ Downloading kokoro model (~340MB)...
✓ Model cached at ~/.cache/kokoro/
✓ Generated: assets/audio/s1.wav (3.2s)
💡
Por que sem espeak-ng?

espeak-ng fonemiza português pobremente — pronúncia robótica em palavras técnicas. Kokoro tem seu próprio fonemizador PT-BR treinado especificamente para o idioma.

Segunda execução: instantâneo

O modelo (~340MB) é cacheado em ~/.cache/kokoro/. Da segunda invocação em diante, a geração de um trecho de 10s leva menos de 2 segundos.

Conceitos-chave
🔊
kokoro-onnx
Engine TTS
🗣️
pf_dora
Voz PT-BR
📦
340MB
1ª vez só
🚫
sem espeak
Não instalar
5

🩺 npx hyperframes doctor

O comando de diagnóstico verifica toda a stack de uma vez: Node, FFmpeg, Chrome e Kokoro. Se algo estiver errado, ele diz exatamente o que falta.

Saída esperada (ambiente OK)
npx hyperframes doctor

# Saída esperada:
✓ Node.js v22.3.0 — OK
✓ FFmpeg 6.1.1 found at C:\ffmpeg\bin\ffmpeg.exe
✓ Chrome headless 121.0.6167.85 — cached
✓ kokoro-onnx 0.8.2 — installed
✓ soundfile 0.12.1 — installed

All systems go 🚀
Saída com problemas (FFmpeg não encontrado)
npx hyperframes doctor

✓ Node.js v22.3.0 — OK
✗ FFmpeg not found in PATH
→ Install FFmpeg and add C:\ffmpeg\bin to PATH
✓ Chrome headless 121.0.6167.85 — cached
⚠ kokoro-onnx not found
→ Run: pip install kokoro-onnx soundfile

2 issues found. Fix them before rendering.
💡
Rode doctor antes de qualquer render

Especialmente em ambiente novo ou após atualizar o HyperFrames. O npx hyperframes render falha no meio do processo se uma dependência estiver faltando — o doctor detecta isso antes.

O que o doctor verifica
1

Node.js — versão mínima 18, recomendada 22+

process.version e compara com o campo engines do package.json.

2

FFmpeg — executa ffmpeg -version e parseia a saída

Verifica se o binário está acessível via PATH e mostra o caminho completo encontrado.

3

Chrome — verifica cache do Puppeteer

Checa se o build travado está em ~/.cache/puppeteer/. Se não, sugere rodar browser ensure.

4

Kokoro — importa o módulo Python e verifica

Executa python -c "import kokoro_onnx" e import soundfile. Versões mínimas checadas.

Conceitos-chave
🩺
doctor
Diagnóstico
All OK
4 checks
Issues
Com sugestão
🔁
Pré-render
Sempre rodar
6

📦 Iniciar um projeto

Com o ambiente pronto, o próximo passo é criar a estrutura do projeto. O template blank + --non-interactive gera tudo sem perguntas — ideal para scripts e CI.

Template blank vs outros

O --example blank cria um projeto mínimo com a estrutura de pastas correta mas sem cenas pré-construídas — você parte do zero. É o ponto de entrada recomendado para aprender o pipeline, pois cada arquivo que aparece foi criado intencionalmente.

Criar e configurar novo projeto
# 1. Criar projeto (sem interação)
npx hyperframes init meu-video \
--example blank \
--non-interactive

# 2. Entrar no diretório
cd meu-video

# 3. Instalar dependências
npm install

# 4. Copiar fontes (obrigatório antes de qualquer render)
node scripts/fetch-fonts.mjs

# 5. Verificar ambiente antes de renderizar
npx hyperframes doctor
Estrutura gerada pelo init blank
meu-video/
├── scenes/ # cenas HTML + GSAP
│ └── s01.html
├── assets/
│ ├── txt/ # narração por cena
│ ├── audio/ # .wav gerado pelo TTS
│ └── fonts/ # ← fetch-fonts.mjs
├── scripts/
│ ├── build-index.mjs
│ ├── fetch-fonts.mjs
│ └── narration-template.sh
├── design.md # paleta, tipografia, estilo
└── package.json
✓ Após o init, sempre faça
  • Leia o design.md para entender a paleta
  • Rode node scripts/fetch-fonts.mjs antes do render
  • Use narration-template.sh como base de roteiro
  • Rode doctor uma vez no projeto novo
✗ Erros comuns de iniciante
  • Renderizar sem rodar fetch-fonts.mjs → fonte não encontrada
  • Ignorar o design.md e inventar paleta
  • Pular o npm install após o init
  • Usar espaços no nome do projeto (ex: meu video)
💡
O design.md define a identidade visual

Cada projeto tem um design.md com a paleta principal, tipografia e estilo visual. Para vídeos INEMA.CLUB, a paleta padrão é: fundo #0D1321, acento âmbar #FACC15, textos em branco/cinza. O Claude lê este arquivo antes de escrever qualquer cena.

Conceitos-chave
📦
hyperframes init
Scaffolding
📄
design.md
Paleta + estilo
🔤
fetch-fonts
Obrigatório
📝
narration.sh
Template TTS

📋 Resumo do Módulo 2.2

O que você aprendeu neste módulo

Checklist de setup completo
  • Node.js 22+ instalado e verificado com node --version
  • FFmpeg em C:\ffmpeg\bin adicionado ao PATH do sistema
  • Chrome headless instalado via npx hyperframes browser ensure
  • TTS Kokoro instalado (pip install kokoro-onnx soundfile), sem espeak-ng
  • npx hyperframes doctor retornando "All systems go"
  • Primeiro projeto criado com npx hyperframes init <nome> --example blank --non-interactive
  • fetch-fonts.mjs executado, fontes baixadas
  • Entendido por que -nostdin é necessário no git-bash
Próximo módulo:
2.3
📝 Roteiro & narração TTS
Estruture o roteiro usando o narration-template.sh, gere os arquivos de áudio com Kokoro (pf_dora --speed 0.98) e meça as durações com ffprobe para sincronizar com as cenas.
Ir para o módulo 2.3 →