Rough cut: corte inicial sem gordura
Editores chamam isso de montagem e corte bruto. Cada linha utilizável entra, na ordem, e tudo que não merece seu lugar sai. Não é o vídeo finalizado. É a versão onde cada segundo é o falante dizendo a linha bem, para que os passes posteriores (ritmo, cor, gráficos, som) trabalhem em material de qualidade.
A ideia por trás disso: edite as palavras, não a forma de onda. Obtenha uma transcrição onde cada palavra tenha um horário de início e fim, decida o que manter lendo, e os cortes seguem as marcações. Descript e a edição baseada em texto no Premiere e Resolve funcionam assim. Este skill adiciona duas coisas que eles não fazem: ele encaixa cada corte no som real, e verifica a renderização escutando novamente.
Configuração (uma vez)
sh ~/simcraft/skills/rough-cut/setup.sh
Cria .venv ao lado deste arquivo com Whisper (mlx-whisper no Apple Silicon, faster-whisper nos outros). Precisa do ffmpeg: ffmpeg no PATH, ou $FFMPEG, ou ~/neatlogs-motion/ffmpeg. Execute cada script abaixo com ~/simcraft/skills/rough-cut/.venv/bin/python.
Espaço de trabalho
Uma pasta por vídeo. Se o usuário não criou uma, crie ~/Movies/edits/YYYY-MM-DD-<slug>/ e copie (nunca mova) os arquivos brutos para raw/. Scripts escrevem audio/, cuts/ e renders/ ao lado dela. Nada em raw/ é alterado.
O passe, em ordem
1. Transcrever
python scripts/transcribe.py <workspace> [--lang en]
Escreve audio/words.json (cada palavra: início, fim, texto, confiança) e audio/transcript.txt (uma linha por tomada). Cerca de 1 minuto para cada 2 minutos de gravação em um Mac da série M.
Passe --lang en quando for inglês (mais preciso). Deixe sem para fala mista Hindi/Inglês.
Como mantém a precisão (cada um corrige uma falha que encontramos em gravações reais):
- Cada tomada é transcrita individualmente. O áudio é dividido em cada pausa de 0,5s ou mais. Transcrever o arquivo inteiro de uma vez faz o Whisper escrever uma linha dita cinco vezes apenas uma, então as tomadas extras não têm palavras e não podem ser cortadas.
- Os preenchimentos são mantidos na transcrição. Whisper remove "ã" e "ah" por padrão. Um prompt cheio de hesitações os traz de volta para que possam ser cortados.
- Loops de transcrição são descartados. Whisper às vezes repete uma frase dezenas de vezes sobre ruído ("lá vai você lá vai você..."). Mais de 7 palavras por segundo é impossível, então essas linhas são descartadas.
2. Encontrar os cortes
python scripts/find_cuts.py <workspace> [--gap 0.35] [--keep-fillers]
Escreve cuts/edl.json (trechos a manter, em ordem) e cuts/cut_sheet.md (cada corte e o motivo, além de palavras de baixa confiança para verificar).
| Corte | Regra |
|---|---|
| Silêncio | Qualquer pausa maior que --gap (0,35 s). Silêncio no início e fim também. |
| Preenchimentos | ã, ah, hmm, mm, ah. |
| Repetições | Uma palavra ou trecho de até 4 palavras dito duas vezes seguidas ("então o então o"): mantém o segundo. |
| Retomadas | A mesma linha dita novamente em até 20s, combinada por letras para que falhas de audição ainda correspondam ("Vanta" / "Wanda", "1" / "um"): mantém a última tomada. |
| Falsos começos | Uma linha abandonada no meio e depois dita por completo ("Um negócio de 300 bilhões." e depois "Um negócio de 300 milhões de dólares."). |
| Mesmo final | Uma linha reformulada no início mas terminando da mesma forma ("Isso é, é o próprio fundador da Vanta" e depois "E não sou eu dizendo, é o próprio fundador da Vanta"). |
| Palavras fantasma | Uma palavra isolada sem voz por baixo. Whisper as inventa em silêncio ("Obrigado.", "aleluias"). |
Onde cada corte cai:
- Cada borda é encaixada no ponto onde a voz realmente começa e termina, medido a partir da intensidade em passos de 10ms com um limite que se adapta ao ambiente. Os tempos de palavra do Whisper podem estar errados em 0,1–0,3 s.
- Uma borda só se move para mais tarde em até 0,12 s, porque cortar uma palavra é pior do que manter uma respiração.
- 0,06 s de ambiente são deixados antes da voz e 0,10 s depois.
- Quando não há pausa real, como um "ã" colado na próxima palavra, o corte vai no ponto mais silencioso de 10ms entre elas.
- Uma pausa escondida dentro de uma "palavra" longa do Whisper ainda é encontrada e cortada.
3. Passagem de julgamento (a edição real, nunca pule)
Leia cuts/cut_sheet.md ao lado de audio/transcript.txt e corrija cuts/edl.json manualmente. Um script não pode julgar estes:
- Qual tomada é melhor. A última tomada é mantida por padrão, mas a melhor é a que tem energia, final limpo e sem risada quebrando. Às vezes a primeira metade de uma tomada mais o fim de outra é o melhor.
- Preenchimentos que fazem parte da piada. Um "ã" deliberado antes da piada permanece.
- "tipo", "sabe", "quer dizer", "basicamente". Nunca são cortados automaticamente. Corte apenas os que são pura enrolação. Cortar todos eles faz o falante soar diferente de si mesmo.
- Pausas que são tempo. Uma pausa antes de uma piada, uma reação ou um olhar para a câmera permanece. Nem todo silêncio é ar morto.
- Dizer o mesmo ponto duas vezes com palavras diferentes. Corte frases inteiras.
- Momentos não-falados, como uma música, uma piada visual ou um take de reação. Apenas a fala é mantida, então adicione esses trechos manualmente.
- Ordem. Os trechos seguem a ordem dos arquivos. Mova a linha mais forte para o topo para uma abertura a frio, se o usuário quiser.
- A lista "verifique estas palavras". Baixa confiança geralmente significa murmúrio. Se a linha não estiver clara, procure uma tomada mais limpa.
Cada trecho é {"clip", "in", "out", "text"}, e "speed" é opcional. Mantenha cortes entre palavras.
4. Ritmo (pergunte primeiro)
A folha de corte relata palavras por segundo. Conteúdo de fala rápida fica em torno de 3,3–3,8. Se o falante for mais lento, sugira uma velocidade de 1,05–1,2 e defina "speed" no edl.json para o vídeo inteiro, ou por trecho. O tom permanece o mesmo. Nunca acelere música ou reações.
5. Renderização de visualização
python scripts/render.py <workspace> --w 854 --v 1 [--aspect 9:16]
Uma visualização em 480p vai para renders/v1_854.mp4. Aumente --v para cada rodada de anotações para que versões antigas sejam mantidas.
- Cada trecho é renderizado com contagem exata de quadros e áudio sem compactação, depois todos os trechos são unidos por decodificação. Uniões por cópia de stream perdem quadros nos cortes e o áudio derrapa cerca de 2s ao longo de alguns minutos.
- Cada trecho recebe um fade in de 12ms e um fade out de 20ms, para que os cortes não estalem.
- Clipes com formato diferente ficam sobre uma cópia desfocada de si mesmos, em vez de barras pretas.
6. Verificar (sempre, antes de mostrar ao usuário)
python scripts/verify.py <workspace> --v 1 [--lang en]
Ele escuta a renderização novamente, trecho por trecho, compara com a lista de cortes e escreve cuts/verify_v1.md. O relatório tem quatro seções:
- Cortes que caem enquanto a voz ainda está rolando: um teste de som que não depende do Whisper. Este é o verdadeiro detector de palavras cortadas. Corrija cada um movendo essa borda no edl.json.
- Palavras ausentes: esperadas mas não ouvidas.
- Palavras inesperadas: um preenchimento ou um pedaço de retomada vazando.
- Desentendimentos: as duas transcrições discordam na redação. Geralmente é murmúrio, não um problema de corte.
Em áudio limpo, o alvo é 100% das palavras presentes, 0 cortes dentro do som e 0 palavras inesperadas. Áudio ruidoso ou murmurando dá alguns pares ausente/inesperado que são na verdade desentendimentos. Confie no teste de som sobre eles.
Corrija o que ele encontrar, renderize novamente e verifique novamente.
7. Mostrar ao usuário, depois o final
- Diga ao usuário: o comprimento antes e depois, o número de cortes, o resultado da verificação e quaisquer decisões de julgamento que você tomou (qual tomada manteve, uma pausa que manteve de propósito).
- Anote as observações deles antes de fazer a próxima versão.
- Só depois que eles aprovarem a visualização:
python scripts/render.py <workspace> --w <largura da fonte> --v N.
Resultados em gravações reais
Em 3 minutos de gravação bruta de fala com muitas retomadas (9 tomadas de uma linha, 4 de outra), 2:55 de fala se tornaram 0:36. Manteve a última tomada limpa de cada linha, e a verificação encontrou 100% das palavras presentes, 0 cortes dentro do som e 0 vazamentos.
O gosto do usuário
- Rápido. Cortes abruptos em lacunas de palavras são bons; zooms alternados constantes de aproximação não são.
- Mantenha palavrões, brincadeiras e partes engraçadas. Nunca limpe a personalidade.
- Sem swishes e sem correção de cor nesta fase.
- Quando o usuário pedir "apenas as partes boas, no máximo X minutos", corte momentos inteiros, não apenas pausas.