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
- 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.
- 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.
- 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/.
- Leia a chave da AssemblyAI apenas do arquivo
- 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.
- 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) eMETHODOLOGY.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.pyecrops_<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
- 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.txtexiste — é 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.
- vídeo: resolução, duração, fps (
- 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).
- 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.txtexiste 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 emassemblyai_key.txtna 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.comdeve 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.
- Para falas não-inglesas, use um modelo que suporte o idioma da gravação; a partir de outubro de 2026, é
-
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.jsoneoverrides.jsonreferem-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_bashtem 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 --jpgpara baixa resolução,--scale 1 --jpgpara 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.QRCodeDetectorem quadros de alta resolução, resultados emqr.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>/_workcrianotes.jsone imprime os comprimentos das notas (<-- LONGOquando maior que 3700). - Limpeza leve:
- o dicionário de erros ASR
REPLno script: mantenha as substituições gerais, adicione as específicas do webinar; - palavras de preenchimento no início de uma frase (a lista
FILLno script) são removidas automaticamente; - corrija frases distorcidas linha por linha em
overrides.json("número da linha": "texto"ounull), 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.
- o dicionário de erros ASR
- 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.jsoncom 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.
- primeiro
Se pipeline/ não estiver disponível
Se a pasta pipeline/ estiver faltando ou vazia:
- Verifique se ela existe e tem conteúdo.
- Se não, informe ao usuário que os scripts estão faltando e peça para verificar a instalação da skill.