Legendar um vídeo
O usuário fornece um vídeo com uma pessoa falando. Ele escolhe a partir do catálogo de estilos de legenda, que é pré-visualizado no próprio vídeo, e você entrega o MP4 legendado. Tudo é executado localmente com HyperFrames. After Effects nunca é necessário.
Kit: .claude/skills/caption-video/kit/ dentro do repositório do estúdio. Os projetos são criados em
videos/captions/<nome>/ e os vídeos finalizados vão para out/captions/<nome>.mp4 (ambos relativos à raiz do estúdio).
A partir da raiz do estúdio, defina K="$PWD/.claude/skills/caption-video/kit" e execute python3 "$K/caption.py" …
(use aspas nos caminhos; as pastas podem conter espaços). Use o python do venv do estúdio (.venv/bin/python) se numpy/scipy
estiverem faltando no python do sistema — setup/setup.sh o cria.
Fluxo
1. Obter o vídeo
Se nenhum caminho de vídeo foi fornecido, peça um. Verifique se ele existe e tem uma pessoa falando. Execute:
python3 "$K/caption.py" new "<caminho do vídeo>" <nome-curto>
Isso copia o vídeo, o recodifica para H.264 e o transcreve palavra por palavra com WhisperX. A primeira execução em um tempo pode levar um minuto. Vídeos longos levam aproximadamente o tempo real ÷ 4.
2. Mostrar a transcrição
Imprima a transcrição da saída do comando em um bloco legível. Aponte quaisquer erros prováveis,
especialmente nomes de marcas e jargões (nomes de produtos, "HyperFrames", siglas), e peça ao usuário
para confirmar ou corrigi-los. As correções vão em --fix "errado=correto,…" no momento da construção. Se a
transcrição parecer sem sentido, ou o áudio não tiver fala, pare e avise. Não legende palavras inventadas.
3. Mostrar todos os estilos no vídeo do usuário
Execute python3 "$K/caption.py" styles para a lista e python3 "$K/caption.py" preview <nome> para a
folha visual. A folha está em videos/captions/<nome>/previews/styles.png. Observe-a você mesmo,
depois envie-a com SendUserFile (exibição render). Ao lado, forneça a lista numerada com a linha
"melhor para" de cada estilo:
- Lime Hook: o visual padrão (Anton em maiúsculas, palavra falada em verde-limão)
- Karaoke Pop: grandes explosões de 2 palavras, palavra falada em amarelo
- One Word: uma palavra gigante de cada vez
- Clean Box: texto escuro em um cartão branco, marcador na palavra falada
- Editorial: frase calma em minúsculas, palavras-chave em itálico com serifa
- Subtitle: legendas pequenas de frase completa
- Neon: brilho ciano na palavra falada
Recomende um em uma única linha com base no conteúdo: hype ou social → 1 ou 2, explicativo ou anúncio → 4,
história de fundador ou premium → 5, entrevista ou podcast → 6, tecnologia ou IA → 7. Em seguida, peça para
eles escolherem um número. Se o catálogo em caption.py tiver mudado, liste o que styles imprime em vez desta cópia.
4. Gancho (opcional)
Sugira 3 ganchos retirados do que o falante realmente diz. Comece com o número, resultado ou contradição
mais surpreendente, use de 4 a 8 palavras e mantenha o payoff em uma única palavra grande. Formate cada um com
a sintaxe de gancho, depois pergunte com AskUserQuestion: três opções de gancho mais "Sem gancho" (o usuário também pode
digitar o seu próprio).
A sintaxe do gancho usa uma linha por |, cada uma começando com seu estilo:
s:introdução em itálico com serifa ("Como", "Por que")c:configuração em maiúsculas condensadas brancasb:a grande palavra de payoff circulada (1–2 palavras)l:reviravolta em maiúsculas verde-limãor:pequena etiqueta em itálico
Exemplo: s:Como|c:Eu alcancei|b:300k+|l:sem anúncios|r:visualizações. O gancho deve corresponder ao que o vídeo
entrega nos primeiros 10 segundos.
4b. Polimento (ofereça; execute quando pedirem correção de cor, áudio mais limpo, corte ou música)
python3 "$K/polish.py" <nome> [--grade clean|cinematic|none] [--music calm|none] [--music-level 1.0] [--denoise 100]
- Corte: remove silêncio antes da primeira palavra e depois da última (mantém 0,3 s e 0,9 s), e ajusta a transcrição para corresponder.
- Correção de cor:
clean(padrão) dá pele quente e saudável, contraste suave e uma vinheta sutil.cinematicé mais profundo e frio. Antes de escolher, compare um quadro de cada um com o original e observe. - Voz: remoção de ruído DeepFilterNet3 (
~/.venvs/dfn, criado por setup.sh; nunca instale globalmente, precisa de numpy<2), em seguida, um passa-altas, realce de presença, de-esser e compressão suave. - Música: uma base sintetizada de piano calmo e pad. No nível 1, fica cerca de 20 dB abaixo da voz nas
pausas e cerca de 25 dB abaixo enquanto falam. Use
--music-level 0.6para mais silencioso ou1.5para mais presente. - Os originais são mantidos como
source_orig.mp4/transcript_orig.json, então o polimento pode ser executado novamente com quaisquer configurações. Após o polimento, executebuilderendernovamente. - Mencione quaisquer tropeços ou falsos começos na abertura ("no presente, no momento…"). Cortá-los causa um pequeno corte brusco, então pergunte antes de fazê-lo.
5. Construir, verificar, renderizar
python3 "$K/caption.py" build <nome> --style <chave> [--hook "…"] [--hot "palavra,palavra"] [--fix "a=b"]
cd "videos/captions/<nome>" && npx --yes [email protected] check
python3 "$K/caption.py" render <nome>
--hotlista palavras que permanecem na cor de destaque. Escolha 2 a 5 palavras de payoff; números são automaticamente marcados como quentes.checkavisos de contraste no momento de desaparecimento do gancho são esperados. Corrija quaisquer erros reais antes de renderizar.- Antes de renderizar um gancho, tire um snapshot (
npx --yes [email protected] snapshot . --at 1.6 --no-end --describe false) e verifique se ele não cobre o rosto. Quando o rosto estiver no alto do quadro (sentado ou plano médio), mova o gancho para o peito com--hook-y 0.43; o sombreamento o segue automaticamente. - Antes de enviar, extraia 3 a 4 quadros de
out/captions/<nome>.mp4e observe-os. As legendas não devem cobrir a boca ou os olhos. Se cobrirem, reconstrua com--cap-y(número maior = mais baixo na tela). - Filmagem gravada de lado (câmera virada de lado, sem metadados de rotação) mostra a pessoa deitada de
lado na folha de contato. Gire-a primeiro (
ffmpeg -vf transpose=2= 90° anti-horário, outranspose=1= horário; verifique um quadro) paravideos/_caption-inputs/, então executenewnesse arquivo. - Envie o MP4 com
SendUserFilee forneça seu caminho como um link.
6. Revisões
As configurações persistem em videos/captions/<nome>/caption.json, então uma revisão é apenas
build <nome> --<opção> … seguido por render <nome>. Pedidos comuns:
- Estilo diferente:
--style. - Maior ou menor:
--size 1.2. - Mais alto ou mais baixo:
--cap-y 0.7. - Menos palavras por legenda:
--words 2. - Cor diferente:
--accent "#FF4D3D". - Alterar o gancho:
--hook;--hook ""o remove. - Duração do gancho:
--hook-dur 3.5.
Eles também podem abrir no HyperFrames Studio por conta própria com cd videos/captions/<nome> && npm run dev.
Fatos de configuração (se algo quebrar)
- A transcrição chama
~/.claude/skills/embedded-captions/scripts/transcribe.cjscomHYPERFRAMES_ROOT=~/.hyperframes-root, uma instalação do HyperFrames CLI 0.8.147 com um link simbólicopackages/cli/dist/cli.js. Se algum estiver faltando, reinstale:npx hyperframes skills update embedded-captions, então reconstrua~/.hyperframes-root(npm install[email protected]e crie o link simbóliconode_modules/hyperframes/dist/cli.jsparapackages/cli/dist/cli.js). - As fontes estão em
kit/fonts/(todas SIL OFL) e são copiadas para cada projeto. setup/doctor.shverifica cada peça abaixo;setup/setup.shas repara.- Legendas que vão atrás da pessoa são possíveis com o fluxo
/embedded-captions, mas é muito mais lento (cerca de 4 minutos a cada 10 segundos) e precisa deHYPERFRAMES_ROOTdefinido. Ofereça apenas se for solicitado.