Vídeo Explicativo (HyperFrames)
Gera um vídeo narrado, animado e renderizado a partir de um assunto. Stack: HyperFrames (HTML→MP4, Chrome headless + FFmpeg) + TTS local Kokoro. Tudo roda na máquina do usuário, sem chave de API.
Padrão do usuário (Nei): PT-BR, dark premium (accent âmbar), gerar 16:9 E 9:16, e sempre terminar com a cena de CTA do INEMA.CLUB.
Pré-requisitos (já instalados nesta máquina)
- Node 22+ e FFmpeg em
C:\ffmpeg\bin (no git-bash use ffmpeg -nostdin, senão sai exit 0 sem gerar arquivo).
- Chrome headless do HyperFrames:
npx hyperframes browser ensure.
- TTS local:
pip install kokoro-onnx soundfile (sem espeak-ng — o Kokoro já fonemiza PT-BR).
- Verifique com
npx hyperframes doctor se algo falhar.
Fluxo (sempre nesta ordem)
- Roteiro — escreva
SCRIPT.md: 6–9 cenas, do primeiro princípio ao avançado, com exemplo real. Narração curta por cena (≈100s de voz ≈ 1:50 de vídeo). Expanda siglas para a fala (ex.: "SKILL.md" → "SKILL ponto M D"). Veja references/pipeline.md.
- Projeto —
npx hyperframes init <nome> --example blank --non-interactive. Copie design.md (house style) para a raiz.
- Fontes —
node fetch-fonts.mjs (baixa .woff2 subset latin → assets/fonts/fonts.css). Script em scripts/fetch-fonts.mjs.
- Narração — escreva
assets/txt/sN.txt e gere os WAVs com Kokoro voz pf_dora, --speed 0.98. Template em scripts/narration-template.sh. Meça as durações com ffprobe.
- Composição — adapte scripts/composition-template.mjs (copie como
build-index.mjs): preencha AUDIO[] com as durações reais, escreva sceneN() (HTML) e anim() (GSAP) por cena, ajuste CAPTIONS[]. A cena de CTA do INEMA.CLUB já está incluída como última cena. Rode node build-index.mjs (16:9) e node build-index.mjs --vertical (9:16) — ambos escrevem index.html (renderize logo após cada geração).
- Validar —
npx hyperframes lint (0 erros) e npx hyperframes inspect --samples 16 (0 problemas de layout). Corrija seguindo references/gotchas.md.
- Render —
--quality draft para conferir (extraia frames e mostre ao usuário), depois --quality high. Gere as duas versões:node build-index.mjs && npx hyperframes render --quality high --output renders/<nome>-16x9.mp4
node build-index.mjs --vertical && npx hyperframes render --quality high --output renders/<nome>-9x16.mp4
Regras de ouro (não-negociáveis)
- Animar o
.scene-inner, nunca o wrapper .clip (o framework força opacity:1 no clip ativo).
- Cenas e captions em tracks alternados (1/3 e 2/4) para não dar overlap nas bordas (erro de float).
- Decorativos off-canvas (ghost/bg-layer):
data-layout-ignore.
- Fontes locais via
@font-face (NÃO usar Google Fonts CDN — some no render).
- Timing é fonte única: o gerador tira
data-start/duration E os tempos dos tweens do MESMO array AUDIO[] → áudio e animação sempre batidos.
- Sempre conferir frames com o usuário antes do render final (não consigo ouvir o áudio — pedir pra ele validar a locução).
Identidade visual (house style)
Paleta dark premium: bg #0D1321, painel #1D2D44, borda #3E5C76, texto #F0EBD8, secundário #748CAB, accent âmbar #FFC300, código #2EC4B6. Fontes: Sora (títulos 700/800), Inter (corpo), JetBrains Mono (código/URLs). Detalhes em references/house-style.md.
CTA INEMA.CLUB (cena final padrão)
A última cena mostra "CONTINUA EM" + INEMA.CLUB (INEMA creme, .CLUB âmbar, com glow) + URL 🌐 inema.club, narração curta ("Isso é conteúdo do INEMA ponto CLUB. Acesse: inema ponto club."). Já vem pronta no template (scene9() / case 9).
1---2name: video-explicativo3description: Cria vídeos explicativos completos em PT-BR (HTML→MP4 via HyperFrames) a partir de um assunto — roteiro, narração TTS local, cenas animadas dark premium, captions e CTA do INEMA.CLUB, nos formatos 16:9 (YouTube) e 9:16 (Shorts/Reels). Use quando o usuário pedir para "fazer um vídeo", "vídeo explicativo", "vídeo sobre X", "vídeo pra Shorts/Reels", "mini tutorial em vídeo", "vídeo do INEMA", ou quando der um assunto e quiser um vídeo narrado pronto. Cobre roteiro, locução, animação, render e a CTA final.4---56# Vídeo Explicativo (HyperFrames)78Gera um vídeo narrado, animado e renderizado a partir de um **assunto**. Stack: [HyperFrames](https://github.com/heygen-com/hyperframes) (HTML→MP4, Chrome headless + FFmpeg) + TTS local Kokoro. Tudo roda na máquina do usuário, **sem chave de API**.910Padrão do usuário (Nei): **PT-BR**, **dark premium** (accent âmbar), gerar **16:9 E 9:16**, e sempre terminar com a **cena de CTA do INEMA.CLUB**.1112## Pré-requisitos (já instalados nesta máquina)13- Node 22+ e FFmpeg em `C:\ffmpeg\bin` (no git-bash use `ffmpeg -nostdin`, senão sai exit 0 sem gerar arquivo).14- Chrome headless do HyperFrames: `npx hyperframes browser ensure`.15- TTS local: `pip install kokoro-onnx soundfile` (sem espeak-ng — o Kokoro já fonemiza PT-BR).16- Verifique com `npx hyperframes doctor` se algo falhar.1718## Fluxo (sempre nesta ordem)19201. **Roteiro** — escreva `SCRIPT.md`: 6–9 cenas, do primeiro princípio ao avançado, com exemplo real. Narração curta por cena (≈100s de voz ≈ 1:50 de vídeo). Expanda siglas para a fala (ex.: "SKILL.md" → "SKILL ponto M D"). Veja [references/pipeline.md](references/pipeline.md).212. **Projeto** — `npx hyperframes init <nome> --example blank --non-interactive`. Copie `design.md` (house style) para a raiz.223. **Fontes** — `node fetch-fonts.mjs` (baixa .woff2 subset latin → `assets/fonts/fonts.css`). Script em [scripts/fetch-fonts.mjs](scripts/fetch-fonts.mjs).234. **Narração** — escreva `assets/txt/sN.txt` e gere os WAVs com Kokoro voz `pf_dora`, `--speed 0.98`. Template em [scripts/narration-template.sh](scripts/narration-template.sh). Meça as durações com `ffprobe`.245. **Composição** — adapte [scripts/composition-template.mjs](scripts/composition-template.mjs) (copie como `build-index.mjs`): preencha `AUDIO[]` com as durações reais, escreva `sceneN()` (HTML) e `anim()` (GSAP) por cena, ajuste `CAPTIONS[]`. A **cena de CTA do INEMA.CLUB já está incluída** como última cena. Rode `node build-index.mjs` (16:9) e `node build-index.mjs --vertical` (9:16) — ambos escrevem `index.html` (renderize logo após cada geração).256. **Validar** — `npx hyperframes lint` (0 erros) e `npx hyperframes inspect --samples 16` (0 problemas de layout). Corrija seguindo [references/gotchas.md](references/gotchas.md).267. **Render** — `--quality draft` para conferir (extraia frames e mostre ao usuário), depois `--quality high`. Gere as duas versões:27 ```bash28 node build-index.mjs && npx hyperframes render --quality high --output renders/<nome>-16x9.mp429 node build-index.mjs --vertical && npx hyperframes render --quality high --output renders/<nome>-9x16.mp430 ```3132## Regras de ouro (não-negociáveis)33- **Animar o `.scene-inner`**, nunca o wrapper `.clip` (o framework força `opacity:1` no clip ativo).34- **Cenas e captions em tracks alternados** (1/3 e 2/4) para não dar overlap nas bordas (erro de float).35- **Decorativos off-canvas** (ghost/bg-layer): `data-layout-ignore`.36- **Fontes locais** via `@font-face` (NÃO usar Google Fonts CDN — some no render).37- **Timing é fonte única**: o gerador tira `data-start/duration` E os tempos dos tweens do MESMO array `AUDIO[]` → áudio e animação sempre batidos.38- Sempre **conferir frames** com o usuário antes do render final (não consigo ouvir o áudio — pedir pra ele validar a locução).3940## Identidade visual (house style)41Paleta dark premium: bg `#0D1321`, painel `#1D2D44`, borda `#3E5C76`, texto `#F0EBD8`, secundário `#748CAB`, **accent âmbar `#FFC300`**, código `#2EC4B6`. Fontes: **Sora** (títulos 700/800), **Inter** (corpo), **JetBrains Mono** (código/URLs). Detalhes em [references/house-style.md](references/house-style.md).4243## CTA INEMA.CLUB (cena final padrão)44A última cena mostra "CONTINUA EM" + **INEMA.CLUB** (INEMA creme, .CLUB âmbar, com glow) + URL `🌐 inema.club`, narração curta ("Isso é conteúdo do INEMA ponto CLUB. Acesse: inema ponto club."). Já vem pronta no template (`scene9()` / `case 9`).