Communitygithub.com

Qsnh/video-make

Usado para criar vídeos narrados explicativos, tutoriais ou promocionais a partir de código (tutoriais horizontais para B站, vídeos curtos verticais para Douyin/Xiaohongshu/WeChat Channels) — TTS com dublagem por IA, legendas, renderização quadro a quadro de animações HTML para MP4, capas de vídeo, timestamps de capítulos e texto de publicação; também útil quando o TTS pronuncia termos incorretamente, as legendas dessincronizam com a voz, a renderização de quadros falha ou uma capa é cortada.

O que é video-make?

Este skill permite criar vídeos narrativos completos, como tutoriais, vídeos explicativos ou promocionais, inteiramente a partir de código. O fluxo de trabalho segue uma sequência rigorosa: do roteiro finalizado à dublagem TTS, validação ASR, construção da linha do tempo, animação HTML, renderização quadro a quadro e montagem final com ffmpeg. É especialmente útil para garantir que o áudio e as legendas estejam perfeitamente sincronizados, pois a linha do tempo é gerada a partir do áudio real. O skill também lida com problemas comuns, como pronúncia incorreta de termos técnicos pelo TTS, desvio de legendas, quebras na renderização de quadros e cortes inadequados em capas de vídeo para diferentes plataformas (B站, Douyin, Xiaohongshu, WeChat Channels). O agente deve garantir que cada etapa seja aprovada antes de prosseguir, evitando erros comuns como dublar sem aprovação do roteiro, misturar legendas com dublagem ou usar tempos fixos em animações. Ao final, o skill entrega o vídeo comprimido, capas otimizadas para cada plataforma e o texto de publicação, além de arquivar os arquivos fonte conforme orientação do usuário.

Funciona com~Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/Qsnh/video-make-skill/tree/HEAD/skills/video-make

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Criar vídeos dublados com código

Visão Geral

Um vídeo = roteiro finalizado → TTS frase por frase → validação ASR frase por frase → linha do tempo → animação HTML → captura de tela quadro a quadro → montagem com ffmpeg.

Princípio central: a linha do tempo vem do áudio. Primeiro, duble e valide cada frase, meça os tempos reais de início e fim de cada segmento de legenda, e então associe todas as animações visuais a esses tempos. As animações não usam segundos fixos; se a dublagem mudar, basta reexecutar a linha do tempo. A renderização captura quadros da página usando __seek(t), produzindo resultados determinísticos e reproduzíveis.

Adequado para: vídeos explicativos/tutoriais (2–5 minutos), vídeos promocionais de produtos (20–40 segundos), vídeos educacionais com legendas e marcadores de capítulo.

Não adequado para: edição com pessoas reais, vídeos que exigem filmagens reais, MV musicais puros.

Fluxo de Trabalho

Cada etapa tem um ponto de verificação; não prossiga sem que a etapa anterior seja aprovada.

#EtapaResultadoPonto de VerificaçãoReferência
0InicializaçãoDiretório de trabalhobash scripts/init.sh <dir> bem-sucedidoAbaixo
1Escolha do tópico, verificação, roteiroscript.md, audio/make_script.pyFatos verificados (experimentos primeiro); o usuário aprova o roteiro antes de começar a dublagemreferences/script.md
2Dublagemaudio/raw/NN.wav → audio/clips/NN.wav (1.3x)Cada frase passa pelo ASR; refaça as frases problemáticasreferences/voice.md
3Linha do tempobuild/narration.wav, build/timeline.jsonSegmentação das legendas coincide com a falareferences/timeline.md
4MateriaisCapturas de tela reais da interface, saída real do terminalConsistentes com a narração; use example.com para domínios de exemploreferences/capture.md
5Composiçãocomp/index.htmlVerifique cada quadro da composição de imagens lado a ladoreferences/composition.md
6Renderizaçãodist/video.mp4Duração = linha do tempo, loudness -14 LUFSreferences/render.md
7Capa, textodist/cover-bili.png, dist/cover-douyin.png, dist/copy.txtCapa dentro da área de corte segura de cada plataformareferences/publish.md
8Entrega, limpezaEnviar ao usuário; arquivar arquivos fonteO usuário confirma que salvou antes de limparAbaixo

Inicialização

bash scripts/init.sh ~/work/<projeto>/video-<episódio> copia template/ para o diretório de trabalho, copia scripts/ para tools/ e instala o playwright-core. O template é uma demonstração de 30 segundos que funciona diretamente. Antes de começar, substitua estes conteúdos de exemplo:

  • script.md, audio/make_script.py: roteiro do episódio atual; capítulos são definidos apenas uma vez em CHAPTERS no make_script.py; pausas entre capítulos, barras de capítulo e timestamps de capítulo são derivados dele.
  • audio/direction.txt: o [Cenário] da instrução do diretor de TTS.
  • asr-prompt.txt: glossário de termos do episódio atual (escrita padrão, com pronúncia se necessário).
  • comp/index.html: cenas e animações; comp/cover-*.html: conteúdo da capa.

Comandos Comuns

Execute no diretório de trabalho:

