Communitygithub.com

ThomasHMD/overlays

Adiciona sobreposições gráficas sincronizadas com a voz a vídeos de apresentador (tutoriais, vídeos editoriais, reels): terços inferiores, citações em tela cheia, cartões de capítulo, cenas animadas (números, listas, linhas do tempo, documentos, e-mails, GIFs), fotos de ilustração, b-rolls, demonstrações de sites gravadas automaticamente e efeitos sonoros.

O que é overlays?

Este skill permite criar e editar sobreposições gráficas sincronizadas com a fala diretamente no Adobe Premiere Pro. Ele funciona em conjunto com um skill complementar de motion design (`motion-design`), que contém componentes Remotion reutilizáveis para animações. O fluxo de trabalho é rigoroso: primeiro, o editor finaliza o corte bruto no Premiere; só então o skill gera um plano de sobreposições baseado na transcrição do vídeo. As sobreposições incluem terços inferiores para nomes, obras e lugares; citações em tela cheia; cartões de capítulo; cenas animadas (números, listas, documentos, e-mails); fotos e b-rolls; GIFs de humor; e efeitos sonoros. O skill também gerencia a captura de demos de sites (screencast) e a renderização de segmentos individuais, gerando um arquivo XML que é importado no Premiere. As regras editoriais enfatizam que os gráficos não devem recontar o que foi dito, mas sim ancorar informações que seriam apenas sentidas, ou mostrar visualmente o que está sendo discutido. O skill depende de scripts Python para extrair timestamps da transcrição, garantir sincronia exata com a palavra falada e evitar desvios causados por edições no Premiere após o corte bruto. Suporta vídeos verticais (9:16) para reels e mantém um catálogo de componentes de sobreposição com durações predefinidas.

Funciona com✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/ThomasHMD/premiere-rough-cut/tree/HEAD/skills/overlays

Perguntar na sua IA favorita

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

Documentação

overlays: gráficos sincronizados com a voz, colocados no Premiere

Duas habilidades, uma oficina

Aqui (overlays): colocar e editarOficina (motion-design): fazer
transcrição, linha do tempo do .prproj, plano escrito como âncoras de fraseso ÚNICO projeto Remotion: motion-design/src/, composições de sobreposição em src/illustration/ (BrandedVideo, LowerThirdTrack, Screencast, Scene, FondAnime)
fornecimento: fotos, b-rolls, GIFs (gifs.py), capturas da web, cartões de e-mail (mail-cards.py)public/: fontes, scenes/<video>/ (mídia de cena), sfx/ (sons)
gravação de demonstrações de sites (screencast-record.py)tema (src/illustration/theme.ts), paleta de sons (reference/sound-palette.md, scripts/make-sfx.py, scripts/son.py)
render-segments.py, screencast-render.py, montage-tella.py: iniciar a renderização DENTRO da oficina, depois colocar tudo no XML do Premieremúsica, mix

As duas pastas devem ser vizinhas (<skills>/overlays e <skills>/motion-design): os scripts encontram a oficina através de ../motion-design. Um novo componente de cena é escrito em motion-design/src/illustration/scenes/; um novo som vai para as receitas de sintetizador da oficina. Instalação (uma vez por máquina, instalação do plugin): bash "${CLAUDE_PLUGIN_ROOT}/install.sh" --data "${CLAUDE_PLUGIN_DATA}". Manualmente, com as quatro pastas de habilidades copiadas lado a lado: bash install.sh da raiz do kit. Após uma atualização do plugin, o link node_modules da oficina é perdido: execute novamente a linha de configuração. Detalhes: INSTALL.md do kit.

Regra de ouro editorial (configuração padrão, adapte ao canal)

O vídeo é conduzido pela voz. Os gráficos não recontam o que foi dito: eles ancoram o que, de outra forma, seria apenas sentido (um nome próprio, uma citação, um lugar, um título, um número), ou eles MOSTRAM o que está sendo falado (um documento, um site, um diagrama).

Dois níveis de vestimenta:

  • leve: 1 destaque por capítulo + 1 terço inferior a cada 45 a 60 s, fora da introdução (0-30 s) e da conclusão;
  • denso (vídeo de demonstração, investigação ou tutorial): cenas animadas sobre 60 a 70% da imagem, cada cena sincronizada com as palavras, nenhuma cena sem movimento por mais de 3 s. O apresentador mantém seu lugar.

