Cortar Silêncios (Agente 1 do Pipeline)
Primeiro passo da edição automatizada. Pega uma gravação bruta e sua transcrição em nível de palavra e remove apenas silêncio: espaços vazios antes da primeira palavra e após a última palavra, mais pausas entre palavras maiores que um limite (reduzidas a uma respiração natural, nunca a uma lacuna zero). Deixa as palavras do falante intactas — falsos começos, retomadas e gaguejos são trabalho do agente cortar-erros (Agente 2).
Este agente é determinístico e orientado por transcrição, portanto sua saída (*.silence-transcript.json) alimenta-se de forma limpa nos próximos agentes e no validador de sincronização de batidas.
Quando usar
- "cortar os silêncios", "aparar as pausas", "remover espaços vazios", "apertar o ritmo"
- Como o primeiro estágio do fluxo de edição mestre, logo após a transcrição.
Pré-requisitos
Um JSON de transcrição em nível de palavra. Ou o formato ElevenLabs Scribe
({ words: [{ text, start, end, type }], audio_duration_secs }) ou um genérico
{ words: [{ text, start, end }] }. Gere um com o transcritor do space de trabalho:
node scripts/transcribe-elevenlabs.mjs path/to/raw.mp4 # -> path/to/raw.json
Uso
# 1) Apenas planejamento — calcula o corte, escreve EDL + transcrição reajustada (nenhum vídeo tocado)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--out-dir video-projects/<slug>/assets
# 2) Com um vídeo — também escreve o comando ffmpeg (ainda não renderiza)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--video video-projects/<slug>/assets/raw.mp4 --out-dir video-projects/<slug>/assets
# 3) Renderizar o vídeo cortado (ffmpeg local, re-codificar, A/V mantidos sincronizados)
# adicione --apply para realmente executar o ffmpeg
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--video video-projects/<slug>/assets/raw.mp4 --apply \
--output video-projects/<slug>/assets/edited-silenced.mp4
Opções
| Flag | Padrão | Significado |
|---|---|---|
--video <caminho> | — | Vídeo de origem; habilita o comando ffmpeg / renderização |
--out-dir <dir> | próximo ao transcrição | Onde as saídas são escritas |
--output <caminho> | <video-stem>.silenced.mp4 | Caminho do vídeo cortado |
--gap <s> | 0.55 | Pausa mínima tratada como silêncio cortável |
--head-pad <s> | 0.22 | Silêncio mantido antes da primeira palavra |
--tail-pad <s> | 0.34 | Silêncio mantido após a última palavra |
--apply | desligado | Realmente executar ffmpeg para renderizar o corte |
Como decide (as regras de silêncio)
- Pausas abaixo de
--gap(0,55s) são deixadas em paz — ritmo de fala natural. - Para uma pausa aparada, uma respiração natural é mantida, escalada por contexto:
0,24spara pausas longas (≥2s),0,20sapós um finalizador de frase (. ! ?),0,14scaso contrário. A respiração mantida é ligeiramente tendenciosa para o final da frase anterior. - Espaços vazios de cabeça/cauda são aparados para
--head-pad/--tail-pad. - Os intervalos de exclusão são mesclados; os intervalos de manutenção são o complemento. O corte é renderizado com um graph de filtro
trim/atrim+concatdo ffmpeg (gravado em um script*.silence-filter.txte passado via-/filter_complex), assim o vídeo e o áudio permanecem sincronizados.
Saídas (escritas em --out-dir)
| Arquivo | Proposta |
|---|---|
<stem>.silence-edl.json | Intervalos de manutenção/exclusão, durações, parâmetros — a lista de edição |
<stem>.silence-transcript.json | Palavras com tempos reajustados para a linha do tempo editada (alimenta Agente 2 + batidas) |
<stem>.silence-decisions.md | Resumo legível por humanos + maiores pausas aparadas |
<stem>.silence-filter.txt | O graph de filtro do ffmpeg (apenas com --video) |
<video-stem>.silenced.mp4 | O vídeo cortado (apenas com --apply) |
O resumo JSON impresso no stdout inclui removed, removedPct, contagens de intervalos e caminhos de saída — útil para o fluxo de trabalho mestre registrar e encadear.
Notas de ajuste
- Padrão YouTube de cabeça falante (
--gap 0,55) remove aproximadamente 15-20% de uma tomada bruta típica como puro silêncio. Abaixe--gappara um corte mais rápido e incisivo; aumente para preservar mais espaço natural para respirar. - Se um corte parecer muito agressivo nos limites de frases, aumente a respiração de quebra de frase ou aumente
--gap.
Transferência para o próximo agente
Passe <stem>.silence-transcript.json (e o silenced.mp4, se renderizado) para o agente cortar-erros. Como os carimbos de tempo já estão na linha do tempo editada, o tempo das batidas downstream e scripts/validate-beat-sync.mjs funcionam sem ajustes adicionais.