Edição com motion graphics + interface de edição
Fale com o usuário no idioma dele. Escreva as legendas exatamente como o palestrante disse (nunca parafraseie).
Caminhos: ME = esta pasta da skill, W = uma pasta de projeto por vídeo. Todos os scripts são bash/python/node; scripts/env.sh encontra ffmpeg, node, python, Chrome e o motor integrado (engine/). Primeira vez: veja README.md → Instalação (npm install na pasta da skill, pip install -r requirements.txt).
Regras (innegociáveis)
- Apenas logotipos oficiais para qualquer marca mencionada — nunca um ícone "inspirado" redesenhado. Obtenha do site da marca (
capture_site.js) ou pergunte ao usuário. - Identidade visual: para um cliente, leia cores, fontes e logotipo do site dele (
captures/info.json) e escreva a paleta no topo departs/top.js. Para vídeos do próprio usuário, pergunte pela identidade uma vez e mantenha emtheme.json+top.js. - Capturas de site: capture o site do cliente (páginas completas, desktop + mobile) e use-as em painéis (navegador com rolagem, ilustrações oficiais recortadas). Banners de cookies são ocultados, nunca aceitos. Telas de produto logado não são acessíveis: avise e ofereça integrar capturas de tela fornecidas pelo usuário.
- Ritmo: tela cheia ↔ painéis (zoom OUT ao entrar, zoom IN ao sair), punch-ins em palavras fortes (~1 a cada 2-3 s), exatamente um momento de assinatura (revelação do logotipo/nome), música de fundo com volume reduzido sob a voz, efeitos sonoros (whoosh em cada zoom, pops, cliques, digitação, impacto na revelação), flash de luz em cortes abruptos.
- Anúncios pagos: nada importante nos 14% superiores (y < 270) nem abaixo de y ≈ 1250 (UI do Reels/TikTok); legendas elevadas (
CAPDY); sem legendas dentro de painéis (o painel mostra as palavras como títulos); card final = logotipo da marca + URL + as palavras do palestrante; nenhuma alegação ou número inventado. - Legendas nunca sobre o rosto. Idiomas LTR →
"sens": "ltr"emprojet.json(o build corrige a ordem das palavras); RTL (árabe) →"rtl". Nome da marca como uma pílula (fx: "pill", cores emprojet.json → pill). - Mixagem: o usuário define voz / música / efeitos no editor. Padrões: voz 100%, música 46%, efeitos 36%. Sempre normalize o loudness para -14 LUFS.
- Toda animação é um ELEMENTO do registro (veja abaixo) para que o usuário possa selecionar, deslocar, ocultar e comentar. Nenhuma animação fora do registro.
- Âncoras: todo
wS(card, palavra)deve apontar para a palavra que a animação ilustra — executescripts/ancres.pye leia a tabela; nunca adivinhe um índice.
Fluxo de trabalho
- Preparar:
bash $ME/scripts/preparer.sh <video> <W> <lang> "<Whisper prompt: nomes próprios>"→ fonte copiada, corte full-frame, quadros, cortes prováveis, transcrição palavra por palavra. Em seguida, o recorte da pessoa no fundo (~1 s/quadro; não execute Whisper ao mesmo tempo — RAM):python $ME/engine/mask.py u2net_human_seg <W> && python $ME/engine/make_head.py <W>. - Cliente (se houver):
node $ME/scripts/capture_site.js <url> <W>→captures/,assets/logo-*.png, cores/fontes. Olhe as capturas; recorte recursos visuais úteis emW/assets/(ilustrações, uma página longa para navegador com rolagem). - Legendas: escreva
W/cartes.json(palavras exatas + tempos do Whisper; cards de 2 a 5 palavras;hot,fx) →python $ME/scripts/cartes.py <W>. Modelo:templates/cartes.EXAMPLE.json. - Plano de edição: divida o roteiro em momentos (gancho, problema, produto, prova, CTA…), escolha para cada um: tela cheia ou painel, qual objeto concreto mostrar, um momento de assinatura, sons. Escreva
W/plan-montage.md(modelotemplates/plan.EXAMPLE.md) e mostre-o brevemente ao usuário antes de animar. - projet.json (modelo
templates/projet.EXAMPLE.json):nom,titre,langue,sens,outro,vol,musique_gain,pill,coupes,cadrage(tomadas que vão para um painel → janela de medição),cadrage_forcese a máscara capturar o fundo. Em seguida,python $ME/scripts/framing.py <W>. - Cenas em
W/parts/:top.js←templates/top.EXAMPLE.js(paleta,CUTS/SEGB,PANELS, zoomsZP,CAPDY);primitives.js←templates/primitives.js;gfx.js←templates/gfx.EXAMPLE.js(SCENES_ED, umEL(...)por animação, camadas, card final, fontes). - Sons:
W/sons.json(modelotemplates/sons.EXAMPLE.json):musique{bpm, intro_filtree, coupure = silêncio antes de uma revelação, accords} eevents=[element|null, time|"fim+x", "sound[:param]", gain, [repeat, step]]. Sons: pop, bulle, clic, shutter, succes, buzz, tick, touche, impact, tape, whoosh_in:dur, whoosh_out:dur, ding:freq:dur, shimmer:dur, riser:dur, souffle:dur. Vincule cada som ao seu elemento para que ele acompanhe quando o elemento for deslocado ou ocultado. - Âncoras:
python $ME/scripts/ancres.py <W>. - Pré-visualizações:
python $ME/scripts/build.py <W>entãonode $ME/engine/04_render_frames.js <W> preview t1 t2 …→ folha de contato → revise como um editor exigente (legível? rosto claro? zonas seguras de anúncio?) e corrija antes da renderização. - Renderizar:
bash $ME/scripts/rendu.sh <W>(segundo plano, 3-6 min) →<nom>.mp4(+.srt/.txt), stems emmixage/pistes/, mídia do editor. Verifique 6-8 quadros do MP4, -14 LUFS, tamanho. - Editor: execute
python $ME/scripts/editor_server.py <W> <port>(no Claude Code desktop: adicione a.claude/launch.jsone use a ferramenta de pré-visualização), abrahttp://localhost:<port>/editeur/. Verifique a pré-visualização, a seleção por clique e a reprodução. - Monitorar comentários: monitore
W/comments.jsone emita uma linha por novo comentário comstatus == "à faire"(comando emreferences/editor.md).
Processando um comentário
- Leia-o (
target=el:<id>|scene:<id>|cap:<n>|audio:<track>,t, cliquex,y). - Defina o status "en cours":
POST /api/comments/status {"id":…, "status":"en cours"}. - Altere o elemento em
parts/gfx.js(outop.jspara zooms/painéis,cartes.jsonpara legendas,sons.jsonpara sons), mantendo-se dentro da identidade visual e do registro. Se o pedido for vago, aplique a melhor opção e mencione uma alternativa na resposta. python $ME/scripts/build.py <W>(+sons.pyse os sons mudarem) → o editor recarrega a pré-visualização sozinho. Verifique 1-2 quadros da pré-visualização.- Status "fait" + um breve
reply(o que mudou) — exibido no editor. Lembre ao usuário que ele pode clicar em "Renderizar o vídeo". - Uma preferência geral ("Nunca quero X") → adicione-a às Regras deste arquivo.
Registro de elementos (contrato com o editor)
EL(id, name, scene, layer, [x,y,w,h], ()=>[start,end], t=>{…desenhar…})
layer:'panel'(desenhado dentro do painel, atrás da cabeça saindo) ·'full'(tela cheia, na frente) ·'none'(global: flashes, card final).trecebido = tempo deslocado pelo editor (EDITS.off); desenhe apenas dentro da sua janela; oculto seEDITS.hide[id].- A caixa
[x,y,w,h]é usada para clicar na pré-visualização: mantenha-a precisa. SCENES_ED= cenas listadas à esquerda do editor (id,label,a,b,kind).- Zooms: cada entrada
ZPé um elementozoom<i>(pode ser removido no editor).
Arquivos do projeto
projet.json · cartes.json → caps.json (caps.orig.json = base do editor) · sons.json · parts/{top,primitives,gfx}.js · framing.js · edits.json (configurações do editor: off, hide, caps, vol) · comments.json · captures/, assets/ · mixage/pistes/ · editeur/ · <nom>.mp4/.srt/.txt.