Communitygithub.com

EMzhe/série-de-vídeos-explicativos

Produção completa de uma série de vídeos explicativos (do planejamento à página HTML animada/roteiro → locução → legendas → vídeo final 1080p → capas para Douyin nos formatos horizontal e vertical), com 4 pontos de confirmação do usuário (5 perguntas iniciais, revisão do roteiro, audição de timbre e confirmação da montagem) e capacidade de correção de pronúncia (ex: "老子" lido como lǎo zǐ).

O que é série-de-vídeos-explicativos?

Esta skill automatiza o fluxo completo de produção de vídeos explicativos em série, transformando um tema em um vídeo finalizado com legendas e animações. Ela suporta a criação de páginas HTML animadas como rota padrão para garantir animações previsíveis e sincronizadas, com suporte a cenários SVG estilo aquarela chinesa (como ondas, montanhas, bambus e luas) para uma estética visual consistente. A skill é particularmente útil para criadores de conteúdo que desejam produzir vídeos educacionais, interpretações de clássicos chineses ou apresentações narradas, integrando geração de locução via TTS, legendas com estilo personalizado e capas otimizadas para o Douyin (16:9 e 9:16). Todo o processo é dividido em etapas com quatro "portões de confirmação" (5 perguntas iniciais, revisão do roteiro, audição do timbre de voz e confirmação da montagem), garantindo que o usuário aprove cada fase antes de prosseguir. A skill é compatível com ambientes de desenvolvimento que possuam Python, Node.js e as bibliotecas necessárias (especificadas nos scripts), e o workflow é orquestrado por scripts modulares que podem ser executados individualmente ou em sequência.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/EMzhe/explainer-video-series/tree/HEAD

Perguntar na sua IA favorita

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

Documentação

Produção Completa de Série de Vídeos Explicativos

Transforme "um tema" em "um vídeo finalizado": Planejamento → Edição de Páginas (HTML animado) → Roteiro → Locução → Legendas → MP4 1080p → Capas para Douyin (horizontal 16:9 + vertical 9:16). O arquivo de estilo padrão é derivado da série prática de vídeos explicativos do Dao De Jing (estilo nova China aquarela / voz masculina Yunjian / legendas brancas com brilho preto), todo o conjunto é reutilizável e cada item pode ser sobrescrito.

Rota Visual (a partir da v2.0, o padrão é HTML animado; v2.1 com cooperação texto-imagem):

  • Padrão: Página HTML Animada — Gera uma página HTML de apresentação com animações de entrada e transição cross-fade entre páginas com base no roteiro, renderizando quadros deterministicamente para criar o vídeo, com animação 100% sincronizada no produto final (detalhes sobre o esquema e regras de layout em references/html-animation.md).
  • v2.1 Cooperação Texto-Imagem: biblioteca de cenas SVG em aquarela integrada (ondas/barco solitário/ondulações/montanhas/bambu/lua cheia/carpa koi) + ícones de itens + suporte a imagens externas, combinando automaticamente ou explicitamente com base no roteiro, com componentes gráficos entrando em momentos escalonados e animações de texto unificadas.
  • Fallback: Quadros PPT estáticos + xfade (usado quando tabelas/formatos complexos de PPT são necessários ou quando o usuário solicita explicitamente arquivos .pptx).

A partir da v2.3, cada episódio inclui capas para Douyin como padrão: Horizontal 16:9 + Vertical 9:16, geradas por IA em conjunto com base no tema (âncora horizontal → confirmação do usuário → derivação vertical), sem usar quadros do vídeo; processo na Etapa ⑥ e em references/douyin-covers.md.

5 Perguntas Iniciais (Perguntadas no início de cada episódio; se o usuário disser "igual ao anterior" ou "como de costume", todas são assumidas como padrão e o trabalho começa)

  1. Sobre o que é este episódio? (Tema / Capítulo da obra)
  2. Profundidade do conteúdo: Explicação detalhada / Explicação dos pontos principais? (Padrão: Explicação detalhada)
  3. Duração alvo do vídeo finalizado? (Padrão: 6-7 minutos)
  4. O estilo do PPT continua sendo o nova China aquarela? (Padrão: Sim)
  5. O timbre de voz continua Yunjian e as legendas brancas com brilho preto? (Padrão: Sim)

