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 entre mots plus longues qu'un seuil (réduites à une respiration naturelle, jamais un silence total). Les paroles de l'orateur restent intactes — les faux départs, retakes et bégaiements sont du ressort de l'agent coupe-erreurs (Agent 2).
Cet agent est déterministe et piloté par la transcription, donc sa sortie (*.silence-transcript.json) s'enchaîne proprement vers les agents suivants et le validateur de synchronisation.
Quand l'utiliser
- « coupe les silences », « réduis les pauses », « supprime les blancs », « resserre le rythme »
- Comme première étape du flux de montage principal, juste après la transcription.
Prérequis
Une transcription mot-à-mot au format JSON. 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 une avec le transcripteur de l'espace de travail :
node scripts/transcribe-elevenlabs.mjs chemin/vers/raw.mp4 # -> chemin/vers/raw.json
Utilisation
# 1) Planification uniquement — calcul de la coupe, écriture de l'EDL + transcription retimée (vidéo non touchée)
node .agents/skills/cut-silences/scripts/cut-silences.mjs <transcript.json> \
--out-dir video-projects/<slug>/assets
# 2) Avec une vidéo — écrit également la commande ffmpeg (toujours sans rendu)
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) Rendu de la vidéo coupée (ffmpeg local, ré-encodage, A/V synchronisé)
# 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 / le rendu ffmpeg |
--out-dir <répertoire> | à côté de la transcription | Répertoire de sortie |
--output <chemin> | <video-stem>.silenced.mp4 | Chemin de la vidéo coupée |
--gap <s> | 0.55 | Pause minimale considérée comme silence à couper |
--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 effectivement ffmpeg pour effectuer la coupe |
Comment ça décide (les règles de silence)
- Les pauses en dessous de
--gap(0.55s) sont laissées intactes — rythme naturel de la parole. - Pour une pause coupée, une respiration naturelle est conservée, ajustée selon le contexte :
0.24spour les longues pauses (≥2s),0.20saprès un terminateur de phrase (. ! ?),0.14sdans les autres cas. 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 coupés à
--head-pad/--tail-pad. - Les plages à supprimer sont fusionnées ; les plages à conserver en sont le complément. La coupe est rendue avec un filtre
trim/atrim+concatffmpeg (écrit dans un script*.silence-filter.txtet passé via-/filter_complex), garantissant la synchronisation vidéo et audio.
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 l'Agent 2 + beats) |
<stem>.silence-decisions.md | Résumé lisible des plus grandes pauses coupées |
<stem>.silence-filter.txt | Le graphe de filtres 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 journalise et enchaîne.
Notes de réglage
- Valeur par défaut pour YouTube talking-head (
--gap 0.55) supprime environ 15-20 % d'une prise brute typique comme silence pur. Abaissez--gappour une coupe plus nerveuse et rapide ; augmentez-le pour préserver plus d'espace de respiration naturel. - 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 coupe-erreurs. Comme les timestamps sont déjà sur la timeline éditée, le timing des beats avals et scripts/validate-beat-sync.mjs fonctionnent sans ajustement supplémentaire.