ComandoEfeito
python3 audio/make_script.pyGera audio/script.json e audio/lines.json
python3 tools/tts.py audio/lines.json audio/rawDubla cada frase; reutiliza áudio existente para textos iguais; execute novamente se o roteiro mudar
bash tools/speed.sh audio/raw audio/clips 1.3Altera velocidade sem alterar tom
python3 tools/asr.py audio/clips --enReconhece cada frase: plano / com dicas de termos / modo inglês
python3 tools/takes.py 3,7 3Grava 3 takes das frases 3 e 7 e as pontua
python3 tools/takes.py audio/var.json 2Grava 2 takes de cada variação de uma mesma frase
python3 tools/tts.py audio/lines.json audio/raw --adopt 3 audio/takes/03-0-1.raw.wavAdota um take específico
python3 tools/build_audio.py audio/clips build audio/script.jsonConcatena a dublagem e gera a linha do tempo
python3 tools/align_chunks.py audio/clips build/timeline.json audio/script.jsonAlinha os segmentos de legenda com a fala real
node tools/render.mjs --timeline=build/timeline.json --stills=2,8.5,20Captura quadros para build/stills (limpa antes)
bash tools/contact.sh build/stills build/sheetsMonta composição 2x2; use Read para visualizar
bash tools/render-par.sh build/timeline.json build/narration.wav dist/video.mp4 8Renderiza o vídeo completo com 8 processos paralelos e mixa o áudio
node tools/render.mjs --html=comp/cover-4x3.html --width=1440 --height=1080 --png=dist/cover-bili.pngGera capa
python3 tools/bili_kw.py "nginx configurar certificado ssl" "baota https"Pesquisa tópico: 6 vídeos mais vistos no B站 por palavra-chave

Dependências: ffmpeg, Node 18+, Google Chrome nativo, Python 3 + requests + openai-whisper (modelo small). TTS usa MiMo da Xiaomi; a chave é lida da variável de ambiente MIMO_API_KEY ou de um arquivo apontado por MIMO_ENV_FILE; se nenhum for encontrado, pergunte ao usuário. Para usar outro TTS, basta garantir um WAV por frase.

Pontos Mais Propensos a Erro

  • Dublar sem aprovação. Envie o roteiro ao usuário primeiro; "continuar/começar/pode" conta como aprovação. Se alterar a redação para melhorar a pronúncia, informe cada alteração ao entregar.
  • Legendas e dublagem escritas como uma coisa só. Legendas são para o público ("Nginx", "443", "1.3"), dublagem é para o TTS ler ("Engine X", "quatro quatro três", "um ponto três"). Em make_script.py, use P(legenda, pronúncia) para separar; a pronúncia concatenada de todos os segmentos deve igualar o texto completo da frase do TTS.
  • Ouvir apenas a mixagem completa. O reconhecimento da mixagem completa erra termos técnicos em inglês; é necessário reconhecer frase por frase. Para selecionar takes, use apenas a pontuação "plano" e o resultado --en; a versão "prime" com dicas de termos pode "corrigir" erros de pronúncia incorretamente. Consulte voice.md para as regras de decisão.
  • Usar segundos fixos nas animações. Após o início da primeira frase, todas as animações devem usar T(frase, segmento); a duração mudará com a alteração de velocidade ou regravação.
  • Início da página vazio. Se o conteúdo demorar 2–3 segundos para aparecer após o cartão, parece que travou; o conteúdo deve aparecer já no primeiro segmento de legenda do capítulo.
  • Múltiplas animações fill: both no mesmo elemento, IDs duplicados. A WAAPI não reporta erro; o elemento pode desaparecer ou parar no estado errado. Consulte composition.md.
  • Abrir página com file:// para renderização. CSS mask, entre outros, falhará; render.mjs já fornece um servidor HTTP local.
  • Capa cortada pela plataforma. No B站, uma imagem é cortada para 4:3 e 16:9; no Douyin, 9:16 é cortada para 3:4; coloque o conteúdo apenas na área segura.
  • Redirecionamento violando regras. Não coloque URLs de sites reais, QR codes ou informações de contato na imagem, capa ou texto; não escreva "pode dar uma olhada/pesquisar". Domínios de exemplo como example.com podem aparecer em interfaces de demonstração e terminais. Vídeos publicados em várias plataformas não devem usar uma plataforma de conteúdo como exemplo; vídeos promocionais não mencionam preços.
  • Anunciar sucesso antes de ver o resultado. Envie mensagens de progresso somente após o comando terminar e a saída ser exibida.

Entrega e Limpeza

  1. Entrega: vídeo final, capa 4:3 para B站, capa 9:16 para Douyin, dist/copy.txt (título, tags, descrição, timestamps de capítulo). O vídeo do B站 é publicado também no Douyin etc., então a capa vertical e o texto do Douyin são gerados juntos; se o usuário especificar uma única plataforma, entregue apenas esse conjunto. Liste todas as alterações de redação feitas para melhorar a pronúncia e peça ao usuário para verificar os pontos de tempo que não está seguro.
  2. Se o arquivo exceder o limite do chat (geralmente 30MB), envie uma versão de visualização com crf 22 e informe a localização da versão em alta definição. Se o envio de arquivos grandes falhar por timeout e for reenviado, lembre o usuário de que pode receber duas cópias.
  3. Após o usuário confirmar que salvou os materiais: arquive os arquivos fonte reutilizáveis (comp/ e materiais usados, audio/make_script.py, especificações de variantes, script.md, copy.txt, direction.txt, asr-prompt.txt, scripts de captura de tela, lab/) no diretório de templates do usuário (se não houver acordo, pergunte onde salvar, por exemplo, ~/work/<projeto>/video-template/<episódio>/). Use diff -r para verificar um a um, e então remova o diretório de trabalho, o perfil do navegador temporário, contêineres, servidores de desenvolvimento (mate por PID, verificando a linha de comando primeiro) e dependências de frontend instaladas apenas para capturas de tela. Mantenha o cache do modelo whisper e imagens Docker.

Habilidades Relacionadas