Communitygithub.com

nielssrb/Video2presentation

Transforme gravações de seminários, webinars ou conferências em uma apresentação editável com slides extraídos dos quadros, links anotados e trechos da transcrição como notas do orador.

O que é Video2presentation?

Esta skill transforma gravações de seminários, webinars e conferências em apresentações editáveis. Ela extrai slides dos quadros do vídeo usando técnicas de processamento de imagem e visão computacional, gera transcrições via API AssemblyAI, e anota os slides com trechos da transcrição como notas do orador. A skill é útil para criadores de conteúdo, educadores e pesquisadores que precisam reutilizar o conteúdo de palestras online de forma produtiva. Ela suporta plataformas como Claude Code e Cowork (ou qualquer ambiente que permita `device_bash`, `AskUserQuestion` e anexos), e exige que a transcrição e o processamento de vídeo sejam executados localmente no computador do usuário, com apenas imagens estáticas enviadas para a nuvem. O fluxo de trabalho inclui etapas de reconhecimento, planejamento, transcrição, extração de quadros, organização lógica dos slides, anotação de imagens, verificação de links e notas, e montagem final no formato de apresentação.

Funciona com✓Claude Code~Codex CLI~Cursor
npx skills add nielssrb/Video2presentation

Perguntar na sua IA favorita

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

Documentação

Video2presentation: gravação de seminário → apresentação

O histórico detalhado de decisões e números medidos está em METHODOLOGY.md na pasta Video2presentation. Se esta skill e o METHODOLOGY.md discordarem, siga a skill. Adicione novas lições ao METHODOLOGY.md.

Regras que sempre se aplicam

  1. Planeje e faça perguntas primeiro. Antes de qualquer processamento, informe ao usuário o plano seguindo os passos abaixo e faça perguntas esclarecedoras com AskUserQuestion (a lista está no passo 0). Comece o trabalho somente após as respostas.
  2. Respostas ao usuário. Responda no idioma do usuário (geralmente não inglês), de forma honesta e sem bajulação. Calcule todos os números com um script. Formate informações como tabelas; use texto simples apenas se o usuário pedir. Forneça o link da apresentação após cada atualização.
  3. Segurança.
    • Leia a chave da AssemblyAI apenas do arquivo assemblyai_key.txt. Nunca imprima ou copie para a nuvem, notas ou artefatos.
    • Não use as integrações do Miro ou Figma, mesmo que o palestrante mostre um quadro Miro: extraia o quadro dos quadros do vídeo.
    • Não apague nada nas pastas do usuário sem permissão, incluindo as pastas de trabalho _work/.
  4. Precisão.
    • Não corrija o palestrante silenciosamente: anote contradições e discrepâncias numéricas nas notas com um código de tempo.
    • Recalcule números dos slides com um script.
    • Verifique alegações legais e adicione uma breve ressalva no slide.
    • Marque as conclusões finais como uma síntese, não como um slide do palestrante.
  5. O vídeo não vai para a nuvem. ffmpeg, OpenCV e a transcrição são executados no computador do usuário (device_bash). Apenas folhas de contato, mosaicos, quadros individuais e recortes vão para a nuvem — o que precisa ser visualizado, reconhecido ou enviado para o artefato.

Onde as coisas estão

  • A pasta da skill e do projeto é Video2presentation (no Cowork, a pasta conectada $HOME/mnt/Video2presentation; no Claude Code, a pasta atual). Sua raiz contém a skill em si (SKILL.md) e METHODOLOGY.md.
  • pipeline/ — scripts:
    • transcribe_assemblyai.py — transcrição via AssemblyAI;
    • extract_slides.py — um quadro por segundo, máscara webcam, segmentos estáveis, deduplicação, folhas de contato;
    • mosaic.py — mosaicos 2×2 a partir de uma lista de quadros;
    • crop_images.py e crops_<data>[_<palestrante>].json — recorte de imagens;
    • clean_transcript.py — trechos de transcrição limpos por slide.
  • assemblyai_key.txt — chave da API AssemblyAI. O arquivo pode estar faltando — veja o passo 0 e o passo 1.
  • Pasta do evento AAAA.MM.DD Nome/: o vídeo, às vezes uma descrição (html, ou texto na mensagem do usuário), às vezes uma transcrição pronta (sentences.json, transcript.txt). Coloque arquivos intermediários em <pasta do evento>/_work/.
  • Se os scripts estiverem faltando, veja "Se pipeline/ não estiver disponível" no final.

