Couper les Silences (Agent 1 du Pipeline)
Première étape du montage automatisé. Prend un enregistrement brut + sa transcription mot à mot et supprime uniquement les silences : blancs avant le premier mot et après le dernier mot, ainsi que les pauses inter-mots plus longues qu'un seuil (réduites à une respiration naturelle, jamais un silence total). Elle laisse les paroles intactes — les faux départs, reprises et bégaiements sont du ressort de l'agent couper les erreurs (Agent 2).
Cet agent est déterministe et piloté par la transcription, de sorte que sa sortie (*.silence-transcript.json) s'enchaîne proprement avec les agents suivants et le validateur de synchronisation.
Quand l'utiliser
- "couper les silences", "réduire les pauses", "retirer les blancs", "resserrer le rythme"
- Comme première étape du flux de montage principal, juste après la transcription.
Prérequis
Un fichier JSON de transcription mot à mot. Soit au format ElevenLabs Scribe
({ words: [{ text, start, end, type }], audio_duration_secs }) soit un format générique
{ words: [{ text, start, end }] }. Générez-en un avec le transcripteur de l'espace de travail :
node scripts/transcribe-elevenlabs.mjs path/to/raw.mp4 # -> path/to/raw.json
Utilisation
# 1) Planifier uniquement — calculer la coupe, écrire l'EDL + la transcription retimée (aucune vidéo touchée)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--out-dir video-projects/<slug>/assets
# 2) Avec une vidéo — écrire également la commande ffmpeg (ne rend toujours pas)
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) Rendre la vidéo coupée (ffmpeg local, réencodage, audio/vidéo synchro)
# ajouter --apply pour exécuter 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
Options
| Option | Défaut | Signification |
|---|---|---|
--video <chemin> | — | Vidéo source ; active la commande ffmpeg / le rendu |
--out-dir <répertoire> | à côté de la transcription | Répertoire de sortie |
--output <chemin> | <nom-video>.silenced.mp4 | Chemin de la vidéo coupée |
--gap <s> | 0.55 | Pause minimale considérée comme silence coupable |
--head-pad <s> | 0.22 | Silence conservé avant le premier mot |
--tail-pad <s> | 0.34 | Silence conservé après le dernier mot |
--apply | désactivé | Exécute ffmpeg pour produire la coupe |
Comment il décide (règles de silence)
- Les pauses inférieures à
--gap(0.55s) sont laissées intactes — rythme naturel de la parole. - Pour une pause réduite, une respiration naturelle est conservée, ajustée selon le contexte :
0.24spour les longues pauses (≥2s),0.20saprès un signe de fin de phrase (. ! ?),0.14ssinon. La respiration conservée est légèrement décalée vers la fin de la phrase précédente. - Les blancs de début/fin sont réduits à
--head-pad/--tail-pad. - Les plages à supprimer sont fusionnées ; les plages à conserver sont le complément. La coupe est rendue avec un graphe de filtre ffmpeg
trim/atrim+concat(écrit dans un script*.silence-filter.txtet passé via-filter_complex), de sorte que la vidéo et l'audio restent synchronisés.
Sorties (écrites dans --out-dir)
| Fichier | Objectif |
|---|---|
<stem>.silence-edl.json | Plages à conserver/supprimer, durées, paramètres — la liste de montage |
<stem>.silence-transcript.json | Mots retimés sur la timeline éditée (alimente Agent 2 + beats) |
<stem>.silence-decisions.md | Résumé lisible + plus grandes pauses supprimées |
<stem>.silence-filter.txt | Le graphe de filtre ffmpeg (uniquement avec --video) |
<video-stem>.silenced.mp4 | La vidéo coupée (uniquement avec --apply) |
Le résumé JSON affiché sur stdout inclut removed, removedPct, les comptes de plages et les chemins de sortie — utile pour que le flux principal puisse journaliser et enchaîner.
Notes de réglage
- Pour une vidéo YouTube en plan fixe, la valeur par défaut (
--gap 0.55) supprime environ 15-20% du silence d'une prise brute typique. Diminuez--gappour une coupe plus nerveuse et rapide ; augmentez-le pour préserver davantage de respiration naturelle. - Si une coupe semble trop agressive en fin de phrase, augmentez la respiration de fin de phrase, ou augmentez
--gap.
Passage à l'agent suivant
Passez <stem>.silence-transcript.json (et la silenced.mp4 si rendue) à l'agent couper les erreurs. Comme les horodatages sont déjà sur la timeline éditée, le calage des beats en aval et scripts/validate-beat-sync.mjs fonctionnent sans ajustement supplémentaire.