make-2d-video studio: pipeline completo de vídeo
Transforme uma narração (e opcionalmente um roteiro) em um MP4 finalizado onde cada quadro é desenhado por código (HTML canvas + Three.js), capturado quadro a quadro em Chromium headless e codificado com ffmpeg. Nenhum modelo de geração de imagem ou vídeo é usado, então os personagens permanecem consistentes e o texto permanece nítido. Invente os visuais do zero para cada roteiro; apenas o estilo é fixo.
Recursos agrupados (diretório base desta skill):
kit/: o studio testado (renderizador, motor, ferramentas, áudio, o projeto de referênciaexamples/reaction-time). Instale-o no workspace comomake-2d-video-studio/(vejareferences/install.md).references/install.md: instalação, tabela de dependências, doctor, auto-teste.references/style-bible.md: o visual (personagens, cenários, luz, câmera, edição, gráficos, regras 9:16, o que não fazer). Leia-o completamente antes de projetar qualquer cena.references/style-bible-toon.md: o visual para o elenco toon (cast: "toon"). Quando o elenco é toon, siga-o em vez das partes do style-bible.md que entram em conflito (luz de contorno, sem contornos, silhuetas pretas).references/story-breakdown.md: escrevendostory/bible.mdestory/shots.json, além de regras de ritmo.references/engine-api.md: a API de cena, configuração e esquemas de shots.json, e a referência do three-kit.references/sound-design.md: o plano de música, biblioteca de SFX, ambiência e níveis.references/render-qc.md: pré-visualização e render final, guia de velocidade, checklist de QC, solução de problemas.
Comandos de estágio deste plugin re-executam um estágio: /new-video (estágios 1–4), /video-styles (5), /render-video (6 e 8), /video-sound (7). Ao executar de ponta a ponta, siga este arquivo e carregue as referências conforme cada estágio precisar.
Regras de ouro
- Pergunte o idioma do vídeo primeiro. Antes de qualquer outra pergunta, instalação, arquivo ou edição, pergunte ao usuário qual é o idioma do vídeo (Estágio 0). Cada etapa posterior usa esse idioma. Fale com o usuário no idioma em que ele escreve.
- Mantenha a narração intacta. Nunca reescreva, adicione, remova ou reordene palavras faladas. Cada cena ilustra as palavras faladas enquanto está na tela.
- Mesmo estilo, novas imagens. Invente cenários, adereços, personagens e ações a partir deste roteiro. Use
examples/reaction-timeapenas para aprender a API. - Mostre o que é dito, literal e especificamente. Linhas abstratas tornam-se metáforas visuais, diagramas ou closes de reação.
- Rascunhe, veja, corrija, depois renderize. Abra as folhas de contato e os stills você mesmo (leia os PNGs) antes de qualquer renderização completa. Renderizar é lento; olhar é rápido.
- Três pontos de verificação do usuário: escolhas de configuração, escolha de estilo a partir de amostras renderizadas, e a pré-visualização antes da renderização final. Se o usuário estiver ausente, assuma os padrões, declare o que foi assumido e continue.
- Arquivos são a verdade. Cada vídeo vive em
make-2d-video-studio/projects/<slug>/, estory/shots.jsonpossui todo o timing. Um vídeo = uma pasta autocontida:config.json,input/,assets/(+assets/_raw/para imagens de IA não selecionadas),scenes/,story/(incl.plan.mdnotas de handoff),timeline/,jobs/(+jobs/logs/),build/(temporário, seguro deletar),out/(apenas entregas). Nunca coloque arquivos específicos de vídeo na raiz do studio ou em uma pasta_jobs/separada. - Apenas pessoas na história aparecem na tela (vídeos de notícias/explicativos). Sem mascotes de canal ou personagens de narrador/apresentador
(ex.:
nhoc,ongdo) a menos que o usuário os solicite. Cada pessoa nomeada na notícia recebe seu próprio toon (cabelo, óculos, roupa característicos, de acordo com as regras de caricatura em style-bible-toon.md) além de uma etiqueta de nome, não uma figura genérica ou uma silhueta. Pessoas privadas ou não nomeadas (suspeitos não confirmados, familiares) permanecem anônimas: um toon genérico não nomeado ou uma silhueta com uma etiqueta de função.
Padrões do canal (channel.json)
Antes do Estágio 0, procure por channel.json ao lado de make-2d-video-studio/ (a pasta do workspace que contém o studio), depois na
pasta atual, depois no diretório base desta skill (a cópia que viaja com a skill; em uma máquina nova, copie-o para o lado
do studio assim que instalado). Ele pode conter name, lang, aspect, resolution, fps, style, cast (stick | 3d | toon), captions, shotsPerMin e music.
Cada chave presente é o padrão para este vídeo: pule as perguntas que ela responde (idioma, proporção, resolução, fps, legendas,
escolha de estilo no Estágio 5) e confirme-as em UMA linha, ex.: "Kênh Tí Tò Mò: tiếng Việt, 9:16, 1080p, 30 fps, dusk, có phụ đề."
Pergunte apenas o que ainda é desconhecido (narração, roteiro, título). name é o nome do canal para os cards finais.
Os três estilos de desenho (escolha UM elenco por vídeo)
cast | Visual | Motor | Bíblia de estilo |
|---|---|---|---|
stick (padrão) | Bonecos palito pretos com luz de contorno, cenários 2.5D cinematográficos e atmosféricos | rig2d.js (+ three-kit.js para cenas 3D de estabelecimento) | style-bible.md |
3d | Elenco 3D cartoon: cabeças chatas brancas, corpos em forma de pera, membros de macarrão | rig3d.js, rig3d-cast.js (kind: '3d', rig3d: true) | style-bible.md → "Elenco 2D ou elenco 3D" |
toon | Cartoon 2D com contorno: cabeças redondas de tom de pele, corpos em forma de feijão, membros de palito, contornos grossos, line boil, texto cômico, gags visuais, caricaturas de figuras públicas; adereços heróis 3D opcionais com toon shading e glow | toon.js, toon3d.js | style-bible-toon.md |
channel.json → cast decide; caso contrário, pergunte uma vez no Estágio 1 (uma linha por estilo). Para toon o estilo de cor padrão é paper
(os grades cinematográficos também funcionam, mas escurecem as cores planas). Estude examples/toon-demo/ antes de escrever cenas toon.
Modo explicador de notícias (elenco toon, formato principal do canal)
Quando o usuário pedir um explicador de notícias / finanças / tecnologia / bilionários / ativos de investimento, siga kit/CLAUDE.md
(instalado como make-2d-video-studio/CLAUDE.md). Ele substitui os estágios 1–8 abaixo por um fluxo de trabalho com portões:
0 escolha de tópico (3–5 candidatos com força da fonte, risco e vida útil) ✋ → 1 roteiro com fontes + 3 títulos + conceito de thumbnail ✋ →
2a voz e 2b manifesto de ativos (story/assets.md: o que desenhar, contagem, feito com Flow / IA de imagem do usuário / toon de código /
three.js + bloom) ✋ → 3 imagens + folhas de personagens ✋ → 4 timing + cenas → 5 folha de contato de todas as cenas + demonstração de 30 s ✋ →
6 renderização completa → 7 pacote (thumbnail, descrição com fontes, capítulos, lista de links obsoletos) ✋ → 8 upload ✋ → 9 revisar estatísticas.
Imagens de cena: sem pessoas, sem texto, sem logotipos. Thumbnails: podem conter pessoas (estilizadas, nunca fotorrealistas falsas de pessoas reais)
e ≤ 4 palavras de texto. Nunca faça upload pela API de Dados do YouTube de um projeto não auditado (uploads ficam bloqueados como privados);
faça upload pelo site do YouTube Studio, salve como Privado/Agendado e publique apenas com o comando explícito do usuário.
Em uma sessão local do Claude Code, execute cada comando você mesmo; escreva jobs .bat apenas quando não tiver shell do Windows.
Estágio 0: Idioma do vídeo (sempre primeiro)
Se channel.json fornecer lang, confirme-o no resumo de uma linha acima em vez de perguntar. Caso contrário, antes de perguntar qualquer outra coisa, criar arquivos, instalar ou editar, faça exatamente uma pergunta no idioma do usuário, por exemplo: "Video này dùng ngôn ngữ nào? (ex.: Tiếng Việt, English, 日本語…)". Use AskUserQuestion quando disponível. Aguarde a resposta, depois mapeie para um código ISO 639-1 (vi, en, ja, ko, es, pt, de, fr, hi, …). Se o usuário já nomeou o idioma do vídeo anteriormente nesta conversa, confirme-o em uma linha em vez de perguntar novamente.
O código de idioma dirige todo o pipeline:
--lang <code>emtools/new_project.py(armazenado emconfig.json→lang).tools/transcribe.pylê a partir da configuração.- Todo texto na tela (cards de título, etiquetas, unidades, placas, legendas de gráficos, legendas fixas) é escrito neste idioma, curto e com ortografia correta com diacríticos completos. Nunca traduza ou altere a narração falada.
- Fontes: o renderizador carrega glifos latinos, latim-extendido e vietnamitas; para
via fonte de título muda automaticamente para Nunito para que os acentos sejam renderizados em uma fonte consistente. Para scripts que as fontes agrupadas não cobrem (japonês, coreano, chinês, árabe, hindi, tailandês…), informe o usuário e verifique stills de texto cuidadosamente durante o QC.
Estágio 1: Captação
Depois que o idioma é conhecido, pergunte uma vez (AskUserQuestion quando disponível) por:
-
Arquivo de narração (obrigatório). Ainda não tem gravação? Faça uma com VieNeu (se suas ferramentas MCP estiverem conectadas): sintetize UM clipe por frase (
01.wav,02.wav, … em uma pasta), escreva as frases uma por linha emsentences.txt(opcional|0.8pausa ou marcadores de desaceleração|cham, tags de emoção como [cười] permanecem na linha), depoispython -I tools/join_segments.py <clip_dir> sentences.txt voiceover.wav. Ele une os clipes com pausas fixas (VieNeu mescla frases curtas e remove pausas quando recebe um roteiro completo) e escrevevoiceover.wav.script.txt, o texto limpo a ser passado como--script. -
Roteiro: com timestamps (SRT/VTT/JSON/TXT com
[mm:ss]), texto simples (melhor: alinhado ao áudio, mantendo a redação exata), ou nenhum (transcrito). -
Proporção: 16:9 ou 9:16.
-
Resolução: 720p / 1080p (recomendado) / 1440p / 2160p (4K). Mencione que resoluções mais altas demoram muito mais para renderizar.
-
Legendas: ativadas por padrão para 9:16, desativadas para 16:9.
-
Música: gerada, arquivo próprio do usuário ou nenhuma. SFX: ligado ou desligado.
-
Título.
-
Elenco (estilo de desenho): stick / 3d / toon, a menos que
channel.jsonforneçacast.
Não pergunte sobre o estilo de cor ainda. Padrões (quando channel.json não diz): 16:9, 1080p, 24 fps, música gerada + SFX, elenco stick, estilo dusk (paper para toon).
Estágio 2: Instalar ou verificar o studio
Siga references/install.md: copie kit/ para make-2d-video-studio/ no workspace (pule se já estiver presente), instale dependências, execute python tools/verify_kit.py e python tools/doctor.py, depois execute o auto-teste de exemplo. Relate o que foi instalado em uma lista curta. No Windows, se o doctor encontrar ffmpeg apenas na pasta winget, ele escreve make-2d-video-studio/env.sh e env.ps1; prefixe comandos de render e mix com source env.sh && (um shell iniciado antes da instalação não vê o novo PATH).
Estágio 3: Projeto + timeline
Execute dentro de make-2d-video-studio/. Use python3 onde python não for Python 3.
Windows sem terminal utilizável (computer use só pode clicar no File Explorer): coloque cada etapa longa em um job que o usuário
dá duplo clique. Copie tools/jobs/templates/full.ps1 + 2-full.bat para projects/<slug>/jobs/; todo job .ps1 começa com
$JobDir = $PSScriptRoot e inclui ..\..\..\tools\jobs\common.ps1 (fornece $P, Run, Py, Say, Fail, Done, e escreve
jobs/logs/<name>.log + <name>.status = RUNNING / OK / FAILED para Claude ler). Helpers compartilhados: tools/jobs/set_duration.py
(duração em config.json a partir da narração), tools/jobs/make_srt.py (out/<title>.en.srt a partir de timeline/sentences.json).
Instalação/reparo do studio no Windows: tools/jobs/setup-studio.bat.
python tools/new_project.py --name <slug> --voice "<caminho da narração>" [--script "<caminho do roteiro>"] --aspect 16:9 --resolution 1080p --fps 24 --style dusk --title "<título>" --lang <código> [--captions]
- Roteiro com timestamps:
python tools/parse_script.py --project projects/<slug> --script projects/<slug>/input/script.<ext> - Roteiro simples:
python tools/transcribe.py --project projects/<slug> --script projects/<slug>/input/script.txt --lang <código> --model small. A correspondência deve ser ≥ 90%; se for menor, informe ao usuário que o roteiro e o áudio diferem. - Sem roteiro:
python tools/transcribe.py --project projects/<slug> --lang <código> --model small(baseem máquinas lentas,large-v3para áudio difícil).
Verifique timeline/transcript.txt (seu final deve estar próximo da duração da narração), depois execute python tools/beats.py --project projects/<slug> para obter a folha de batidas e um rascunho de story/shots.json.
Estágio 4: Breakdown da história
Leia references/style-bible.md (ou references/style-bible-toon.md para o elenco toon) e references/story-breakdown.md. Escreva story/bible.md (logline, elenco com uma cor característica cada, locações com humores e luzes-chave, motivos, plano de música, e se o elenco é bonecos palito 2D ou personagens 3D). Escreva scenes/cast.js. Reescreva story/shots.json: cenas contíguas, corte em fronteiras de frase 0,1–0,2 s antes, uma cena de estabelecimento por nova locação, e uma descrição concreta de scene para cada uma. Ritmo: vídeos curtos 9:16 rodam 30–40 cenas por minuto (mediana 1,5–2 s); explicadores longos 16:9 rodam 15–25 (mediana 2–3,5 s). channel.json → shotsPerMin substitui ambos. Envie ao usuário um resumo do plano de 5–10 linhas e continue a menos que ele objete.
Estágio 5: Escolha de estilo
Se channel.json fixar style, use-o e pule a grade de comparação a menos que o usuário a solicite.
Construa os 1–2 cenários mais usados mais 3 cenas representativas (uma cena ampla com ≥ 2 personagens, um close-up bigFace, uma cena de dados/blueprint ou 3D). Depois renderize:
node render.mjs --project projects/<slug> --styles dusk,midnight,golden,neon,storybook --at <t1>,<t2>,<t3> --scale 0.5
Abra build/styles/style_grid.png, depois mostre-o com uma linha por estilo: dusk (sombras malva, chave âmbar, contorno creme), midnight (azul marinho frio, contornos azul-branco, práticas sódio), golden (laranja quente e teal), neon (pretos profundos, magenta e teal), storybook (pastel suave, baixo contraste). Salve a escolha em config.json → style. Para ajustes, adicione uma entrada personalizada a STYLES em engine/styles.js (substituições de moods mais o grade lift/gamma/gain, sat, contraste, vinheta, grão, bloom) e re-renderize aquela linha.
Estágio 6: Construir cada cena
Leia references/engine-api.md e as cenas de exemplo em examples/reaction-time/scenes/ uma vez. Trabalhe em lotes de 8–12 cenas:
- Escreva
scenes/sets/<location>.js(reutilizável, ancorado aGY = E.H * V(0.8, 0.68)eCX = E.W/2, com paredes, chão e céu estendidos além do quadro) escenes/shots/NN_<name>.jscomregisterShot('<id>', {...})para os ids de shots.json. - Execute
node render.mjs --project projects/<slug> --sheet --scale 0.5para gerar a folha de contato do lote. Abra e inspecione cada cena. Corrija problemas e re-renderize apenas as cenas afetadas. - Depois que todo o lote estiver bom, execute
node render.mjs --project projects/<slug> --demo --scale 1.0para uma demonstração de 10 s. - Convide o usuário para revisar a demonstração. Faça ajustes conforme solicitado.
- Repita para o próximo lote.
Após todos os lotes: execute node render.mjs --project projects/<slug> --preview --scale 1.0 para um preview completo SD. Abra e revise cada cena. Corrija problemas, re-renderize as cenas afetadas e repita o preview. Uma vez aprovado: execute node render.mjs --project projects/<slug> --final --scale 1.0 e depois --final --scale 2.0 (1080p) ou a resolução alvo.
Estágio 7: Áudio e música
Leia references/sound-design.md. Execute:
python tools/sound.py --project projects/<slug> --sfx --music ambient --level -18
--sfx: sincroniza efeitos sonoros com ações na cena--music:ambient(gerado),none, ou um caminho de arquivo--level: nível alvo de pico em dB (padrão -18)- Opcional:
--voice-gain 2.0para aumentar o volume da narração
Verifique o mix: python tools/check_mix.py --project projects/<slug>. Corrija problemas.
Estágio 8: Renderização final
Execute:
node render.mjs --project projects/<slug> --final --scale 2.0 # 1080p
O renderizador gera quadros como PNGs em build/frames/ e os codifica com ffmpeg em out/<title>.mp4.
- Opções de escala:
1.0(720p),2.0(1080p),3.0(1440p),4.0(2160p/4K) - Adicione
--with-uploadpara gerar também um arquivo MP4 otimizado para upload no YouTube.
Após a renderização, execute python tools/qc.py --project projects/<slug> para verificar a qualidade (quadros pretos, áudio faltando, etc.).
Estágio 9: Entrega
O arquivo final está em out/<title>.mp4 (e out/<title>_youtube.mp4 para upload). Copie-o para onde o usuário precisar.
Se o usuário solicitou upload para o YouTube: siga references/upload-youtube.md para preparar metadados, thumbnail e fazer upload através do YouTube Studio (nunca pela API).
Comandos do plugin
/new-videoExecuta estágios 1–4 (captação, instalação, projeto, breakdown)/video-stylesExecuta estágio 5 (escolha de estilo)/render-videoExecuta estágios 6 e 8 (construção e renderização)/video-soundExecuta estágio 7 (áudio e música)