Pergunte pelo nível desejado se não for dito. Não anime por padrão: a introdução (os espectadores decidem se ficam), uma anedota íntima (a animação mata a emoção), uma pergunta que cria suspense, a conclusão e a chamada para ação, uma lista de adjetivos.

Um desvio do roteiro que foi dito em câmera (um número, um termo, uma aproximação) é corrigido NA TELA: o corte bruto sinaliza isso em seu relatório, o plano coloca o valor correto na voz, sem pedir uma nova tomada.

Regra zero: a linha do tempo de referência é a do projeto do Premiere, nunca a do corte bruto

A ordem é SEMPRE: corte bruto (rough-cut) -> o editor revisa e altera a edição no Premiere -> sobreposições. Entre os dois, os cortes mudam, os clipes são descartados, a duração muda: os tempos computados no corte bruto chegam 30 s a 1 min de diferença e os elementos terminam após o final do vídeo.

Pare forçadamente após o corte bruto, mesmo que o usuário tenha dito "corte bruto e depois sobreposições, fica a seu critério": entregue o XML do corte bruto, depois aguarde até que o usuário diga que o validou no Premiere. Antes disso, nenhum plano, nenhum tempo, nenhum posicionamento. Apenas o que não depende de tempo pode prosseguir (fornecimento de imagens e GIFs).

python3 scripts/timeline-from-prproj.py "/caminho/clipe.MOV" --list              # quais sequências carregam o clipe
python3 scripts/timeline-from-prproj.py "/caminho/clipe.MOV" --sequence "Derush_v1"
# -> <clipe>_transcription.json (palavras no tempo da SEQUÊNCIA) + <clipe>_timeline.json (mapa clipe -> sequência)

Ele lê os clipes da filmagem na sequência escolhida (ticks = 254016000000/s) e carrega as palavras de <clipe>_Derush_vN_work/words_premiere.json (a transcrição do projeto, já realinhada pelo corte bruto). Várias sequências carregam o clipe: ele se recusa a adivinhar (código 2), pergunte qual. Vários clipes em uma sequência: passe todos eles, em ordem (A.MOV B.MOV --sequence "..."); cada entrada da linha do tempo e cada palavra carrega media, e as saídas recebem o nome do primeiro clipe. Uma palavra cortada rente permanece se COMEÇAR no clipe (pelo menos 80 ms antes do corte); uma palavra realmente cortada quebra a âncora que a aponta: mova a âncora para a palavra anterior + offset. Verifique se o último elemento colocado permanece antes do final real da sequência.

Nunca reutilize um cuts_final.json ou um mapa do corte bruto. Sem um projeto do Premiere (apenas clipe): python3 scripts/transcribe.py "/caminho/clipe.mp4" (whisper.cpp local, cerca de 5 min para 15 min de filmagem no Apple Silicon).

Quando o usuário devolver a edição, execute a comparação primeiro: as alterações que ele fez no Premiere são o feedback mais confiável. Compare a sequência dele com o XML do corte bruto, transforme cada lacuna recorrente em uma correção, uma verificação ou uma regra, e só então escreva o plano de sobreposições. Quando o usuário validar a edição final, faça o mesmo com o XML de sobreposição entregue: o que ele removeu, moveu (mais de 2 quadros), redimensionou ou adicionou (a própria filmagem colada em V1 não conta) se torna uma correção, uma verificação ou uma regra. Nada removido ou movido significa que o método dessa entrega está correto: mantenha-o.

Pipeline

0. (Opcional) b-rolls

Uma pasta Brolls/ ao lado do clipe, arquivos nomeados NN_descrição_K.mp4 (número, descrição, variante):

python3 scripts/match-brolls.py "/caminho/clipe.mp4"     # -> <clipe>_broll-script.json para completar

Para cada b-roll: a variante (file), o tempo (timecode MM:SS, verificado na transcrição), durationSec (null = duração nativa). Colocado na V2. Execute ANTES das demonstrações do site (--force sobrescreve o arquivo). Veja um contato das variantes antes de escolher (3 quadros por variante): um nome de arquivo muitas vezes mente ("street-photography-portrait" era um drone shot de uma cidade à noite). Nunca coloque um b-roll em uma frase que o falante não mostra literalmente, e nenhum som de sobreposição enquanto um b-roll toca.

