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)
- Sobre o que é este episódio? (Tema / Capítulo da obra)
- Profundidade do conteúdo: Explicação detalhada / Explicação dos pontos principais? (Padrão: Explicação detalhada)
- Duração alvo do vídeo finalizado? (Padrão: 6-7 minutos)
- O estilo do PPT continua sendo o nova China aquarela? (Padrão: Sim)
- 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)
| Item | Valor Padrão |
|---|---|
| Estilo PPT | Nova China Aquarela: papel de arroz branco + preto tinta + azul-ardósia + vermelhão |
| Fonte | Título SimSun (Song Ti), Corpo Microsoft YaHei (SlideDSL sempre usa font-family em inglês) |
| Elementos Visuais | Ilustrações SVG em aquarela (sem usar imagens geradas por IA, fidelidade 100%, modificável repetidamente) |
| Animação | Página HTML animada: Título blur-in / Itens fade-up escalonados / Transição cross-fade entre páginas / Ênfase de pontos-chave com cue |
| Timbre | zh-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) |
| Legenda | Texto branco + brilho externo preto (blur 0.8), fundo transparente, centralizado na parte inferior |
| Resolução | 1920×1080 (16:9) |
| Correção de Pronúncia | "老子" → TTS lê "老紫" (lǎo zǐ, terceiro tom literário), legenda ainda exibe "老子" |
| Capa Douyin | Horizontal 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 emreferences/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} 讲解稿.jsonprogramaticamente, escrevendo o roteirotextpara cada página; Cada página pode opcionalmente tertitle(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 emreferences/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)
-
Extraia o roteiro das notas do PPT, gere programaticamente o
{BASE} 讲解稿.json(estrutura abaixo). -
Exporte texto editável para revisão:
python scripts/export_txt.py "{BASE} 讲解稿.json" -
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)
-
Gere uma página de audição para o usuário escolher o timbre:
python scripts/preview_voices.py 配音试听 -
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):
-
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 -
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 -
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 -
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_outputPor padrão, produz
{BASE}(带字幕).mp4;--also-plainadiciona 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:
-
Renderizar quadros da tela (preferencialmente PowerPoint COM, requer PowerPoint instalado):
powershell -ExecutionPolicy Bypass -File scripts/export_frames.ps1 -Pptx "{BASE}.pptx" -OutDir 01_framesSe 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. -
Sintetizar áudio de cada página: igual ao tts_synth.py acima.
-
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 -
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_filesentrega.
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.
- 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.
- 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.
- 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).
- 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.
- 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
需求确认.mdno 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 emreferences/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_replacementse 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 } ] }
]
}
idxnumeração contínua a partir de 1, estritamente correspondente aframe_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_confirmedpadrão false, definido como true no portão ③, caso contrário os scripts recusam a montagem.
Diagnóstico Rápido de Falhas Comuns
| Sintoma | Causa | Tratamento |
|---|---|---|
| Cor da borda da legenda diferente do esperado | A cor ASS é em ordem inversa BBGGRR | Vermelho=&H000000FF Azul=&H00FF0000 Preto=&H00000000 |
| Palavra literária lida como coloquial (ex: 老子 lǎo zi) | TTS padrão usa pronúncia coloquial | Adicione a tts_replacements e execute TTS novamente |
| Fonte do PPT não renderiza | Nome chinês não reconhecido | Use SimSun / Microsoft YaHei |
| Tela branca / cadeia de filtros quebra ao montar de uma vez | Sobreposição overlay após xfade | Divida em duas etapas: primeiro base, depois sobreposição; escape vírgula \, |
| Quadro "gerado" mas não encontrado | pymupdf falha silenciosamente | Script já usa abspath + verificação pós-escrita; ou use export_frames.ps1 |
--rate -10% erro "expected one argument" | argparse interpreta mal a opção | Use --rate=-10% ou apenas modifique o rate no JSON |
| Montagem reporta "áudio ainda não confirmado" | Portão ③ pulado | Defina voice_confirmed=true e execute novamente |
| Erro ao escrever JSON com aspas chinesas | Erro de escape manual | Use Python json.dump para gerar programaticamente |
| Geração do deck reporta "áudio faltando" | Rota HTML requer TTS primeiro | Execute tts_synth.py antes de gen_html_deck.py |
| Renderização reporta "Chromium não encontrado" | Caminho do navegador mudou | Use --browser para especificar chrome.exe / msedge.exe |
| Título não centralizado | Escrita do seletor CSS | Use .inner.layout-title (elemento da mesma classe), não use seletor descendente |
| Itens quebrados (frases de índice separadas) | Frases curtas de índice não mescladas | gen_html_deck.py já mescla internamente; points personalizados podem evitar completamente |
| Duração do último quadro do vídeo incorreta | Peculiaridade do concat no último arquivo | compose_html_video.py já repete o último arquivo internamente, não remova |
| Ênfase de cue não aparece | Cue excede a duração da página | Verifique se t em slides[].cues é menor que a duração do áudio da página |
| Caractere grande da capa falta traços/errado | IA instável ao renderizar frases longas em chinês | Reduza 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≠1080 | Arredondamento do modelo | Entregue 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 conjunto | Duas imagens geradas por texto derivam independentemente | Deve 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ávelscripts/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çãoreferences/pitfalls.md— Lista de dificuldades e experiência de arquiteturareferences/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.