Arquivo de Estilo (Adotado diretamente quando o usuário não especifica)

ItemValor Padrão
Estilo PPTNova China Aquarela: papel de arroz branco + preto tinta + azul-ardósia + vermelhão
FonteTítulo SimSun (Song Ti), Corpo Microsoft YaHei (SlideDSL sempre usa font-family em inglês)
Elementos VisuaisIlustrações SVG em aquarela (sem usar imagens geradas por IA, fidelidade 100%, modificável repetidamente)
AnimaçãoPágina HTML animada: Título blur-in / Itens fade-up escalonados / Transição cross-fade entre páginas / Ênfase de pontos-chave com cue
Timbrezh-CN-YunjianNeural (Yunjian · Masculino · Grave)
Velocidade de Fala+0% (uniforme em todo o episódio; só alterar se o usuário solicitar explicitamente, não ajustar por densidade de conteúdo)
LegendaTexto branco + brilho externo preto (blur 0.8), fundo transparente, centralizado na parte inferior
Resolução1920×1080 (16:9)
Correção de Pronúncia"老子" → TTS lê "老紫" (lǎo zǐ, terceiro tom literário), legenda ainda exibe "老子"
Capa DouyinHorizontal 16:9 + Vertical 9:16; título do episódio em quatro caracteres grandes; gerado por IA em conjunto (cadeia âncora), sem usar quadros do vídeo

Convenção do Diretório de Trabalho

Crie um diretório 视频工作目录/ (diretório de trabalho de vídeo) no espaço de trabalho, com um subdiretório para cada episódio (nomeado com o tema):

视频工作目录/{nome do episódio}/
├── {BASE} 讲解稿.json          # Fonte única de dados: título/timbre/correção de pronúncia/roteiro de cada página (+ texto da página)
├── {BASE} 讲解稿_可编辑.txt    # Exportado por export_txt.py, para o usuário revisar no bloco de notas
├── 01_deck/                    # deck.html (página de demonstração animada, visualizável) + deck.json (lista de timeline)
├── 01_html_frames/             # f_XXXXX.png quadros + frames_manifest.json (rota HTML)
├── 01_frames/                  # frame_01.png ... (rota fallback PPT estático)
├── 02_audio/                   # slide_01.mp3 ... slide_NN.mp3 (áudio por página)
├── 配音试听/                   # Amostras de áudio de múltiplos timbres + 配音试听.html
└── 03_output/                  # Produto final {BASE}(带字幕).mp4

BASE = nome do episódio (se contiver "讲解稿", remove automaticamente). O JSON do roteiro é gerado programaticamente com Python json.dump. É proibido escrever JSON manualmente com aspas chinesas (causará erros de escape). A tela da capa {nome do episódio}-抖音封面.miora deve ser colocada na raiz do espaço de trabalho, seguindo as especificações de entrega de mídia gerada, com os PNGs de tamanho duplo em seu diretório _assets/.

Fluxo por Etapas (incluindo 4 portões de confirmação, aguardando a resposta do usuário antes de prosseguir)

Antes de começar (primeira vez ou quando o ambiente estiver anormal), execute o check-up do ambiente: python scripts/doctor.py. Só comece após corrigir os itens MISSING. Limites de ritmo, lista de portões, BGM e tabela de escopo de revisão estão em references/pacing-and-gates.md (Metodologia integrada de liyupi/ai-promo-video-maker: padrões rígidos de ritmo / validação de dados / portão duplo / disciplina de revisão).

Etapa ① Planejamento de Conteúdo (Portão 1: 5 Perguntas Iniciais)

Após determinar o plano com base nas 5 perguntas, produza um pacote de planejamento conciso (estrutura do roteiro / plano visual / plano de áudio). Após a aprovação do usuário, vá para a Etapa ②.

Etapa ② Edição de Páginas (Rota Padrão = HTML Animado)

  • Não faça mais PPT: gere diretamente o {BASE} 讲解稿.json programaticamente, escrevendo o roteiro text para cada página; Cada página pode opcionalmente ter title (título da página), points (array de itens da tela), layout (title/bullets/quote/end), cues (ênfase de ponto-chave, veja abaixo) — quando omitido, é derivado automaticamente do roteiro (regras em references/html-animation.md), mas para produção formal, é recomendado fornecê-los explicitamente para maior qualidade.
  • O número de páginas depende da profundidade do conteúdo (explicação detalhada: cerca de 8 páginas); tabelas/dados ainda devem usar a rota fallback de PPT estático.