Passo 0. Reconhecimento, plano, perguntas

  1. Inspecione a pasta do evento:
    • vídeo: resolução, duração, fps (ffprobe); se há uma segunda cópia em outra resolução;
    • uma transcrição pronta;
    • se assemblyai_key.txt existe — é necessário se a transcrição tiver que ser feita do zero;
    • descrição do evento (opcional): nomes, handles do Telegram, tópicos das palestras. Pode estar no final da mensagem do usuário ou em um arquivo html. Se não houver descrição, extraia nomes e tópicos da própria gravação.
  2. Apresente o plano e pergunte com AskUserQuestion. A opção "Recomendado" é o que o usuário escolheu antes:
    • Transcrição: use a pronta se existir (Recomendado), ou faça uma nova com AssemblyAI.
    • Notas do slide: um trecho da transcrição levemente limpo para o tempo em que o slide está na tela (Recomendado), um trecho literal, ou um resumo curto com código de tempo.
    • Trecho com mais de 4000 caracteres (limite de notas do Slides): encurte com uma marca "[…" (escolha do usuário da última vez) ou divida o slide.
    • Formato "igual ao da última vez" (Recomendado): detalhado e próximo ao original; respostas a perguntas como slides dentro da palestra; anúncios e partes organizacionais ignoradas; conclusões gerais e uma lista consolidada de links no final.
    • Número de palestrantes — se a descrição não deixar claro (necessário para diarização).
  3. Crie uma lista de tarefas com uma etapa de verificação final.

Passo 1. Transcrição

  • Transcrição pronta: verifique primeiro — rótulos de palestrante e timestamps no nível da palavra presentes, duração corresponde ao vídeo. Se tudo estiver lá, não é necessário reexecutar.

  • Chave AssemblyAI. Antes de uma nova transcrição, verifique se assemblyai_key.txt existe na raiz da pasta e não está vazio. Se o arquivo estiver faltando, não continue este passo e informe ao usuário: eles precisam se registrar em assemblyai.com, obter uma chave de API e salvá-la em assemblyai_key.txt na raiz da pasta (ou enviá-la — então salve nesse arquivo e não a repita em nenhum outro lugar). É melhor dizer isso imediatamente no plano no passo 0.

  • Nova transcrição. Extraia o áudio sem reencodificação da cópia de resolução mais baixa: ffmpeg -i in.mp4 -vn -c:a copy audio.m4a. Então:

    python3 pipeline/transcribe_assemblyai.py audio.m4a <OUT> --key-file assemblyai_key.txt --lang <código do idioma> [--speakers --min-speakers N --max-speakers M] --submit-only
    python3 pipeline/transcribe_assemblyai.py - <OUT> --key-file assemblyai_key.txt --fetch --wait 150   # repita até concluir
    
    • Para falas não-inglesas, use um modelo que suporte o idioma da gravação; a partir de outubro de 2026, é universal-2.
    • Diarização apenas quando várias pessoas falam: em uma única voz, produz rótulos A/B falsos.
    • O domínio api.assemblyai.com deve estar na lista de permissões (Configurações → Capacidades). Se o proxy retornar 403, informe ao usuário e não contorne.
    • Preço — cerca de US$ 0,15 por hora mais US$ 0,02 por hora para diarização.
  • Arquivo de trabalho transcript_sent.txt: uma linha = N [h:mm:ss] RÓTULO: frase, onde N é o número da frase começando em 1. config.json e overrides.json referem-se a esses números.

  • Rótulos → pessoas. Combine-os pela forma como o anfitrião se dirige às pessoas ("Leonid, você é o primeiro, certo?"), pela descrição e pelo conteúdo. Erros típicos de diarização:

    • uma pessoa recebe dois rótulos;
    • uma palestra inteira é uma única fala;
    • uma pergunta curta da plateia é atribuída a um vizinho.

    Escreva correções em config.json: names (rótulo → nome), speaker_by_line (linha → nome), drop_lines (linhas a remover).

  • Limites das palestras: registre-os como códigos de tempo — introdução, cada palestra com seu Q&A, encerramento. Esta é a estrutura de seção da apresentação.