0 bis. (Opcional) fotos de ilustração

Para um vídeo que cita pessoas, obras, livros, lugares:

  1. Manifesto a partir do roteiro do vídeo: entidades em ordem de aparição -> illustrations-manifest.json:
    {"version": 1, "dest": "Illustrations", "items": [
      {"n": 1, "categorie": "reference", "nom": "Primeiro Último", "sujet": "portrait", "url": "https://...", "fallback_urls": [], "note": "fonte: ..."}]}
    
    O roteiro de referência pode estar em qualquer formato (texto, Markdown, um documento): ele fornece a ortografia correta e as coisas a mostrar.
  2. URLs: fontes gratuitas primeiro (Wikimedia Commons, sites oficiais, museus de acesso aberto), depois python3 scripts/serp_images.py "Nome Título" --num 5 --min-width 1200 (Google Images via SerpAPI, chave SERPAPI_API_KEY). Verifique se a imagem é a correta (olhe a miniatura, não apenas o título da página; páginas de lote de leilão são uma armadilha). Verifique os direitos se o vídeo for vendido.
  3. Download: python3 scripts/source-illustrations.py illustrations-manifest.json -> Illustrations/NN-categoria-nome-assunto.ext (bytes verificados, largura medida; saída 1 se as URLs estiverem faltando).
  4. Tempo: python3 scripts/match-photos.py "/caminho/clipe.mp4" -> <clipe>_photos-script.json, tempos pré-preenchidos por uma busca difusa do nome na transcrição (o reconhecimento de fala distorce nomes próprios). SEMPRE verifique novamente cada tempo manualmente com a transcrição (a correspondência difusa pode pegar uma menção tardia em vez da primeira); enabled: false descarta uma foto. As fotos vão na V3, com prioridade sobre os b-rolls (um b-roll que se sobrepõe a uma foto é removido do XML e registrado).

Tratamento de fotos: nunca corte (proporção nativa, uma vertical permanece vertical); uma foto fica em um fundo liso com margem em todos os quatro lados (cerca de 86% do quadro), não um contain de tela cheia que toca as bordas superior e inferior. Sem .webp no manifesto (o Premiere lê como mídia de comprimento zero no XML: converta com sips -s format jpeg). Uma foto com menos de 800 px de largura parecerá suave: render-segments.py imprime um aviso de BAIXA RESOLUÇÃO, liste-as antes de entregar. Uma capa de livro mostrada por uma cena é o visual do editor retirado da web (site deles, um mockup HD), nunca uma imagem extraída da própria filmagem do falante.

Quando o falante MOSTRA um objeto, nada o cobre. Escaneie a transcrição por "aqui", "como você pode ver aqui", "este", "olhe" perto da menção de uma obra: o falante está segurando o livro ou câmera para a lente. Nenhuma foto em tela cheia nessa janela (um editor removeu todas essas capas em uma edição entregue); a capa vai antes ou depois da demonstração, ou nem vai.

0 ter. GIFs e memes (um básico, não uma opção)

Um GIF a cada 2 a 4 min, em momentos de humor ou autodepreciação ("isso força muito", "estou inventando tudo"), nunca na introdução, nunca para ilustrar uma frase técnica literalmente. Uma cena gif (sobreposição, moldura branca, looping) que chega na palavra, com seu efeito sonoro.

python3 scripts/gifs.py chercher "isso é um bug" --planche gifs-sheet.jpg   # lista + contato numerado
python3 scripts/gifs.py prendre <id> --nom bug --public <video>            # fonte MP4 + dados da cena

Olhe o contato ANTES de escolher (um título do GIPHY não diz o que é mostrado; pesquisar em inglês geralmente funciona melhor). prendre baixa o MP4 (nunca o .gif) em Illustrations/gifs/, mantém gifs.json (fonte de cada GIF), copia para motion-design/public/scenes/<video>/gifs/ e imprime os data da cena gif (src, srcW, srcH, loopSec). Chave GIPHY_API_KEY (gratuita). Um GIF muitas vezes reutiliza uma obra protegida: em um vídeo vendido, abstenha-se.

1. Taxa de quadros e formato do clipe (CRÍTICO)

ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate,width,height -of csv=p=0 "/caminho/clipe.mp4"

