Editar um reel
Este é o fluxo já aprovado com o reel do WhatsApp (references/ejemplo-whatsapp.reel.json).
O objetivo é que o próximo reel saia igual sem que eu tenha que explicar novamente: mesmo estilo,
mesmos critérios, mesmas verificações. Fale com ele em português e sem jargão técnico desnecessário.
Antes de tudo: perfil e instalação
Leia ~/.claude/skills/editar-reel/perfil.json (nome do usuário, sua marca, o logo do encerramento e onde ele guarda
os clipes). Chame-o pelo nome e use a pasta de clipes dele na etapa 1.
Se perfil.json não existir, ou faltar alguma ferramenta do ambiente, é a primeira vez neste Mac: siga
INSTALAR.md (instalar tudo e criar o perfil) antes de editar qualquer coisa.
Ambiente (deixado pronto por install.sh, veja INSTALAR.md)
- HyperFrames CLI:
~/.npm-global/bin/hyperframes(telemetria desativada). Exporte semprePATH="$HOME/.npm-global/bin:$PATH" HYPERFRAMES_NO_TELEMETRY=1 HYPERFRAMES_SKIP_SKILLS=1; o shell do Claude não carrega~/.zshrc. - faster-whisper:
~/.venvs/whisper/bin/python(comav<16; a nova versão do PyAV quebra o faster-whisper). - FFmpeg em
/opt/homebrew/bin. Opython3do sistema (3.9) serve para os scripts sem numpy. - Biblioteca de efeitos sonoros:
~/Movies/Reels/_sfx/. Os 13 originais (whoosh_1/2, pop_1/2, tick, ding, message, counter, typing, clock, slide, hit, riser) tocam sozinhos com os gráficos; estilo "sons da Apple": curtos, limpos, suaves. Há ~45 mais (impactos, whooshes, caixa registradora, cliques, iPhone…) para usar manualmente: catálogo e quando usar cada um emreferences/sfx.md. - Scripts desta skill:
SK=~/.claude/skills/editar-reel/scripts. - Logo do encerramento: o de
perfil.json(cierre). O da vinagre.tech, vetorizado, está emassets/vinagre-tech/; o de outra marca fica emassets/marca/(vejaINSTALAR.md).
Estilos
O usuário pede os reels por estilo ("edite com o estilo 2"). Se não disser nenhum, use o estilo 1.
Todos compartilham o fluxo abaixo (transcrever, cortar, QA, sons, master); muda a etapa 5–6.
Todos terminam com o encerramento do logo da sua marca (o de perfil.json; 1,6 s, fundo branco, scripts/outro.py): o vídeo nunca
acaba de repente. Sai por padrão (exceto se "cierre": null no perfil); "outro": null em reel.json o remove, "outro": {"bg": "#000"} o altera.
| Estilo | O que é | Script | Referência |
|---|---|---|---|
| 1 · Cartão | Título com gráfico em cartão escuro no topo a cada 2–3 s + legenda pequena de uma linha embaixo. | build.py | references/ejemplo-whatsapp.reel.json |
| 2 · Frases | Frase grande embaixo em branco (o que vem, translúcido), palavra-chave em pílula, ícones em linha e flutuantes, poucos cartões brancos e planos de gráfico em tela cheia. | build_frases.py | references/estilo-frases.md |
| 3 · Cinema | Clipe horizontal em faixa de cinema 16:9 sobre preto (faixas limpas), cor quente, zoom lento, legendas pequenas em minúsculas dos dois lados do rosto, palavra final grande em maiúsculas. Para vídeos próximos ou emotivos. | cut_cine.py + build_cine.py | references/estilo-cine.md |
Movimento v2 (aprovado em 02-11-2026, padrão no estilo 1): regras de references/motion-regras.md
(títulos que rolam, números que rolam dígito a dígito, gráficos que chegam inteiros). Reels feitos antes
carregam "anim": 1 em seu reel.json para que um retoque não mude o movimento que já foi aprovado.
Os estilos 1 e 2 podem ter também planos motion em tela cheia (terminal do Mac, grade de pontos com
um número, órbita de cartões), em "motion" de reel.json: leia references/motion.md para saber quando e como.
Quando o usuário pedir mudanças em um estilo e as aprovar, salve-as no script e na ficha desse estilo.
Se ele quiser algo novo, crie um estilo novo (4, 5…) em vez de mudar um aprovado. Faça primeiro uma amostra de ~10 s
("sample_end" em reel.json, estilos 2 e 3) antes de montar o reel inteiro.
Estrutura de cada reel
~/Movies/Reels/<nome-curto>/
reel.json o próprio deste reel (você escreve; formato em references/reel-json.md)
work/ transcrições, cortes, quadros de QA, render intermediário
projeto/ projeto HyperFrames (index.html gerado + assets/)
reel-<nome>.mp4 o entregável
portada-<nome>.jpg a capa para Instagram (etapa 8b)
Fluxo
1. Localizar o clipe
Geralmente está na pasta clips de perfil.json (padrão ~/Movies/CapCut/) ou em suas subpastas. Se houver mais de um candidato e não estiver claro
qual é, pergunte com opções (nome, duração, data); editar o errado custa muito tempo.
Verifique com ffprobe resolução, fps e duração.
2. Transcrever
mkdir -p ~/Movies/Reels/<n>/work
~/.venvs/whisper/bin/python -I $SK/transcribe.py "<clip>" ~/Movies/Reels/<n>/work medium pt
Cria src.words.json (palavras com tempos), fillers.txt (passada que força Whisper a escrever "eh", "hmm",
"tipo"; normalmente ele as ignora) e silences.json. Leia as três coisas.
3. Decidir o que remover (critério seu)
- Tomadas repetidas: se ele repetir uma frase ou começar e cortar, fique com a última tomada e remova as anteriores.
- Muletas: as que aparecerem em
fillers.txte não na versão limpa. - Silêncios: não precisa marcá-los;
cut.pyremove os ≥0,2 s deixando 0,07 s de ar de cada lado. Anote os intervalos (tempo original) emremovedereel.json, junto comsource. Se não houver nada, coloque"remove": []e diga ("não havia muletas nem tomadas repetidas", se for o caso: você verificou, não assuma).
cd ~/Movies/Reels/<n> && hyperframes init projeto --example blank --resolution portrait --non-interactive
python3 -I $SK/cut.py ~/Movies/Reels/<n>
Cria o projeto HyperFrames (antes de cortar: init precisa que a pasta projeto não exista) e depois corta,
gera 1080×1920 a 30 fps e deixa a voz a -14 LUFS em projeto/assets/cut_norm.mp4; as palavras com tempos
novos ficam em work/cut.words.json.
4. Olhar o enquadramento
Extraia uma tira de quadros (ffmpeg -i projeto/assets/cut_norm.mp4 -vf "fps=1/5,scale=270:-1,tile=6x1" -frames:v 1 work/contact.png)
e localize o rosto: no reel de referência ele ia de ~520 a ~1160 px na vertical, com parede livre à direita.
O título vai acima da cabeça (cartão de 170 a 430 px), as legendas sobre a camiseta abaixo
do microfone de lapela, o logo da introdução na parede junto à cabeça. Se este clipe tiver outro enquadramento,
ajuste layout e a posição de logos em reel.json.
5. Escrever o conteúdo em reel.json
Leia references/reel-json.md e references/graficos.md. O que está decidido:
- Gancho (0–2 s): duas linhas grandes em MAIÚSCULAS, caixas amarelas com texto preto. Uma pergunta ou afirmação que resuma a dor que o vídeo apresenta, não uma frase literal. Visível desde o primeiro quadro.
- Títulos: 2–5 palavras, mudam a cada 2–3 s, resumem o que ele diz naquele trecho, cada um com seu gráfico animado.
- Logos: cada vez que ele nomear uma ferramenta ou marca, o logo real (Simple Icons; se não existir, o SVG oficial
do kit de imprensa dela em
projeto/assets/logos/<slug>.svg). Nunca um logo inventado ou aproximado. - Legendas: pequenas, uma linha, embaixo, palavra ativa na cor de destaque. Corrija em
fixesos erros do Whisper que você notar (nomes próprios, "um gente" → "um agente", etc.). - Planos motion (opcional, um ou dois por reel): quando ele disser que pede algo ao Claude ou explicar passos de uma
automação →
terminal; quando soltar um número →dots; quando fizer a conta do que ganha ou perde por ano →months; "olha tudo que montei" →orbit; clientes escrevem ou chegam mensagens →notify; ele diz um número de receita ou resultados →chart. Eles são desejados: dão respiro ao vídeo (ofereça um se não houver). Vejareferences/motion.md. Proponha-os apenas se contarem o que ele diz; se tiver dúvida, pergunte. - Chamada final: se ele pedir para escrever uma palavra ou nomear a marca, último bloco com
"graphic": "logo"e umdingemsfx_extraexatamente quando ele disser essa palavra. - Sons literais (opcional): quando ele disser algo com um som próprio (dinheiro →
cash, soltar o celular →iphone_lock, escrever uma mensagem →phone_typing), adicione emsfx_extranessa palavra. Leiareferences/sfx.md; um ou dois a cada 10 s no máximo, e memes apenas se ele pedir.
6. Preparar sons e gerar a composição
python3 -I $SK/prep_sfx.py ~/Movies/Reels/_sfx ~/Movies/Reels/<n>/projeto/assets/sfx
python3 -I $SK/build.py ~/Movies/Reels/<n>
cd ~/Movies/Reels/<n>/projeto && hyperframes lint
prep_sfx remove o silêncio inicial de cada som (senão ele toca atrasado em relação à animação), corta os longos
com fade e os equaliza a -3 dBFS de pico. O riser é cortado para terminar em seu ponto alto
(0,2–2,0 s do arquivo atual); se o arquivo mudar, veja sua envoltória e ajuste SPEC.
Em lint são esperados e ignorados: nested_structure_needs_subcomposition e timeline_track_too_dense.
Qualquer erro, ou um aviso de outro tipo, deve ser corrigido.
7. Controle de qualidade de quadros (antes de renderizar, sempre)
Extraia um quadro de cada bloco, no meio do bloco quando a animação já tiver terminado:
hyperframes snapshot --at <gancho≈1.0>,<cada bloco: start+1.3>,... --no-end --describe false -o ../qa
Monte-os em uma folha (ffmpeg -pattern_type glob -i 'qa/frame-*.png' -vf "scale=360:-1,tile=6x2" ...), olhe-os
e amplie as áreas duvidosas (recortes em tamanho real do cartão e das legendas). Procure e corrija:
- texto cortado ou saindo do cartão / uma palavra sozinha em uma linha;
- algo sobre o rosto (em qualquer bloco, também com o zoom de 1,08 dos cortes);
- pouco contraste (texto claro sobre parede branca → precisa de fundo escuro);
- legendas tampando o microfone de lapela ou o logo da camiseta de forma feia;
- um gráfico que não se entenda ou pareça estranho (aconteceu com o primeiro
head: foi refeito). Repita o snapshot a cada correção. Mãos passando na frente das legendas não podem ser evitadas; não é um defeito.
Comparar com o ouro. references/oro/ tem a folha de 12 quadros dos reels aprovados de cada estilo
(estilo1-whatsapp, estilo1-18k, estilo2-fras, estilo3-reto40). Após o render (etapa 8) extraia a do novo reel
com python3 -I $SK/hoja.py <reel>.mp4 work/hoja.png, coloque ao lado da do seu estilo e responda: qual das duas
está mais vazia, mais plana ou com os gráficos menores? Se for a nova, isso é o primeiro a ser corrigido.
Quando o usuário aprovar um reel que pareça melhor que o ouro do seu estilo, adicione a folha dele a references/oro/.
8. Renderizar, verificar o áudio e masterizar
hyperframes render --fps 30 -o ../work/render_mix.mp4
~/.venvs/whisper/bin/python -I $SK/measure_sfx.py ~/Movies/Reels/<n> ~/Movies/Reels/<n>/work/render_mix.mp4
python3 -I $SK/master.py ~/Movies/Reels/<n>/work/render_mix.mp4 ~/Movies/Reels/<n>/reel-<n>.mp4
measure_sfxinforma o volume de cada efeito em relação à voz. Objetivo: golpe -6 dB, ding -8, message ≈-8, pop/whoosh/slide -11 a -13, tick -14, relógio/contador/riser -16, teclado -18 a -20. Se algum desviar mais de 2 dB (por exemplo, porque um arquivo de_sfxmudou), corrija comsfx_vole renderize novamente. Um efeito soar mais alto que a voz é o erro grave: ele abafa o que é dito.master.pyleva o reel a -14 LUFS (pico -1,5 dB) copiando o vídeo sem alterá-lo. É necessário porque o mixer do HyperFrames reduz o mix em ~1,8 dB, deixando-o em ~-16 LUFS.- Verifique o entregável: 1080×1920, 30 fps, duração esperada, -14 LUFS.
8b. Capa
python3 -I $SK/cover.py ~/Movies/Reels/<n>
Quadro limpo do vídeo com o gancho em caixas amarelas, centralizado na faixa que o Instagram mostra na
grade do perfil (3:4), para que no feed se leia sobre o que é cada vídeo. Gera portada-<n>.jpg e
work/portada-feed.png (como ficará recortada). Vai com o título no centro
(decidido em 02-11-2026, mesmo que cubra parte do rosto; no vídeo o gancho continua no topo, acima da cabeça).
Olhe-a: o quadro ("cover": {"at"}) precisa ter boa expressão e nada cortado. "cover": {"y"} ou
python3 -I $SK/cover.py <reel> 560 apenas se ele pedir outra altura. O usuário a envia ao publicar
em "Editar capa → Adicionar do rolo da câmera".
9. Entregar
Diga a ele onde estão o .mp4 e a capa, e resuma em poucas linhas: quanto foi cortado (de X s para Y s e o que foi removido), o gancho,
os títulos (ou os mais representativos), quais logos aparecem, quais correções de legenda você fez e o que corrigiu no
controle de qualidade. Se algo for uma decisão sua discutível (por exemplo, o gancho é um resumo, não uma frase literal),
diga e ofereça mudar.
10. Limpar (apenas quando o usuário aprovar o reel)
Cada reel deixa ~150 MB de intermediários e o disco geralmente está cheio. Quando ele confirmar que o reel está bom (não antes:
enquanto ele retoca, você precisa deles), mova para a Lixeira (~/.Trash/reel-<n>-intermedios-<data>/, nunca rm:
assim ele pode recuperá-los) tudo o que for regenerável:
work/*.mp4, work/*.mov, work/*.png, qa/, versões descartadas do reel, quaisquer assets/*.mp4 que
index.html não usa mais e os assets/sfx/*.wav que index.html não nomeia (prep_sfx copia toda a biblioteca, ~15 MB;
se um retoque precisar de outro som, ele é executado novamente). Conserve reel.json, work/*.json, projeto/ (com assets/cut_norm.mp4 e sfx/)
e o .mp4 final: com isso dá para retocar sem precisar cortar novamente. Diga a ele quanto ocupou o que foi movido e que o espaço é liberado ao
esvaziar a Lixeira. Se cut_norm.mp4 faltar ao retocar, cut.py o regenera a partir do clipe original (se ele ainda estiver no CapCut).
Música
Não coloque música no vídeo. O usuário adiciona a música ao publicar no Instagram.