Passo 2. Quadros

  • Resolução. Se houver duas cópias: análise na cópia de baixa resolução (--reduce 2), texto e recortes da cópia de alta resolução (ffmpeg -ss <seg> -i hd.mp4 -frames:v 1 hd/NNNNN.jpg). Se houver uma cópia: --reduce 4 (para baixa resolução, --reduce 2); texto grande pode ser lido diretamente do quadro.
  • Extraia em partes. device_bash tem um limite de cerca de 180 s por chamada, e processos em segundo plano não sobrevivem.
    python3 pipeline/extract_slides.py video.mp4 <OUT> --chunk 1000
    python3 pipeline/extract_slides.py video.mp4 <OUT> --skip-extract --reduce 4
    
    • A velocidade do ffmpeg varia muito: em execuções passadas, de 10× a 48× o tempo real. Meça no primeiro pedaço e escolha um tamanho de pedaço não maior que 0,8 × limite × velocidade.
    • Envolva a chamada em timeout; finalize pedaços incompletos por números de quadro.
    • Dois processos ffmpeg em paralelo em dois núcleos não são mais rápidos.
    • Quadro NNNNN.jpg = segundo N−1.
  • Webcam. A máscara é detectada automaticamente. No layout do Google Meet (compartilhamento de tela à esquerda, câmeras à direita) não é necessária. A janela da câmera do palestrante geralmente está no canto superior direito — recortes e OCR a evitam.
  • Revisão. Veja as folhas de contato (sheets/), não todos os quadros: mova-as para a nuvem e abra-as. Para detalhes, use mosaicos 2×2: python3 pipeline/mosaic.py HD_DIR OUT PREFIX 00165 00179 ….
  • Slides animados saem da seleção: um fundo em movimento não produz um segmento estável. Verifique a numeração de slides do palestrante (01/16, 06/17…). Procure por lacunas em segundos entre slides encontrados vizinhos, usando um mosaico construído a partir de uma lista explícita de quadros.
  • Mover arquivos para a nuvem funciona apenas a partir da pasta conectada: copie arquivos de diretórios de trabalho da VM (~/w…) para _work/ primeiro.

Passo 3. Slides lógicos

O objetivo não é repetir o vídeo quadro a quadro, mas obter slides que possam ser apresentados.

  • Slides do palestrante. Redigite o texto (OCR é apenas um rascunho); insira gráficos e capturas de tela como recortes. O mesmo slide no editor (com a faixa de miniaturas), ampliado ou pausado é uma duplicata; pegue o de tela cheia.
  • Quadros (Miro, Excalidraw). Um slide = o bloco do quadro sobre o qual o palestrante está falando; panorâmica e zoom no mesmo bloco são duplicatas. Se o quadro for preenchido conforme a palestra avança, pegue o último quadro completo e divida-o em slides por bloco.
  • Interfaces de aplicativos. Pegue a tela com o resultado (tabela, relatório, painel, resposta do bot), não os cliques intermediários.
  • Demonstração ao vivo de site com rolagem — não como quadros, mas recontada a partir da transcrição ("slide das palavras do palestrante").
  • Webcam em tela cheia não é um slide; seu conteúdo vai para um slide das palavras do palestrante.
  • Perguntas e respostas — slides separados no final da palestra: a pergunta (com o nome do autor) e a essência da resposta.
  • Anúncios e partes organizacionais pelos anfitriões: pule-os. Dê os anúncios próprios do palestrante (curso, preço) de forma breve e como referência, a menos que o usuário tenha pedido o contrário.
  • Estrutura da apresentação:
    • capa e agenda;
    • para cada palestra: um slide de título de seção, conteúdo, perguntas, um slide "Links e serviços";
    • conclusões gerais — marcadas "síntese" e incluindo contradições entre palestrantes;
    • uma lista consolidada de links.
  • Para cada slide, registre um id com o prefixo da palestra (l-, v-…), os quadros de origem e o intervalo na tela.

Passo 4. Imagens

  • Salve as coordenadas de recorte no quadro em tamanho real em pipeline/crops_<AAAA-MM-DD>[_<palestrante>].json, formato {"nome": ["00556.jpg", x0, y0, x1, y1]}.
  • Recorte: python3 pipeline/crop_images.py QUADROS crops.json OUT --scale 2 --jpg para baixa resolução, --scale 1 --jpg para alta.
  • Não verifique nem oculte dados pessoais em quadros e materiais de webinar (nomes, contatos, logins, correspondência): mantenha como está.

