Corte
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.
Toda pergunta vai na caixa de perguntas: a ferramenta AskUserQuestion (2-4 opções, recomendada primeiro). Apenas em um agente sem ela, faça perguntas numeradas em texto.
edits/<nome>/ transcript.txt (leia isto, nunca words.raw.json), spans.json (o que remover, com aspas),
candidates.md (o que o código sinalizou), paper-edit.md (o corte como texto), cut-check.html (o
transcript), review.json (notas), cut.mp4 + words.json (a renderização e suas palavras).
<nome> é um slug do nome do arquivo (IMG_1234.MOV -> img-1234), na biblioteca
(PRINCIPLES.md "Onde"). Nunca modifique, mova ou copie o arquivo de origem: passe seu caminho.
PY="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/run.py"; python3 "$PY" executa a ferramenta no venv. No Windows, use
py onde estes comandos dizem python3.
Nenhum venv ainda: execute a skill setup primeiro. S="${CLAUDE_SKILL_DIR}/scripts".
Ainda não tem vídeo?
Pergunte pelo caminho da gravação. Vários arquivos: references/takes.md. Nenhum: quando AI_EDITOR_SAMPLE_URL estiver definido,
ofereça essa amostra e faça o download para a pasta do usuário (curl -L -o sample-take.mp4 "$AI_EDITOR_SAMPLE_URL");
caso contrário, peça para ele gravar um (qualquer vídeo de celular dele falando por 30-60 s serve).
0. Pergunte: só o corte primeiro, ou tudo de uma vez
Antes de qualquer outra coisa, faça uma pergunta na caixa de perguntas (o start decide isso para uma edição completa):
Você quer apenas o corte primeiro, ou o corte e a edição estilizada de uma vez?
- Apenas o corte primeiro (Recomendado). Você aprova o corte antes de eu adicionar legendas, zoom ou visuais, então um corte alterado nunca reconstrói os visuais (menos tokens).
- Tudo de uma vez. Eu corto e depois estilizo sem esperar. Você ainda vê a página de corte e a folha de stills antes de qualquer renderização.
Pule isso apenas quando o usuário já respondeu ("só corta", "corta e estiliza de uma vez") ou start ou clips chamou esta skill. Apenas o corte primeiro: etapas 1-6, depois pare até o usuário aprovar o corte e pedir o estilo. Tudo de uma vez: etapas 1-5, abra a página de corte, vá direto para style-edit; uma mudança posterior no corte reexecuta style-edit a partir do passo de planejamento.
0b. Leia o gosto do usuário
python3 "${CLAUDE_SKILL_DIR}/../../skills/taste/scripts/taste.py" show --edit edits/<nome>
Siga todas as regras dele. Salve uma reação a um resultado ("muito lento") com a skill taste antes de refazer.
1. Transcrever
python3 "$PY" "$S/transcribe.py" <origem> edits/<nome>/words.raw.json [--script <roteiro deles>]
Um roteiro (ou --keyterm Nome, repetível) acerta nomes e jargões (+20% no Scribe).
Diga o tempo primeiro: Whisper 1-4 min para uma gravação de 3 min, CrisperWhisper aproximadamente o comprimento da gravação. Ele escolhe
Scribe quando uma chave está salva, senão CrisperWhisper se instalado, senão o Whisper local gratuito (--engine whisper|crisper|scribe substitui), que descarta
alguns "hãs" e falsos inícios. Sem nenhum dos dois, diga uma vez que
o setup pode adicionar um (os pesos do CrisperWhisper são apenas para uso não comercial). Nunca baixe um modelo durante a edição: uma
reverificação que precise de um não instalado (código de saída 4) é ignorada e mencionada na nota da rodada.
Nunca leia words.raw.json: a etapa 2 escreve transcript.txt, com 1/12 do tamanho.
2. Decidir o que cortar
python3 "$S/retakes.py" propose edits/<nome>
O código encontra todos os possíveis cortes (uma linha repetida, uma frase inacabada, "espera, desculpa", vícios de linguagem)
em candidates.md. Cada um é um lugar para olhar, não uma decisão. Leia transcript.txt e
candidates.md, siga references/retake-detection.md, e escreva spans.json
(references/shapes.md).
Com um script.md: python3 "$S/script_match.py" edits/<nome>, leia script-match.md (references/script.md).
A última gravação vence, exceto para ganchos alternativos. Nunca digite um timestamp ou crie um intervalo de pausa.
Apenas se o usuário quiser algo mais curto (ou o gosto dele disser para executar a passagem editorial), também leia references/editorial-rules.md e adicione cortes
redundantes (chamadas de conteúdo).
Um nome ouvido errado é um comando, nunca uma reescrita de JSON: python3 "$S/retakes.py" fix edits/<nome> cloud=Claude jiv=Jev (palavras inteiras, mantidas em fixes.json para as legendas).
3. Construir
python3 "$S/build_timeline.py" <origem> edits/<nome> && python3 "$PY" "$S/mirror.py" <origem> edits/<nome>
Toda pausa (respirações também) acima de --max-pause (0,15 s) vira 0,10 s; sob música apenas lacunas
entre palavras são aparadas. Um ERROR na construção não escreve nada: corrija esse intervalo e execute novamente.
mirror.py diz mirrored quando um livro, camiseta ou placa aparece ao contrário (gravação com câmera frontal): pergunte uma vez,
Manter como foi gravado (Recomendado) (a maioria dos criadores publica assim) / Inverter para o texto ficar legível; ao
inverter, adicione --flip a cada render.py abaixo.
Em uma única mensagem, inicie a codificação dos intervalos em segundo plano (run_in_background) e as
verificações de papel; a etapa 4 então codifica apenas o que mudou:
python3 "$S/render.py" <origem> edits/<nome> --segments-only
O agente cut-judge avalia paper-edit.md (um erro deixado, uma junção ruim, uma boa linha perdida) e
corrige spans.json. Leitores para gravações com mais de 5 min
vão primeiro, o juiz depois: references/judge.md. Nunca leia paper-edit.md você mesmo.
CLIPPEDempaper-edit.md: um corte de pausa comeu uma palavra. Aumente--pad. Ainda assim: um rótulo está errado.- Junções dentro da fala movem-se para um quadro silencioso. Qualquer
still in speech: ouça na etapa 5.
4-5. Renderizar e verificar
Primeiro plano (render.py espera a codificação em segundo plano):
R="${CLAUDE_SKILL_DIR}/../../lib/ai_editor/review.py"
python3 "$S/build_timeline.py" <origem> edits/<nome> && \
python3 "$S/render.py" <origem> edits/<nome> && \
python3 "$PY" "$S/verify_cut.py" edits/<nome> --engine <mesmo motor da etapa 1> && \
python3 "$S/preview_cut.py" edits/<nome> --no-open && \
python3 "$R" edits/<nome> start --video edits/<nome>/cut.mp4 --stage cut --transcript edits/<nome>/words.json
Verificação limpa: a página de corte está pronta. A verificação compara o transcript do corte com as palavras mantidas (código de saída 1 interrompe a cadeia):
- MISSING: uma palavra mantida não está na renderização. Aumente
--pad(ou estreite o intervalo), reconstrua, renderize novamente. - SURVIVED: um intervalo a adicionar para uma repetição ou tropeço real, nunca um que corte uma linha mantida.
- HEARD DIFFERENTLY ("jev -> jeff") e notas de vício de linguagem são variação do transcritor: sem reconstrução.
- DOUBLED: palavras ditas duas vezes seguidas. Natural ("muito, muito"): mantenha. Um tropeço: adicione seu intervalo.
- N junção(ões) na fala: ouça. Cortado:
splice_check.py edits/<nome> --fix, renderize novamente.
Um ciclo de correção (a mesma cadeia), depois mostre ao usuário o que resta.
6. O usuário aprova
A cadeia abriu a página de revisão (../style-edit/references/review.md). serve e wait em segundo
plano. Diga os segundos cortados. Notas: "manter ": estreite ou exclua esse intervalo; "cortar ": adicione um; pausas
erradas: --max-pause. Depois etapas 4-5, resolve cada nota (--reply: o que mudou), por último
round --video edits/<nome>/cut.mp4 (nunca um segundo start), depois faça qualquer pergunta de aprendizado.
Após a aprovação, uma chamada Bash: python3 "$S/trend.py" log edits/<nome> (tally: tendência), a verificação de gancho. Depois variantes de gancho se hooks.json existir (references/retake-detection.md); chamado por start, pergunte isso na mesma caixa de perguntas que a aprovação de stills do style-edit, não antes.
Apenas a aprovação finaliza o corte; cut.mp4, words.json vão para style-edit. Em "apenas o
corte primeiro", diga que podem pedir o estilo. Nunca inicie style-edit por conta própria. Chamado por start: assim que a
página abrir, inicie visual-prep em segundo plano; seus motion_briefs: um clip-builder em segundo plano
cada um de uma vez; diga um motion_note uma vez.
Se um script parar
| mensagem | faça |
|---|---|
no such file / ffmpeg could not read audio | peça o caminho correto; nunca copie ou converta a origem |
faster-whisper missing / CrisperWhisper missing | execute com python3 "$PY", ou a etapa 3 da skill setup |
no ElevenLabs key (saída 2) / HTTP 4xx, unreachable (3) | remova --engine scribe, ou salve a chave novamente com a skill setup |
ERROR na construção em uma citação | corrija a citação desse intervalo ou adicione occurrence, construa novamente |
cannot derive a silence threshold / marked no silence | fala e fundo estão a menos de 10 dB de diferença: ffmpeg -i <origem> -af volumedetect -vn -f null -, passe --noise cerca de 10 dB acima da média |
ERROR ... na renderização | diga isso; execute a renderização novamente uma vez |
Regras
- Cada corte cita o transcript. Sem citação, sem corte.
- Um roteiro desempata entre gravações e mantém toda gravação de uma linha que ele repete. Nada é cortado por estar fora do roteiro.
- Nunca copie em stream (
-c copy) entre cortes: pode resultar em até 2 s de diferença. - Nunca entregue uma renderização que não tenha sido verificada e aprovada.
Autoverificação
test_build_timeline.py, test_retakes.py, test_media.py (ffmpeg); demo em transcribe.py, trend.py, splice_check.py, script_match.py, mirror.py.