Clipes
Caminhos: ${CLAUDE_SKILL_DIR} é a pasta que contém este SKILL.md, e ${CLAUDE_SKILL_DIR}/../.. é a pasta do editor (o .claude/ deste repositório) dois níveis acima.
Leia ${CLAUDE_SKILL_DIR}/../../PRINCIPLES.md primeiro: as regras que todo vídeo segue (perguntar, parecer real, movimento, história e enquadramento, privacidade, custo).
Toda pergunta ao usuário vai na caixa de perguntas: chame a ferramenta AskUserQuestion (2 a 4 opções, a recomendada primeiro). Somente em um agente sem essa ferramenta, faça perguntas numeradas em texto.
Um vídeo longo entra. Os melhores poucos clipes curtos saem, cada um uma edição vertical finalizada no estilo do usuário.
clipes/<nome>/
source.mp4 o vídeo longo (um link simbólico para arquivo local; nunca modifique o original)
source.mp3, cover.jpg ou, para um podcast só de áudio: o áudio e a arte do programa
words.raw.json uma transcrição de tudo (nunca a leia)
candidates.json cada candidato com suas características (nunca o leia)
shortlist.md os 8 melhores que não se sobrepõem, cerca de 1.500 tokens: o único arquivo que você lê
shortlist.json o mesmo, para a página
picks.html a página da qual o usuário escolhe
edicoes/<nome>-clip<N>/ uma edição por clipe escolhido: source.mp4, words.raw.json (re-temporizado), clip.json
Execute os scripts com python3 no Mac e Linux, py no Windows.
PY="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/run.py"; python3 "$PY" abaixo executa o venv Python do editor (py "$PY" no Windows).
Se estiver faltando, execute o skill setup primeiro. K="${CLAUDE_SKILL_DIR}/scripts/clips.py",
C="${CLAUDE_SKILL_DIR}/../../skills/cut/scripts", S="${CLAUDE_SKILL_DIR}/../../skills/style-edit/scripts".
0. Pergunte, uma vez
Leia o perfil e o gosto primeiro (python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" show,
python3 "${CLAUDE_SKILL_DIR}/../../skills/taste/scripts/taste.py" show). Se não houver perfil ainda:
execute a captura de estilo do skill start primeiro, para que os clipes saiam com a aparência do usuário.
Depois, uma chamada de caixa de perguntas, a opção recomendada primeiro:
| pergunta | opções |
|---|---|
| Quantos clipes? | 3 (Recomendado) / 5 / 1 |
| Qual a duração de cada um? | 20-40 s (Recomendado) / 40-60 s / 60-90 s |
| Quantas pessoas falam nele? | uma (Recomendado) / duas (um podcast ou entrevista) |
Pule qualquer pergunta que o usuário já respondeu. Elas substituem a pergunta "cortar primeiro ou tudo de uma vez" do skill de corte: os clipes são executados diretamente, e o usuário aprova as escolhas e as folhas de stills.
1. O vídeo
Um arquivo local (um link físico no mesmo disco, senão um link simbólico, uma cópia apenas como último recurso):
python3 "${CLAUDE_SKILL_DIR}/../../skills/clips/scripts/clips.py" link "<caminho absoluto>" clipes/<nome>
Um link:
python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/links.py" fetch "<url>" clipes/<nome> --max-height 1080
Ele usa o yt-dlp do venv (o setup o instala lá, não no PATH), limita o download a 1080p (um clipe 1080x1920 não precisa de 4K; uma palestra de 20 minutos em 4K tem vários GB) e imprime o caminho do arquivo:
clipes/<nome>/source.mp4. Saída 3: o site exige login (o "confirme que você não é um robô" do YouTube).
Pergunte na caixa de perguntas antes de reexecutar com --cookies-from-browser chrome (ou o navegador deles).
Um podcast (link de feed RSS ou Apple Podcasts): route lista seus episódios mais recentes como opções de ask; pergunte
qual deles na caixa de perguntas (o mais novo primeiro), então fetch "<url da opção>" clipes/<nome da opcao> --direct --cover "<imagem da opcao>":
o áudio vai para source.mp3 (ou sua própria extensão) e a arte do programa para cover.jpg.
Baixe apenas o que o usuário tem o direito de reutilizar: o próprio vídeo, ou um
para o qual ele tenha permissão. Diga isso uma vez se o link for de outra pessoa.
2. Transcreva uma vez
python3 "$PY" "$C/transcribe.py" clipes/<nome>/source.mp4 clipes/<nome>/words.raw.json # o arquivo que fetch imprimiu: source.mp3 para áudio
Diga o tempo primeiro: Whisper leva de 1 a 4 minutos por 3 minutos de vídeo em um laptop (grátis), Scribe cerca de 20 segundos para um vídeo de 13 minutos. Mesmos mecanismos do skill de corte. O Scribe adiciona risadas e outros eventos de áudio, que a pontuação usa. Cada clipe reutiliza esta transcrição: nada é transcrito duas vezes.
3. Candidatos e a lista final
python3 "$K" candidates clipes/<nome> --min 20 --max 40 [--speakers 2] [--style creator-teardowns/<handle>/style.json]
Passe a duração que o usuário escolheu. --style é o primeiro criador do perfil: os movimentos "o que funciona" medidos
lá são listados na lista final. O código divide a transcrição em sentenças e faz cada sequência de
sentenças inteiras dentro da duração se tornar um candidato (nunca começando com "Mm-hmm" ou terminando no meio de uma palavra),
mede cada um, os classifica pelas características e escreve shortlist.md.
Leia apenas shortlist.md. Cada entrada tem o gancho, as primeiras palavras de cada sentença do meio, a
última sentença e as características medidas. Julgue cada entrada em quatro perguntas: o gancho funciona sozinho,
um estranho consegue segui-lo, ele compensa, há uma afirmação concreta, número ou história.
Nunca leia words.raw.json ou candidates.json. Escolha o número de clipes do usuário a partir da
lista final, melhores primeiro. Descarte, independentemente da pontuação:
- uma leitura de anúncio, um segmento de patrocínio, uma introdução ou um encerramento;
- um gancho que depende de contexto anterior ("como eu disse", "é por isso", "este aqui");
- um clipe cujo ponto é uma afirmação datada ("no momento em que estou gravando isso, é o número 40") quando a afirmação já mudou: uma captura ao vivo da página de hoje a contradiria.
4. A página de escolha, depois a caixa de perguntas
python3 "$K" page clipes/<nome> --recommend c12,c40,c7
open clipes/<nome>/picks.html # Windows: start "" ..., Linux: xdg-open ...
Uma página: cada clipe da lista final com uma prévia de 360 px, sua transcrição (o gancho em negrito), o detalhamento da pontuação e as características medidas, suas escolhas marcadas. Depois pergunte na caixa de perguntas (multi-seleção): suas escolhas primeiro, cada uma rotulada com seu tempo e seu gancho, além de "um diferente da página". Aguarde a resposta.
5. Cada clipe escolhido
python3 "$K" trim clipes/<nome> c12 c40 c7 # -> edicoes/<nome>-clip1, -clip2, -clip3
Cada pasta de edição recebe source.mp4 (precisão de quadro, com preenchimento sem pegar a próxima palavra) e
words.raw.json re-temporizado para ela. Uma fonte só de áudio (source.mp3) não tem imagem: o trim faz de cada clipe
um source.mp4 com seu áudio sobre a própria capa do podcast (a capa desfocada e escurecida para preencher 1080x1920,
a capa nítida acima das legendas; sem arte: preto), e clip.json diz audio_only. Com uma capa, a
renderização a move: um zoom lento na capa, o fundo se movendo contra ela, um pequeno pulo no início de cada sentença. Para esses,
não pergunte um layout: sobreposição, sem reenquadramento, sem recorte, legendas ativadas (profile.py style as mantém ativadas). Diga uma vez
que cada clipe é o áudio sobre a capa do programa com as palavras do locutor como legendas. Antes de executar os clipes, defina a música uma vez para todos eles
(style-edit references/plan.md "Music"; o estilo decide a menos que o usuário tenha definido sound.music).
Todos os clipes de uma vez (Claude Code, ou qualquer agente com subagentes): lance um agente clip-editor
(clip-editor) por clipe, todos em uma mensagem para que sejam executados ao mesmo tempo. Dê a cada um
EDIT (a pasta do clipe, caminho absoluto), ROOT (${CLAUDE_SKILL_DIR}/../..), a linha PY e as respostas:
aspecto, layout, música, o mecanismo de transcrição e reenquadramento sim (fonte wide, a menos que a plataforma seja
YouTube) ou não, e se a fonte tem legendas incorporadas. Cada um leva seu clipe pelo corte e style-edit até a folha de stills e retorna um
JSON curto: status, cut_s, verify, cut_page, sheet, error. Mescle-os; nunca abra a transcrição de um clipe
ou a edição de papel. Em seguida, execute o agente stills-critic na folha de cada clipe ready, novamente todos em
uma mensagem, e corrija o que eles reprovarem (planeje e stills novamente para aquele clipe). Um clipe failed: execute-o manualmente como abaixo.
Um de cada vez (sem subagentes), para cada clipe em ordem:
- Vertical a partir de um vídeo wide:
python3 "$PY" "$K" reframe edicoes/<nome>-clip<N>corta para 9:16 com o corte seguindo a cabeça do locutor cena por cena (cortes de câmera encontrados com ffmpeg). Pule quando o perfil for YouTube ou a fonte já for vertical. - Corte: o skill de corte a partir de seu passo 2 (
retakes.py propose): a transcrição já está lá. Depois construa, renderize, verifique e a página de corte, como o skill diz. Música sob a voz é medida por arquivo:build_timeline.pycorta apenas entre palavras lá. - Estilo:
python3 "${CLAUDE_SKILL_DIR}/../../lib/ai_editor/profile.py" style edicoes/<nome>-clip<N>, depois o skill de style-edit a partir de seu passo 2. Se a fonte já tiver legendas incorporadas, defina"captions": {"present": false}nostyle.jsondessa edição, ou as legendas se empilham.
De qualquer forma, abra o cut-check.html de cada clipe e mostre todas as folhas de stills juntas para uma
aprovação, faça a pergunta de renderização uma vez para todos eles e renderize. Após a aprovação, execute
python3 "${CLAUDE_SKILL_DIR}/../../skills/cut/scripts/judge_cut.py" score na pasta de cada clipe (corte
references/judge.md). Entregue as renderizações em uma
página de revisão, cada clipe uma aba (start com o clipe 1, alt para os restantes, pasta clipes/<nome>; veja
${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/review.md), depois serve e wait em segundo plano.
Se um script parar
| mensagem | ação |
|---|---|
no run of whole sentences lasts <lo>-<hi> s | pergunte na caixa de perguntas por uma duração maior, execute candidates novamente |
no candidate <id> | use um id de shortlist.md |
links.py fetch saída 3 (um login ou "confirme que você não é um robô") | pergunte antes de reexecutar com --cookies-from-browser <browser> |
| qualquer mensagem de corte ou style-edit | a tabela "Se um script parar" daquele skill |
Regras
- Cada palavra, número e nome na tela vem das palavras do próprio clipe. Nada do resto do vídeo, e nada que o locutor não disse.
- Sem aparência de IA:
${CLAUDE_SKILL_DIR}/../../skills/style-edit/references/ai-tells.mdse aplica a cada clipe. - Um quadro de podcast em close não tem espaço livre: nenhum cartão ou logo vai sobre a cabeça. Menos elementos visuais é o certo; legendas e zooms carregam o conteúdo.
- Nunca corte um clipe no meio de uma sentença. Mais curto ou mais longo do que o pedido é melhor do que um pensamento interrompido.
Custo por vídeo longo
Medido em um podcast de 13 minutos com duas pessoas e um vídeo de 12 minutos com cabeça falante (2026-10):
- Transcrição: Scribe levou 16-18 s; Whisper é grátis e mais lento. Uma vez por vídeo longo.
- Candidatos e características: 4-6 s de código, $0.
- Claude lê
shortlist.md(cerca de 1.500 tokens), nunca a transcrição (cerca de 20.000). - A página de escolha: 30-40 s de ffmpeg para 8 prévias, 7-9 MB.
- Cada clipe custa então o que um corte e um style-edit custam.
Autoverificação
python3 "$K" demo
Arquivos
scripts/clips.py: candidates, page, trim, reframe e a demonstração offline (transcrição sintética). Apenas stdlib, excetoreframe(OpenCV, através do venv).${CLAUDE_SKILL_DIR}/../../agents/clip-editor.md: um clipe através do corte e style-edit até sua folha de stills.