Passo 5. Texto, OCR, QR, números

  • OCR. No computador do usuário, o tesseract geralmente tem apenas inglês. Para outros idiomas, use a nuvem: apt-get install tesseract-ocr-<código do idioma>, pinte a janela da câmera de branco, amplie o quadro ×1,5, tesseract -l <código do idioma>+eng. Verifique o resultado em relação ao quadro: nomes são distorcidos.
  • Códigos QR: cv2.QRCodeDetector em quadros de alta resolução, resultados em qr.json.
  • Números. Recalcule somas de linhas, porcentagens e figuras como "≈1.700 por lead" dos slides com um script. Não corrija uma discrepância; anote-a: "as linhas somam 60,3k, o slide diz 64k". Marque valores lidos de gráficos não rotulados com "≈".

Passo 6. Links

  • Fontes: endereços no quadro, códigos QR, fala, descrição do evento (handles do Telegram). O ASR distorce nomes (invoice.com → "invoisin", Gwen → Qwen, JLM → GLM), então pegue a grafia correta do quadro ou de uma pesquisa.
  • Verificação. Verifique cada link com WebSearch ou WebFetch e coloque a data da verificação no rodapé do slide. Catálogos como Product Hunt (producthunt.com) e There's An AI For That (theresanaiforthat.com) rapidamente fornecem o endereço oficial e a descrição de um serviço.
  • Não abriu — não contorne com curl ou mirrors. t.me frequentemente retorna 429: não tente novamente; marque "endereço do slide, página não abriu".
  • Não encontrado — diga: "serviço não encontrado", "link prometido depois".
  • Onde colocá-los. O último slide de cada palestra: links com uma anotação de uma linha. Em sua nota, mais detalhes: o que é, o preço do site, como o palestrante o usa, o que não foi encontrado. No final da apresentação — um slide consolidado: palestrantes e ferramentas por categoria.

Passo 7. Notas — trechos da transcrição

  • Intervalos. ranges.json — [["slide-id", inicio_em_seg, fim_em_seg], …] sem lacunas ou sobreposições em toda a gravação. Defina os limites pelos quadros de mudança de slide e pelo significado: o palestrante frequentemente começa a falar sobre o próximo slide antes de mudar.
  • Geração: python3 pipeline/clean_transcript.py <pasta do evento>/_work cria notes.json e imprime os comprimentos das notas (<-- LONGO quando maior que 3700).
  • Limpeza leve:
    • o dicionário de erros ASR REPL no script: mantenha as substituições gerais, adicione as específicas do webinar;
    • palavras de preenchimento no início de uma frase (a lista FILL no script) são removidas automaticamente;
    • corrija frases distorcidas linha por linha em overrides.json ("número da linha": "texto" ou null), mantendo o significado e a ordem das palavras do palestrante; marque partes pouco claras "[inaudível na gravação]";
    • linhas com uma substituição não são limpas novamente.
  • Verificação após a geração: sem frases repetidas (uma substituição pode duplicar uma linha vizinha) e sem linhas perdidas (cada linha em um intervalo está ou em uma nota ou deliberadamente em drop_lines).
  • Formato da nota (escrito no idioma da apresentação):
    Trecho da gravação 1:31:02–1:33:05:
    [1:31:02] Artyom: …
    [1:31:09] Stanislav: …
    
    1–2 linhas de observações: texto do quadro, discrepâncias numéricas, esclarecimentos de nomes.
    
  • Limite de 4000 caracteres. Se for maior, encurte com "[…" ou divida o slide, conforme o usuário decidiu no passo 0.

Passo 8. Montagem no Claude Slides

  • Crie um artefato do tipo Slides (início rápido do Artefato, slides de intenção) e siga seu SKILL.md. O que importa da experiência (regras de tipo a partir de outubro de 2026):
    • primeiro deck.json com a ordem completa e seções (uma seção por palestra), depois slides em lotes de 3 por publicação (url + root);
    • escreva cada slide com a ferramenta Write, não com um script; um <section> por arquivo, <aside> como o último filho; não verifique renderizando;
    • ativos: copie os arquivos de imagem para a pasta raiz ou uma subpasta e use caminhos relativos no deck;
    • slides de seção: cabeçalho grande, sem conteúdo adicional.

Se pipeline/ não estiver disponível

Se a pasta pipeline/ estiver faltando ou vazia:

  1. Verifique se ela existe e tem conteúdo.
  2. Se não, informe ao usuário que os scripts estão faltando e peça para verificar a instalação da skill.

Habilidades Relacionadas