Cortar Silencios (Agente 1 del Pipeline)
Primer paso de la edición automatizada. Toma una grabación en bruto + su transcripción a nivel de palabra y elimina solo silencio: espacio muerto antes de la primera palabra y después de la última, además de pausas entre palabras que superen un umbral (recortadas a una respiración natural, nunca a un corte brusco). No modifica las palabras del hablante: los falsos comienzos, retomas y tartamudeos son trabajo del agente cortar-errores (Agente 2).
Este agente es determinista y se basa en la transcripción, por lo que su salida (*.silence-transcript.json) se integra limpiamente con los agentes posteriores y el validador de sincronización de ritmo.
Cuándo usarlo
- "cortar los silencios", "recortar las pausas", "eliminar espacios muertos", "ajustar el ritmo"
- Como la primera etapa del flujo de trabajo de edición principal, justo después de la transcripción.
Prerrequisitos
Un archivo JSON de transcripción a nivel de palabra. Puede tener el formato de ElevenLabs Scribe
({ words: [{ text, start, end, type }], audio_duration_secs }) o uno genérico
{ words: [{ text, start, end }] }. Puede generarlo con el transcriptor del espacio de trabajo:
node scripts/transcribe-elevenlabs.mjs ruta/al/raw.mp4 # -> ruta/al/raw.json
Uso
# 1) Solo planificar — calcular el corte, escribir EDL + transcripción re-sincronizada (sin tocar el video)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcripcion.json> \
--out-dir video-projects/<slug>/assets
# 2) Con un video — también escribir el comando ffmpeg (aún no renderiza)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcripcion.json> \
--video video-projects/<slug>/assets/raw.mp4 --out-dir video-projects/<slug>/assets
# 3) Renderizar el video recortado (ffmpeg local, re-codificar, A/V sincronizados)
# agregar --apply para ejecutar ffmpeg realmente
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcripcion.json> \
--video video-projects/<slug>/assets/raw.mp4 --apply \
--output video-projects/<slug>/assets/edited-silenced.mp4
Opciones
| Bandera | Predeterminado | Significado |
|---|---|---|
--video <ruta> | — | Video fuente; habilita el comando ffmpeg / renderización |
--out-dir <directorio> | junto al transcripción | Donde se escriben los archivos de salida |
--output <ruta> | <video-stem>.silenced.mp4 | Ruta del video recortado |
--gap <s> | 0.55 | Pausa mínima considerada como silencio recortable |
--head-pad <s> | 0.22 | Silencio mantenido antes de la primera palabra |
--tail-pad <s> | 0.34 | Silencio mantenido después de la última palabra |
--apply | desactivado | Ejecutar realmente ffmpeg para renderizar el corte |
Cómo decide (las reglas de silencio)
- Las pausas por debajo de
--gap(0.55s) se mantienen sin cambios — ritmo natural del habla. - Para una pausa recortada, se mantiene una respiración natural, escalada según el contexto:
0.24spara pausas largas (≥2s),0.20sdespués de un final de frase (. ! ?),0.14sen otros casos. La respiración mantenida se desplaza ligeramente hacia el final de la frase anterior. - El espacio muerto al inicio/final se recorta a
--head-pad/--tail-pad. - Los rangos a eliminar se fusionan; los rangos a mantener son el complemento. El corte se renderiza con un filtro ffmpeg
trim/atrim+concat(escrito en un script*.silence-filter.txty pasado mediante-/filter_complex), por lo que el video y el audio permanecen sincronizados.
Archivos de salida (escritos en --out-dir)
| Archivo | Propósito |
|---|---|
<stem>.silence-edl.json | Rangos de mantener/eliminar, duraciones, parámetros — la lista de edición |
<stem>.silence-transcript.json | Palabras re-sincronizadas en la línea de tiempo editada (alimenta al Agente 2 + ritmo) |
<stem>.silence-decisions.md | Resumen legible para humanos + las pausas más grandes recortadas |
<stem>.silence-filter.txt | El filtro ffmpeg (solo con --video) |
<video-stem>.silenced.mp4 | El video recortado (solo con --apply) |
El resumen JSON impreso en stdout incluye removed, removedPct, conteos de rangos y rutas de salida — útil para que el flujo de trabajo principal registre y encadene.
Notas de ajuste
- Por defecto para YouTube de cabeza parlante (
--gap 0.55) se elimina aproximadamente un 15-20% de una toma en bruto típica como silencio puro. Reduzca--gappara un corte más rápido y enérgico; auméntelo para preservar un espacio de respiración más natural. - Si un corte se siente demasiado agresivo en los límites de las frases, aumente la respiración al final de la frase o aumente
--gap.
Transferencia al siguiente agente
Pase <stem>.silence-transcript.json (y el silenced.mp4 si se renderizó) al agente cortar-errores. Dado que las marcas de tiempo ya están en la línea de tiempo editada, la sincronización de ritmo posterior y scripts/validate-beat-sync.mjs funcionan sin ajustes adicionales.