Etapa ②′ Criação de PPT (Rota Fallback Estática)

  • Use workbuddy-pptx (SlideDSL) para criar slides. Número de páginas depende da profundidade do conteúdo (explicação detalhada: cerca de 8 páginas).
  • Notas do apresentador (notes) = Roteiro de cada página: escrito uma vez, reutilizado em vários lugares (áudio do vídeo / timeline DOCX / importação para CapCut).
  • Use nomes de fonte em inglês (SimSun / Microsoft YaHei); nomes chineses não são renderizados.
  • Esquema de cores e elementos seguem o arquivo de estilo; páginas com tabelas/dados priorizam elementos nativos do PPT.

Etapa ③ Finalização do Roteiro (Portão 2: Revisão do Roteiro)

  1. Extraia o roteiro das notas do PPT, gere programaticamente o {BASE} 讲解稿.json (estrutura abaixo).

  2. Exporte texto editável para revisão:

    python scripts/export_txt.py "{BASE} 讲解稿.json"
    
  3. Instrua claramente o usuário a abrir o arquivo txt no bloco de notas e revisar página por página; após o usuário modificar e retornar, sincronize de volta ao JSON:

    python scripts/import_txt.py "{BASE} 讲解稿.json" "{BASE} 讲解稿_可编辑.txt"
    

    Se o usuário apenas responder "roteiro ok" sem modificações, pule a sincronização.

Etapa ④ Locução (Portão 3: Audição de Timbre, Portão Duro voice_confirmed)

  1. Gere uma página de audição para o usuário escolher o timbre:

    python scripts/preview_voices.py 配音试听
    
  2. Após a escolha do usuário, escreva no JSON e defina voice_confirmed=true (sem isso, TTS e montagem recusam-se a executar):

    python -c "import json;p='{BASE} 讲解稿.json';d=json.load(open(p,encoding='utf-8'));d['voice']='zh-CN-YunjianNeural';d['rate']='+0%';d['voice_confirmed']=True;json.dump(d,open(p,'w',encoding='utf-8'),ensure_ascii=False,indent=2)"
    

    A velocidade padrão +0% não é alterada; só mude se o usuário solicitar explicitamente, e uniformemente em todo o episódio.

Etapa ⑤ Montagem do Vídeo Final (Portão 4: Confirmar o Início da Montagem com o Usuário)

Ordem: Sintetizar áudio → Gerar página animada → Renderizar quadros → Montar vídeo (rota HTML); ou Renderizar quadros → Áudio → Vídeo (rota estática).