render-segments.py lê a taxa e o tamanho do clipe quando o JSON não os fornece. Um JSON a 30 em um clipe a 60 desloca tudo por um fator de 2. A 29,97, n quadros de sequência duram n x 1.001 / 30 s, e cada renderização deve cobrir seu clipe (tailFrames e o componente TenirFin cuidam disso). Um clipe é escrito na taxa de sua MÍDIA: o Premiere lê <in> a 29,97 (a taxa do <file>), não na taxa do <rate> do clipe; o script escreve in = round(t x fps x 1000/1001) com <ntsc>TRUE.

Vertical 9:16 (reel): mesmo pipeline, mesmo JSON. O terço inferior detecta vertical e sobe acima da zona de legenda; as fotos permanecem inteiras (uma faixa no fundo); um b-roll 16:9 ganha uma escala que preenche a largura. Regras para reel (a partir da comparação de entregas com a edição final): fotos de 2 a 3 s (padrão 2,5), terço inferior enquanto sua foto de retrato associada e começando com ela, sem b-roll de banco a menos que solicitado, sem cobertura enquanto o falante mostra o objeto. Sempre renderize UM terço inferior como still e componha em um quadro cinza para verificar o layout vertical antes da série.

2. Leia antes de propor

Leia a transcrição INTEIRA. Identifique: nomes de pessoas (terço inferior "nom"), títulos de obras ("oeuvre"), lugares ("lieu"), termos ou movimentos ("term"), citações fortes (destaque quote-full), anúncios de uma parte (section-title ou cartão de capítulo), números marcantes (cena stat), documentos, trocas e sites que são mencionados (cenas de prova, demonstrações). Cada nome, obra ou livro citado é MOSTRADO em algum lugar (uma cena suspensa, uma foto, um cartão) ou a razão pela qual não é está escrita. Leia o conteúdo de cada diagrama nas PALAVRAS DO PRÓPRIO FALANTE (releia na transcrição), nunca uma interpretação: um diagrama errado (um perfil colocado no nível errado de um funil) vem de uma paráfrase.

3. Cada destaque é concebido em uma frase

"O que quero ver: a frase grande, em itálico, uma régua de acento à esquerda, a atribuição pequena." Se a descrição for "texto que aparece", não é um destaque: terço inferior, ou nada.

4. Catálogo base

TipoComponente / tipoFaixaDadosDuração
motion (destaque tela cheia)quote-fullV5 opacotext, author?, source?10-14 s
lower-thirdlower-third-nomV6 alfaname, years?, tag?6 s
lower-thirdlower-third-oeuvreV6title, author, year?6 s
lower-thirdlower-third-lieuV6place, date6 s
lower-thirdlower-third-termV6term, subtitle?6 s
section-titleV6eyebrow?, title4 s
sceneveja "Cenas animadas"V5 / V6 / V7data, cuessegue a voz

Um nome e sua obra citados dentro de 10 s: um único terço inferior "nom" com a obra em tag. Uma citação pelo próprio falante: quote-full sem author (a voz dele assina). As animações terminam com um fade-out automático nos últimos 18 quadros.

5. Tempos na palavra (CRÍTICO)

Nunca uma estimativa: procure a palavra em <clipe>_transcription.json e pegue seu start. O elemento aparece no início da palavra (um terço inferior pode precedê-lo em no máximo 0,5 s; sincronizar no início da FRASE soa como um anúncio que chega cedo). render-segments.py recusa um segmento sem um tempo válido e verifica cada tempo com a transcrição (OK / WARN / UNKNOWN). Verifique também a taxa de quadros no JSON (passo 1).

6. Apresente o plano antes de escrever

| # | Tempo | Dur  | Tipo        | Componente         | Por quê                            |
|---|-------|------|-------------|--------------------|------------------------------------|
| 1 | 01:24 | 6 s  | lower-third | lower-third-nom    | 1ª menção de Primeiro Último       |
| 2 | 02:14 | 12 s | motion      | quote-full         | citação central da parte 1         |

Aguarde aprovação antes de escrever o JSON e renderizar.

7. Renderizar e importar

(cd ../motion-design && npm ci)                                   # uma vez
python3 scripts/render-segments.py "/caminho/clipe.mp4"          # tudo: renderizações + XML
python3 scripts/render-segments.py "/caminho/clipe.mp4" --lower-thirds-only
python3 s

[truncado para tradução]

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

Habilidades Relacionadas