Lesson Video Producer
Transforme o deck de slides de uma lição em um vídeo de ensino finalizado: uma voz sintética lê a narração, cada card, etapa ou linha aparece exatamente quando a voz o alcança, as transições variam, efeitos sonoros suaves marcam cada revelação, uma base musical de piano diminui sob a voz, uma contagem regressiva é executada onde os alunos pausam, itens-chave recebem um círculo desenhado à mão, legendas são fornecidas como arquivos separados, e gravações de tela reais são inseridas em lições práticas. Uma lição de cada vez; execute, examine e então entregue.
Entrada, do skill lesson-slide-designer: slides/<curso>/<lição>/slides.json, <nome_do_arquivo>.pptx e _preview/slide-NN.png. Se estiverem faltando, construa o deck primeiro. Decks da edição vietnamita (kieu, loi_doc, _kiem/) também são lidos.
Saída em videos/<curso>/<lição>/ (espelha o caminho dos slides; caso contrário <pasta dos slides>/video/):
| Arquivo | O que é |
|---|---|
<nome_do_arquivo>.mp4 | O vídeo: 1920x1080, 30 fps, H.264, AAC 48 kHz, -16 LUFS |
<nome_do_arquivo>.<idioma>.vtt / .srt | Legendas como arquivos separados, nunca incorporadas (cobririam o texto do slide); carregue o .vtt como legendas |
<nome_do_arquivo>.narration.txt | Narração limpa, uma linha por batida falada; ` |
<nome_do_arquivo>.storyboard.json / .md | O que acontece quando: regiões medidas a partir do pptx, a linha em que cada uma aparece, efeitos, transições, círculos, zooms, contagens regressivas; o .md é para revisão visual |
<nome_do_arquivo>.voice.mp3 + .timeline.json | A narração e o início e fim exatos de cada linha (linhas em cache em .voice.mp3.cache/) |
<nome_do_arquivo>.events.json, .audio.mp3 | Eventos sonoros e a mixagem de três camadas |
video.json (opcional, você escreve) | Substituições por slide: linhas de revelação, transição, pausa, círculo, zoom, gravação de tela |
_check/ | contact-NN.png (quadros do vídeo finalizado), <nome_do_arquivo>.report.md (medições), voice-review.txt (Whisper), voice-exceptions.txt |
_segments/ | Um segmento renderizado por slide, reutilizado quando esse slide não mudou |
Ferramentas: Python 3.10+ com python-pptx, numpy, Pillow (opencv-python para suavizar gravações, faster-whisper para revisão de voz); Node 18+ com puppeteer-core (npm install em assets/engine) e Chrome, Chromium ou Edge; ffmpeg/ffprobe. Vozes: Kokoro (pip install kokoro soundfile) ou VieNeu-TTS, ambos Apache 2.0 e locais. Se um mecanismo estiver em seu próprio ambiente virtual, defina KOKORO_PYTHON ou VIENEU_PYTHON para esse Python. Uma GPU ajuda, mas é opcional.
Fluxo de Trabalho
Etapa 0. Leia o deck e ajuste o briefing
- Leia
slides.json(narração, notas de produção, tipos de slide) e dê uma olhada em_preview/contact-sheet.png. Se a fonte da lição existir, leia-a para saber onde os alunos praticam e onde são feitas perguntas. - Leia
references/video-standards.md(o padrão: um tópico, script, abertura-corpo-fechamento, transições, interação) ereferences/motion-and-sound.md(o que cada tipo de slide recebe e por que o vídeo deve se mover sem ficar confuso). - Ajuste: idioma e voz (
languageem slides.json; inglês padrão para Kokoroam_michael,af_heartpara voz feminina, outros idiomas Kokoro pelo prefixo da voz, vietnamita para VieNeu); se a lição precisa de gravações de tela reais (qualquer lição que ensine cliques, digitação ou software: sim, veja a Etapa 2); quais slides de pergunta pausam e por quanto tempo; o que circular ou ampliar. A narração foi escrita para texto-para-fala na etapa do slide. Não reescreva o conteúdo de ensino aqui; corrija apenas como uma palavra é pronunciada quando a voz a entende errado.
Etapa 1. Construa o storyboard e revise-o
python scripts/storyboard.py slides/<curso>/<lição>/slides.json
Leia <nome_do_arquivo>.storyboard.md: regiões por slide, a linha em que cada uma aparece, transições, pausas, círculos. Verifique na seção 4 de motion-and-sound.md: o terceiro card aparece quando a voz atinge a terceira ideia; vizinhos nunca compartilham uma transição; slides de pergunta pausam; uma nota como "circule a resposta B" produziu um círculo. Corrija com video.json (veja templates/video.example.json) e execute novamente. "Nenhuma região encontrada" significa que o slide aparece inteiro: bom para image, verifique o pptx para outros tipos.
Etapa 2. Gravações de tela reais (lições práticas, mão na massa e de software)
Quando a lição ensina uma ação, mostre a ação real. Nunca a substitua por uma captura de tela ou página simulada. Regras em references/screen-recording.md. Resumindo:
- Prepare a janela: uma janela de navegador privada ou uma conta limpa, sem notificações, sem nomes reais nas barras laterais. No Windows,
python scripts/record_screen.py --listfornece os títulos das janelas. - Grave:
python scripts/record_screen.py videos/<curso>/<lição>/clips/S07-nome.mp4 --window "<título>" --seconds 40 --size 1280x720 [--crop-top 90] [--scroll "6:200:4"](Windows; em outros lugares use OBS ou ffmpeg). Dirija os cliques e a digitação você mesmo através de ferramentas do navegador, ou deixe o usuário fazê-los. Role apenas com--scrollou uma rolagem suave na página (window.scrollBy({top: 200, behavior: 'smooth'})a cada 0,6 a 0,8 s), nunca passo a passo. Mantenha-se parado de 3 a 5 s após cada resultado; role resultados longos lentamente (150 a 250 px/s) para que os alunos possam lê-los. check_motion.pyé executado após cada gravação. Qualquer salto restante:python scripts/smooth_scroll.py <entrada> <saída>, meça novamente até zero. Observe a faixa superior do clipe em busca de nomes de contas e abas perdidas.- Declare em
video.json:"S07": {"clip": {"file": "clips/S07-nome.mp4", "mode": "frame", "speed": "auto"}}. O slide deve ser um slideimageoutwo-columncom um quadro grande; coloque o primeiro quadro do clipe nele (composite_clips.py --first-frame clips/S07-nome.mp4 slides/<curso>/<lição>/S07-first-frame.png) e reconstrua o deck, para que o clipe apareça sem um salto. - Execute
make_video.py ... --extend: adiciona silêncio onde uma gravação é mais longa que sua narração. Nunca acelere uma gravação além de 1,25x.
Etapa 3. Renderize com um comando
python scripts/make_video.py slides/<curso>/<lição>/slides.json [--extend]
Nove etapas: storyboard, narração (através de gpu_lock.py), revisão Whisper, plano de renderização, mixagem de três camadas, imagem (Chrome headless, slide por slide), gravações de tela, legendas, verificação final. Execute em segundo plano para lições com mais de 3 minutos (a renderização leva aproximadamente um a dois minutos por minuto de vídeo na primeira vez, segundos para uma correção em nível de slide). Quando parar:
- Revisão de voz (
_check/voice-review.txt): Whisper ouve o arquivo inteiro uma vez, depois apenas as linhas suspeitas são regeneradas e verificadas novamente, até 3 rodadas. Ele filtra os próprios erros do Whisper em palavras curtas, frases que inventa sobre música e qualquer coisa que uma segunda audição com contexto ouça corretamente; para apenas em palavras longas, termos, nomes ou várias palavras seguidas. Ouça o local (ffmpeg -ss 1:23 -t 4 -i <voice.mp3> clip.wav). Se a voz estiver errada, adicione uma reescrita aPRONUNCIATIONemmake_voice.py(as legendas mantêm a grafia real) ou altere a palavra emslides.json; se Whisper ouviu mal, adicione a palavra a_check/voice-exceptions.txt. Em seguida,--from-step 2(linhas em cache não são regeneradas). - FALHA na verificação final (
_check/<nome_do_arquivo>.report.md): corrija a causa (volume com--music-db, saltos suavizando a gravação, comprimento re-renderizando) e execute novamente a partir dessa etapa.
Etapa 4. Olhe antes de relatar
- Olhe para
_check/contact-NN.png(três quadros por slide: chegando, estabelecido, prestes a sair) com a lista de verificação emreferences/quality-checks.md: um patch de capa deixado sobre o texto, texto cortado por um zoom, dois slides visíveis ao mesmo tempo durante uma transição, uma contagem regressiva sobre o texto, uma gravação fora do quadro, um primeiro quadro vazio. Para inspecionar um momento de perto:node assets/engine/render.mjs sheet <storyboard.json> <timeline.json> _check/zoom --from 40 --to 46 --every 0.25. - Ouça dois lugares: os primeiros 20 s e uma transição (
ffmpeg -ss 0 -t 20 -i <mp4> -vn test.mp3). Efeitos audíveis, mas claramente sob a voz, música baixa. - Corrija com
video.jsonou os scripts, renderize novamente (apenas slides alterados re-renderizam), olhe novamente até que uma passagem completa não encontre nada. Nunca relate um vídeo como concluído antes de olhar as folhas de contato da renderização mais recente.
Etapa 5. Relatório
Forneça ao usuário: os caminhos do mp4 e vtt; duração real; voz e ritmo (palavras por segundo); slides, efeitos, pausas; o relatório de verificação (veredito, LUFS, saltos); quais gravações foram compostas; palavras adicionadas à tabela de pronúncia ou às exceções do Whisper; avisos restantes e por quê. Mostre uma folha de contato.
Várias lições em sequência
Mantenha a voz, o nível de música e os sons consistentes em todo um curso; as lições não devem diferir em mais de 1,5 LU (compare a linha LUFS de cada relatório). A tabela de pronúncia e as exceções do Whisper crescem com o tempo; não as redefina. Mantenha as gravações em videos/<curso>/<lição>/clips/, um novo nome de arquivo por take. Um deck dividido em vídeos de tópico (V<k>-<nome>/slides.json) é renderizado um sub-deck de cada vez.
Princípios
- O padrão é fixo (
video-standards.md): um tópico por vídeo, um script, abertura-corpo-fechamento, transições faladas entre as partes, interação. Ritmo, imagem e som são onde você cria. - Imagem e voz se completam; a voz nunca lê o slide. Uma região aparece quando a voz a alcança; o texto que está sendo lido não se move.
- Pausas que concordam com a tela: narração que diz "pause o vídeo" recebe uma pausa de 3 s e nenhuma contagem regressiva (o aluno aperta pausa; um temporizador em execução ao lado de um rótulo "60 segundos" o contradiria). Uma pergunta sem essa frase pausa pelo tempo indicado, no máximo 60 s, com uma contagem regressiva.
- Círculos de atenção: respostas e notas como "circule B" recebem um círculo deliberado; uma ideia lida com uma palavra de ênfase recebe um círculo automático que desaparece; elipses para cards, caixas arredondadas para linhas; no máximo três por slide.
- Cursor desligado por padrão. Um ponteiro desenhado parece um mouse solto para a maioria dos espectadores. Ligue-o com
{"_all": {"cursor": true}}em video.json para vídeos estilo demonstração; ele se move em curvas, descansa fora do texto e nunca aparece em slides de título, seção, mensagem-chave ou encerramento. - Vivaz, não confuso: algo muda a cada 5 a 10 segundos e nada fica parado por mais de 25; mas um ponto focal por quadro, sem giros ou cambalhotas, no máximo 16 efeitos sonoros por minuto, sons de transição apenas nas mudanças de slide, música 17 a 23 dB abaixo da voz.
- A voz é a qualidade que as pessoas ouvem primeiro. Não estique o tempo de um modelo que soa mal esticado (VieNeu); diminua-o com pausas mais longas. A revisão do Whisper não é opcional: um termo mal pronunciado é um erro de ensino.
- Legendas são arquivos separados, nunca incorporadas.
- O conteúdo não muda na etapa do vídeo: sem novas ideias, sem números inventados. Um problema de narração volta para a etapa da lição ou do slide.
- Execute, meça, olhe antes de entregar: volume, saltos, duração, folhas de contato.
- Uma gravação é uma gravação: sem capturas de tela substituindo ações; a rolagem deve ser medida como suave.
- Para adicionar uma transição, efeito ou som: estenda
assets/engine/video.js, as tabelas emscripts/storyboard.pyereferences/motion-and-sound.md, renderize um teste, olhe para ele e use-o.
Referências
references/video-standards.md: o padrão instrucional para materiais de aprendizagem em áudio e vídeo, mapeado para tipos de slide, além de especificações de plataforma (Udemy e similares).references/motion-and-sound.md: como regiões e ações são inferidas, a tabela de tipos de slide, números de movimento, a trilha sonora, sintaxe devideo.json, como manter os alunos acordados.references/narration-voice.md: Kokoro e VieNeu, ritmo, correções de pronúncia, a revisão Whisper.references/screen-recording.md: gravação de uma janela, rolagem suave, medição e suavização de saltos, composição, privacidade.references/quality-checks.md: limites da verificação final e a lista de verificação da folha de contato.templates/video.example.json: substituições por slide.