Cortar Silencios (Agente 1 del Pipeline)
Primer paso de la edición automatizada. Toma una grabación en bruto junto con su transcripción a nivel de palabra y elimina únicamente el silencio: espacio muerto antes de la primera palabra y después de la última, además de pausas entre palabras que superan un umbral (recortadas a una respiración natural, nunca a un espacio cero absoluto). No altera las palabras del hablante: los falsos comienzos, las retomas y los tartamudeos son trabajo del agente cortar-errores (Agente 2).
Este agente es determinista y está guiado por la transcripción, por lo que su salida (*.silence-transcript.json) se integra sin problemas en los siguientes agentes y en 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 maestro, justo después de la transcripción.
Prerrequisitos
Un JSON de transcripción a nivel de palabra. Ya sea el formato de ElevenLabs Scribe
({ words: [{ text, start, end, type }], audio_duration_secs }) o uno genérico
{ words: [{ text, start, end }] }. Genere uno con el transcriptor del espacio de trabajo:
node scripts/transcribe-elevenlabs.mjs ruta/a/bruto.mp4 # -> ruta/a/bruto.json
Uso
# 1) Solo planificar — calcular el corte, escribir EDL + transcripción con tiempos reajustados (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 se renderiza)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcripcion.json> \
--video video-projects/<slug>/assets/bruto.mp4 --out-dir video-projects/<slug>/assets
# 3) Renderizar el video cortado (ffmpeg local, recodificar, 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/bruto.mp4 --apply \
--output video-projects/<slug>/assets/editado-silencios.mp4
Opciones
| Bandera | Valor por defecto | Significado |
|---|---|---|
--video <ruta> | — | Video fuente; habilita el comando ffmpeg / renderizado |
--out-dir <dir> | junto a la transcripción | Directorio donde se escriben las salidas |
--output <ruta> | <nombre-video>.silenciado.mp4 | Ruta del video cortado |
--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 ffmpeg realmente para renderizar el corte |
Cómo decide (las reglas de silencio)
- Las pausas por debajo de
--gap(0,55s) no se tocan — 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 oración (. ! ?),0,14sen otros casos. La respiración mantenida se sesga ligeramente hacia el final de la frase anterior. - El espacio muerto inicial/final se recorta a
--head-pad/--tail-pad. - Los rangos de eliminación se fusionan; los rangos de conservación son el complemento. El corte se renderiza con un gráfico de filtros 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.
Salidas (escritas en --out-dir)
| Archivo | Propósito |
|---|---|
<nombre>.silence-edl.json | Rangos de conservar/eliminar, duraciones, parámetros — la lista de edición |
<nombre>.silence-transcript.json | Palabras con tiempos reajustados a la línea de tiempo editada (alimenta al Agente 2 + ritmo) |
<nombre>.silence-decisions.md | Resumen legible por humanos + las pausas más grandes recortadas |
<nombre>.silence-filter.txt | El gráfico de filtros ffmpeg (solo con --video) |
<nombre-video>.silenciado.mp4 | El video cortado (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 maestro registre y encadene.
Notas de ajuste
- El valor predeterminado para videos de cabezas parlantes de YouTube (
--gap 0.55) elimina aproximadamente el 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 conservar más espacio natural para respirar. - Si un corte se siente demasiado agresivo en los límites de las oraciones, aumente la respiración al final de la oración, o aumente
--gap.
Entrega al siguiente agente
Pase <nombre>.silence-transcript.json (y el silenciado.mp4 si se renderizó) al agente cortar-errores. Debido a que las marcas de tiempo ya están en la línea de tiempo editada, la sincronización del ritmo posterior y scripts/validate-beat-sync.mjs funcionan sin necesidad de ajustes adicionales.