Rota HTML Animada (Padrão):

  1. Sintetizar áudio de cada página (deve ser feito primeiro — a duração da página é obtida da duração real do áudio):

    python scripts/tts_synth.py --narration "{BASE} 讲解稿.json" --out 02_audio
    
  2. Gerar página de demonstração animada (deck.html pode ser visualizado no navegador com #preview):

    python scripts/gen_html_deck.py --narration "{BASE} 讲解稿.json" --audio 02_audio --out 01_deck
    
  3. Renderizar quadro a quadro (renderiza apenas a janela de animação, concluído em minutos):

    node scripts/render_html_frames.mjs --deck 01_deck --out 01_html_frames
    
  4. Montar vídeo (concatena sequência de quadros + legendas por frase, estilo padrão texto branco com brilho preto):

    python scripts/compose_html_video.py --deck 01_deck --frames 01_html_frames --audio 02_audio --narration "{BASE} 讲解稿.json" --out 03_output
    

    Por padrão, produz {BASE}(带字幕).mp4; --also-plain adiciona versão sem legendas; --bgm <arquivo> adiciona música de fundo (ducking automático, abaixa a música quando a narração começa; repertório Mixkit gratuito para uso comercial, deve ser aprovado pelo usuário após audição).

Rota Fallback PPT Estático:

  1. Renderizar quadros da tela (preferencialmente PowerPoint COM, requer PowerPoint instalado):

    powershell -ExecutionPolicy Bypass -File scripts/export_frames.ps1 -Pptx "{BASE}.pptx" -OutDir 01_frames
    

    Se já houver PDF, pode-se usar o caminho pymupdf: python scripts/pdf_to_frames.py "{BASE}.pdf" 01_frames 1920. Após renderizar, verifique 3 páginas (primeira página / uma página densa / uma página com tabela) para confirmar que não há problemas de fonte.

  2. Sintetizar áudio de cada página: igual ao tts_synth.py acima.

  3. Montar vídeo (páginas estáticas + xfade + legendas por frase):

    python scripts/compose_video.py --frames 01_frames --audio 02_audio --narration "{BASE} 讲解稿.json" --out 03_output
    
  4. Verificar entrega: Verificar quadros de entrada/transição para confirmar animações normais e sem flashes pretos; verificar quadros no meio da página para confirmar legendas; Executar portão do vídeo final: python scripts/verify_output.py --video "03_output/{BASE}(带字幕).mp4" --deck 01_deck (especificações/duração/volume/quadros pretos/silêncio tudo ok para entregar); present_files entrega.

Etapa ⑥ Capas para Douyin (Padrão para cada episódio: Horizontal 16:9 + Vertical 9:16)

As capas são fornecidas junto com o vídeo final para facilitar o upload direto para o Douyin. Não use quadros do vídeo — gere por IA um conjunto com base no tema do episódio, entregando a tela .miora + PNGs de tamanho duplo; Modelo de prompt / correspondência de imagens / lista de verificação de qualidade em references/douyin-covers.md. Pule se o usuário disser explicitamente que não quer capa.

  1. Texto: O título do episódio em quatro caracteres é o único caractere grande na imagem (ex: "有无相生"); não adicione subtítulos pequenos (ficarão borrados); imagem sem texto além do texto principal.
  2. Cadeia Âncora (Regra Rígida): Âncora horizontal (imagem puramente gerada por texto 1920×1080) → Confirmação do usuário → Derivação vertical usando a âncora como imagem de referência (1080×1920, três seções verticais); reutilizar o token de estilo original, proibido enviar duas cegamente.
  3. Visual: Mesmo estilo do vídeo (papel de arroz branco + preto tinta + azul-ardósia + vermelhão, tinta aquarela, espaço vazio arejado); imagens tiradas do tema do episódio (ex: "有无相生" → lua cheia + reflexo da lua na água).
  4. Tamanhos Precisos: O modelo pode arredondar para 1920×1072 / 1072×1920 (diferença de 8px), reporte honestamente; se o usuário quiser exato, adicione bordas para valores padrão.
  5. Entrega: Na raiz do espaço de trabalho, {nome do episódio}-抖音封面.miora + cartões de imagem de tamanho duplo; anote o texto e tamanho da capa em 需求确认.md.

(Quando o texto precisa ser 100% controlável ou modelos reutilizáveis entre episódios, mude para exportação de layout de design editável; o padrão é geração por IA.)

Etapa ⑦ Ajustes e Iteração

  • Manter 需求确认.md no diretório de cada episódio: Respostas das 5 perguntas + registros de cada rodada de modificação (arquivar as palavras originais do usuário). Ao receber feedback, registre primeiro, depois modifique. Refazer apenas as etapas necessárias (escopo da modificação → tabela de etapas a refazer em references/pacing-and-gates.md).
  • Ajuste de estilo/cor da legenda → veja references/subtitle-style.md (a cor ASS é em ordem inversa BBGGRR, leitura obrigatória).
  • Problema de pronúncia → Apenas modifique tts_replacements e execute novamente TTS + montagem, as legendas não são alteradas.
  • Sincronização de legenda → O compose prioriza a leitura de 02_audio/timing_XX.json (timeline real de nível de frase do TTS, produzido automaticamente pelo tts_synth).
  • Problema visual/animação (rota HTML) → Modifique title/points/visual/cues do JSON do roteiro ou a orquestração em gen_html_deck.py → Execute novamente: gerar deck → renderizar → montar (áudio reutilizado, a menos que o roteiro também tenha mudado).
  • Problema visual (rota estática) → Modifique o PPT e reexporte os quadros, áudio reutilizado.
  • Modificação de capa → Se o texto/imagem estiver errado, apenas refaça o componente correspondente; se o estilo geral estiver errado, refaça a âncora e depois derive (veja references/douyin-covers.md).

Etapa ⑧ Entrega e Aceitação (Lista de Verificação)

  • Visual: Sem anomalias de fonte/esquema de cores; página com tabela (se houver) renderizada corretamente
  • Animação: Entrada de título/item natural, transição entre páginas suave, ênfase de cue alinhada com a narração (rota HTML)
  • Locução: Audível, sem engolir caracteres, velocidade uniforme em todo o episódio
  • Pronúncia: Palavras literárias corretas (ex: "老子" = lǎo zǐ)
  • Legenda: Sincronizada frase por frase com o áudio, estilo uniforme, sem overflow/recorte
  • Transição: Cross-fade suave, sem flash preto, sem quadros em branco
  • Duração: ≈ Duração alvo (±10 segundos)
  • Formato: 1920×1080 / H.264 / AAC / .mp4
  • Capa: Duas versões horizontal e vertical, quatro caracteres sem falta de traços, estilo coerente, tamanhos precisos (lista em references/douyin-covers.md)

Estrutura JSON do Roteiro (Fonte Única de Dados)

{
  "title": "老子今读-上善若水",
  "voice": "zh-CN-YunjianNeural",
  "rate": "+0%",
  "voice_confirmed": true,
  "tts_replacements": { "老子": "老紫" },
  "slides": [
    { "idx": 1, "text": "Texto do roteiro da primeira página..." },
    { "idx": 2, "text": "Texto do roteiro da segunda página...",
      "title": "Três Qualidades da Água", "points": ["Altruísmo, nutre todos os seres", "Não compete, contenta-se em ficar embaixo"],
      "cues": [ { "t": 4.5, "dur": 0.9, "target": 0 } ] }
  ]
}
  • idx numeração contínua a partir de 1, estritamente correspondente a frame_XX.png (rota estática) / slide_XX.mp3.
  • Campos opcionais por página na rota HTML: title (título da página), points (array de itens da tela), layout (title/bullets/quote/end), cues (ênfase de ponto-chave: t=segundo relativo dentro da página, target=índice do item começando de 0, dur=duração da ênfase, action=pulse); Cooperação texto-imagem (v2.1): visual (cena aquarela water/ripples/mountain/ bamboo/moon/fish, padrão combinação automática por palavras-chave do roteiro), icons (ícone de item droplet/wave/mountain/moon/leaf), image (caminho da imagem externa, incorporado na coluna direita). Quando omitidos, são derivados automaticamente do roteiro; para produção formal, é recomendado fornecê-los explicitamente.
  • tts_replacements: tabela de correção de pronúncia, age apenas na entrada do TTS, legendas e texto editável mantêm os caracteres originais. Deixe {} vazio para séries genéricas.
  • voice_confirmed padrão false, definido como true no portão ③, caso contrário os scripts recusam a montagem.

Diagnóstico Rápido de Falhas Comuns

SintomaCausaTratamento
Cor da borda da legenda diferente do esperadoA cor ASS é em ordem inversa BBGGRRVermelho=&H000000FF Azul=&H00FF0000 Preto=&H00000000
Palavra literária lida como coloquial (ex: 老子 lǎo zi)TTS padrão usa pronúncia coloquialAdicione a tts_replacements e execute TTS novamente
Fonte do PPT não renderizaNome chinês não reconhecidoUse SimSun / Microsoft YaHei
Tela branca / cadeia de filtros quebra ao montar de uma vezSobreposição overlay após xfadeDivida em duas etapas: primeiro base, depois sobreposição; escape vírgula \,
Quadro "gerado" mas não encontradopymupdf falha silenciosamenteScript já usa abspath + verificação pós-escrita; ou use export_frames.ps1
--rate -10% erro "expected one argument"argparse interpreta mal a opçãoUse --rate=-10% ou apenas modifique o rate no JSON
Montagem reporta "áudio ainda não confirmado"Portão ③ puladoDefina voice_confirmed=true e execute novamente
Erro ao escrever JSON com aspas chinesasErro de escape manualUse Python json.dump para gerar programaticamente
Geração do deck reporta "áudio faltando"Rota HTML requer TTS primeiroExecute tts_synth.py antes de gen_html_deck.py
Renderização reporta "Chromium não encontrado"Caminho do navegador mudouUse --browser para especificar chrome.exe / msedge.exe
Título não centralizadoEscrita do seletor CSSUse .inner.layout-title (elemento da mesma classe), não use seletor descendente
Itens quebrados (frases de índice separadas)Frases curtas de índice não mescladasgen_html_deck.py já mescla internamente; points personalizados podem evitar completamente
Duração do último quadro do vídeo incorretaPeculiaridade do concat no último arquivocompose_html_video.py já repete o último arquivo internamente, não remova
Ênfase de cue não apareceCue excede a duração da páginaVerifique se t em slides[].cues é menor que a duração do áudio da página
Caractere grande da capa falta traços/erradoIA instável ao renderizar frases longas em chinêsReduza o texto para quatro caracteres e gere novamente; se o caractere da âncora estiver errado, gere a âncora novamente e depois derive
Lado curto da capa 1072≠1080Arredondamento do modeloEntregue como está (proporção ainda ≈16:9/9:16); se precisar exato, adicione bordas para 1920×1080 / 1080×1920
Duas capas não parecem um conjuntoDuas imagens geradas por texto derivam independentementeDeve ser cadeia âncora: vertical deriva usando a horizontal como referência

Experiência completa de dificuldades e arquitetura em references/pitfalls.md; detalhes da rota HTML animada em references/html-animation.md.

Recursos

  • scripts/doctor.py — Check-up do ambiente (executar no início de cada episódio, corrigir MISSING antes de começar)
  • scripts/verify_output.py — Portão do vídeo final (especificações/duração/volume/quadros pretos/silêncio, tudo ok para entregar)
  • scripts/gen_html_deck.py — Roteiro → Página HTML de demonstração com cooperação texto-imagem + lista deck.json (entrada da rota HTML)
  • scripts/render_html_frames.mjs — Renderização determinística quadro a quadro com Playwright (renderiza apenas a janela de animação, reutiliza o último quadro para segmentos estáticos)
  • scripts/compose_html_video.py — Montagem da sequência de quadros + áudio + legendas com timeline real + BGM ducking (rota HTML)
  • scripts/tts_synth.py — Síntese em lote com edge-tts (correção de pronúncia + timeline real de nível de frase + portão voice_confirmed)
  • scripts/compose_video.py — Montagem de páginas estáticas + xfade + legendas por frase (rota fallback estática)
  • scripts/export_txt.py / scripts/import_txt.py — Sincronização bidirecional entre roteiro e txt editável
  • scripts/preview_voices.py — Página de comparação de audição de 5 timbres (reproduzível offline)
  • scripts/export_frames.ps1 — Exportação de quadros 1920×1080 via PowerPoint COM (rota estática preferencial)
  • scripts/pdf_to_frames.py — Renderização de quadros PDF com pymupdf (rota estática alternativa)
  • references/douyin-covers.md — Fluxo completo de capas para Douyin: regras de texto / modelo de prompt / cadeia âncora / lista de verificação de qualidade (padrão para cada episódio, tamanhos duplos horizontal e vertical)
  • references/html-animation.md — Rota HTML animada: conclusão de viabilidade / regras de layout / dificuldades (leitura obrigatória)
  • references/pacing-and-gates.md — Limites de ritmo / validação de dados / portão duplo / BGM / tabela de escopo de revisão (leitura obrigatória)
  • references/playbook.md — Manual completo do fluxo: tabela de itens de confirmação / pilha tecnológica / rota de otimização
  • references/pitfalls.md — Lista de dificuldades e experiência de arquitetura
  • references/subtitle-style.md — Manual de estilo de legenda ASS (ordem inversa de cores / efeito brilho / predefinições de estilo)
  • assets/narration-template.json — Modelo JSON do roteiro

Dependências: playwright-core (node_modules na raiz da skill, já instalado); Ordem de detecção do Chromium cache ms-playwright → Edge do sistema. Se ambos faltarem, especifique com --browser.

Habilidades Relacionadas