Communitygithub.com

lesson-video-producer-skill

Transforma um deck de slides de uma lição (slides.json + .pptx + imagens dos slides) em um vídeo de aula narrado finalizado (1080p mp4), com voz TTS local, todos os cards e etapas sincronizados com a narração, transições variadas, círculos de atenção desenhados à mão, efeitos sonoros e fundo musical, legendas separadas, gravações de tela reais com rolagem suave e um relatório de qualidade. Re-renderiza apenas slides alterados.

O que é lesson-video-producer-skill?

Este skill automatiza a produção de vídeos de aula a partir de decks de slides criados pelo skill `lesson-slide-designer`. Ele transforma slides.json, .pptx e imagens de pré-visualização em vídeos MP4 1080p totalmente narrados, usando síntese de voz local (Kokoro para inglês e outros idiomas, VieNeu para vietnamita) para ler a narração em sincronia com a revelação incremental de cards e etapas. O vídeo inclui transições variadas, círculos de atenção desenhados à mão para destacar itens importantes, efeitos sonoros suaves, uma base musical de piano que diminui quando a voz fala, contagens regressivas para pausas, e legendas separadas em arquivos .vtt e .srt. Para lições práticas, o skill permite gravações reais de tela com rolagem suave. Ele re-renderiza apenas os slides alterados, economizando tempo, e produz um relatório de qualidade com métricas como LUFS e saltos. É útil sempre que o usuário quiser criar, renderizar ou exportar um vídeo de aula, curso, palestra Udemy, slideshow narrado, narração para slides ou gravação de tela em uma lição. Suporta Python 3.10+, Node 18+ e ferramentas como ffmpeg, Puppeteer e Kokoro/VieNeu-TTS.

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

Perguntar na sua IA favorita

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

Documentação

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/):

ArquivoO que é
<nome_do_arquivo>.mp4O vídeo: 1920x1080, 30 fps, H.264, AAC 48 kHz, -16 LUFS
<nome_do_arquivo>.<idioma>.vtt / .srtLegendas como arquivos separados, nunca incorporadas (cobririam o texto do slide); carregue o .vtt como legendas
<nome_do_arquivo>.narration.txtNarração limpa, uma linha por batida falada; `
<nome_do_arquivo>.storyboard.json / .mdO 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.jsonA 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.mp3Eventos 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

  1. 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.
  2. Leia references/video-standards.md (o padrão: um tópico, script, abertura-corpo-fechamento, transições, interação) e references/motion-and-sound.md (o que cada tipo de slide recebe e por que o vídeo deve se mover sem ficar confuso).
  3. Ajuste: idioma e voz (language em slides.json; inglês padrão para Kokoro am_michael, af_heart para 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:

  1. 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 --list fornece os títulos das janelas.
  2. 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 --scroll ou 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.
  3. 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.
  4. Declare em video.json: "S07": {"clip": {"file": "clips/S07-nome.mp4", "mode": "frame", "speed": "auto"}}. O slide deve ser um slide image ou two-column com 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.
  5. 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 a PRONUNCIATION em make_voice.py (as legendas mantêm a grafia real) ou altere a palavra em slides.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

  1. Olhe para _check/contact-NN.png (três quadros por slide: chegando, estabelecido, prestes a sair) com a lista de verificação em references/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.
  2. 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.
  3. Corrija com video.json ou 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 em scripts/storyboard.py e references/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 de video.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.

Habilidades Relacionadas