Silence Detection
Silence detection is the automatic identification of spans in an audio track where the signal stays below a loudness threshold for at least a minimum duration. It is defined by three numbers: a threshold, usually expressed in dBFS, that decides what counts as quiet; a minimum duration that stops brief dips being reported as silence; and a padding value that leaves a margin of audio around the speech on either side of the span. Crucially it measures level, not speech — a pause recorded over a fan, a music bed or game audio never crosses the threshold at all, which is why serious implementations locate gaps between words in a transcript rather than, or alongside, testing the waveform.
The Three Numbers
Every silence detector, from a 20-line script to a commercial NLE, is the same algorithm with different names on the parameters. Understand the three and you can tune any of them.
1. Threshold — how quiet counts as quiet
Measured in dBFS (decibels relative to full scale), where 0 dBFS is the loudest a digital sample can be and everything real is negative. −60 dBFS is an amplitude ratio of 0.001; −35 dBFS is about 0.018. The threshold has to sit above the file's noise floor and below its quietest speech. That window is what makes the number a property of the recording rather than a preference.
2. Minimum duration — how long it has to stay there
Without this, a detector fires between every syllable. Natural speech is full of sub-second silence: the closure of a stop consonant is 50–100 ms of it, and a sentence-internal breath is 200–500 ms. Anything below roughly 200 ms is inside phonetics, not inside editing. ffmpeg defaults to a deliberately conservative 2 seconds; an editing pass usually wants 0.4–0.8 s.
3. Padding — how much you give back
The margin left on each side of the detected span so the cut lands in the pause rather than against the speech. Padding is the parameter people forget exists, and it is the one that decides whether the result sounds edited or sounds broken. 100–250 ms per side is the workable range for speech.
Here is what the numbers actually are, across the implementations most tools are built on:
| Implementation | Threshold | Minimum duration | Padding |
|---|---|---|---|
| ffmpeg silencedetect | −60 dBFS (0.001 amplitude) | 2.0 s | none — reports, never cuts |
| ffmpeg silenceremove | 0 amplitude — exact digital silence | 0 s | start_silence / stop_silence |
| pydub split_on_silence | −16 dBFS | 1000 ms | 100 ms kept |
| Silero VAD | 0.5 speech probability, ends at 0.35 | 100 ms of silence | 30 ms |
| faster-whisper VAD | 0.5 speech probability | 2000 ms of silence | 400 ms |
| Valmera (waveform pass) | −35 dBFS | 0.6 s | 0.12 s each side on the cut |
Two of those defaults are traps. pydub's −16 dBFS is close to normal speech level, so on a typical recording it classifies most of the file as silence — it is a placeholder, not a recommendation. And silenceremove's thresholds default to 0 amplitude, which means exact digital silence: run it without arguments on a real recording and it removes nothing, which reads as a broken filter rather than an unset parameter.
How the Measurement Actually Works
A detector does not evaluate individual samples. It slides a short window over the signal, reduces each window to one number, and compares that number to the threshold. ffmpeg's silenceremove uses a 20 ms window by default and, since FFmpeg 7, an rms detection mode rather than peak. That choice matters more than it looks: peak takes the largest sample in the window, so one stray transient — a mouse click, a chair creak — keeps a two-second pause from ever being reported. RMS takes the root mean square, which tracks energy over the window and is much closer to what a listener would call loudness.
A single fixed threshold also chatters. When the signal hovers right at the boundary, the state flips open and closed dozens of times a second and you get a shredded list of 30 ms silences. The standard fix is hysteresis: two thresholds instead of one, with a band between them where nothing changes. Silero VAD does this explicitly — speech opens at a probability of 0.5 and does not close until the probability falls below 0.35 (threshold − 0.15), so the boundary is stable instead of oscillating. Gate designers call the same idea attack, hold and release.
The deeper limitation is that energy is not speech. Level-based detection cannot distinguish a quiet sibilant from room tone at the same level, and cannot distinguish a pause over a music bed from someone talking. Classifiers close that gap by looking at the shape of the signal rather than its size — historically the zero-crossing rate, which is high for the unvoiced fricatives that energy detection keeps losing, and today a small neural VAD scoring 30 ms frames. The most reliable method for edited speech skips both and reads the gaps between word-level timestamps from a transcript, because a gap between two recognised words is a gap in the talking, whatever else is on the track.
Why Naive Silence Removal Clips Breaths and Consonants
The failure has a physical cause, and it is not fixable by tuning. English phonemes span an enormous dynamic range: the difference between the strongest vowel and the weakest voiceless fricative is roughly 27–28 dB — the vowel carries several hundred times the energy of the "th" in thin. A threshold placed a safe few dB above a −45 dBFS room floor therefore sits above a good part of your consonant inventory.
Trailing fricatives get eaten
A word ending in /s/, /f/, /θ/ or /ʃ/ decays under the threshold before it has finished. Cut at the threshold crossing and plans becomes plan, enough loses its ending, and every plural in the video sounds subtly wrong in a way viewers notice without being able to name.
Stop consonants contain real silence
/p/, /t/, /k/, /b/, /d/ and /g/ are produced by sealing the vocal tract, and that closure is genuinely silent for roughly 50–100 ms before the burst. Word-initial voiceless stops in English then add 30–100 ms of aspiration before voicing starts. Set a minimum duration of 50 ms and your detector will confidently report silence in the middle of important.
Breaths carry timing information
An inhale is 200–500 ms of low-level noise, and it is one of the strongest cues a listener has that a new thought is starting. Strip every one and the result is the airless, gasping quality of over-auto-edited video: technically shorter, considerably harder to listen to.
The noise floor jumps at the splice
This one has nothing to do with speech. Butting two ranges of a noisy room against each other creates a discontinuity in the ambience — an audible tick or a pump at every junction, and the more cuts you make the more of them there are. Film sound solves it by recording 30–60 seconds of room tone and laying it under the gaps. Padding mitigates it; a short audio crossfade or room-tone fill removes it.
What a Good Implementation Preserves
- Word boundaries, not threshold crossings. The single largest quality win. If word timestamps exist, move every cut boundary outward to the nearest word edge; a whole word either survives or it does not, and the clipped-consonant failure disappears entirely.
- Asymmetric padding. A phrase ends by decaying into room reverb and wants more margin; the next phrase starts abruptly and needs less. Most tools expose one number for both sides, which is a simplification rather than a truth.
- A floor on how little it will remove. Cutting 80 ms saves nothing and disturbs the rhythm of the sentence. If padding has reduced a span below that floor, the honest answer is to leave it alone.
- Hysteresis. Two thresholds so the detector cannot chatter along the boundary and produce dozens of unusable fragments.
- Disclosure when the gap was not actually quiet. A pause over game audio or a music bed is still cuttable, but cutting it removes that sound too. A tool that reports it as "silence removed" is describing something that did not happen.
- Reversibility. The cut should be a range subtracted from an edit decision list, not bytes deleted from a file, so a threshold that turned out to be too aggressive is a setting you change rather than a take you re-record.
Notice that only the last two are engineering choices. The first four are all versions of the same instruction: stop treating the audio as a level and start treating it as speech.
A Scenario Where It Shows
You record a 22-minute software tutorial at your desk. A laptop fan runs the whole time and puts the room floor at about −44 dBFS. You run silencedetect at its defaults and it reports nothing at all, because the signal never spends two continuous seconds below −60 dBFS. The file looks, to the tool, like 22 minutes of uninterrupted sound.
So you raise the tolerance to −30 dB and shorten the duration to 0.4 s. Now it finds 180 spans — and the export is worse than the original. The fan is gone from the pauses, which makes the ambience pump at every one of the 180 splices. Half your plurals have lost their /s/. The pause you actually wanted gone, the eleven-second stretch where you were reading the error message on screen, was not found, because you were mousing around and the clicks kept the level up.
Nothing about that is a tuning problem. There is no threshold between −44 and your quietest consonants, because your quietest consonants are down there with the fan. The only move that works is to change the question: find the spans where nobody was talking using the transcript's word timings, keep 120 ms either side, snap the boundaries to whole words, and leave the fan noise continuous underneath.
Common Misconceptions
"Silence detection finds pauses."
It finds quiet. A pause and a quiet passage are the same thing only in a treated room. Over music, gameplay, traffic or a fan they are unrelated, and the detector will report zero silences in a recording containing minutes of nobody speaking.
"Just lower the threshold until it works."
There are two failure directions and you are between them. Too low and nothing is detected; too high and it starts eating consonants and word tails. On a noisy recording the safe window can be empty, and no value satisfies both constraints — which is a signal to change method, not to keep turning the dial.
"Silence means the samples are zero."
Digital silence is all-zero samples and is essentially never present in a real recording. Perceptual silence is anything below the point where a listener stops hearing content. ffmpeg has both behaviours in the same toolbox: silencedetect defaults to the perceptual reading at −60 dBFS, while silenceremove defaults to the literal one at 0 amplitude.
"Minimum duration is a taste setting."
Above about 300 ms it is. Below 200 ms it is a phonetics setting, because that is the region where stop closures and inter-syllabic gaps live. A minimum duration of 50 ms is not an aggressive edit; it is a detector that has been pointed at the wrong thing.
"Removing more silence makes a video tighter."
Up to a point. Pauses are the punctuation of speech — they mark clause boundaries and give a listener room to keep up. Past the sentence-boundary pauses you are not removing dead air, you are removing structure, and the result is shorter and harder to watch. The measurable win is in the multi-second stalls and restarts, not in the last 200 ms of every gap.
"VAD and silence detection are interchangeable."
They answer different questions — "is someone speaking?" versus "is it quiet?" — and they agree only on clean speech in a quiet room. That agreement is exactly why the distinction gets missed, and exactly why tools built on the level test surprise people the first time they open a noisy file.
How This Works in Valmera
Valmera is an agentic video editor, so silence removal is something the agent performs rather than a slider you set. It runs both detections and treats them as different measurements, because they are:
- A waveform pass at upload. Every video is indexed once with ffmpeg's
silencedetectat −35 dBFS over a minimum of 0.6 s. The threshold is well above ffmpeg's default on purpose: real uploads are phones and laptops in real rooms, and a −60 dBFS gate finds nothing in them. - Speech gaps as the primary basis. What the agent actually cuts are the spans between recognised words in the word-level transcript. That works on a gameplay clip or a video with a music bed, where the waveform never drops and the level test correctly reports nothing.
- Defaults of 0.5 s and 0.12 s. The one-call cut removes gaps of half a second or longer and keeps 120 ms of breathing room on each side. Both are arguments, so "only the really long pauses" and "tighter" are things you can just say.
- Boundaries snap outward to whole words. If a cut edge lands inside a word, it moves to that word's start or end. This is the mechanism that makes the clipped-consonant failure structurally impossible rather than merely unlikely.
- It reports when a gap was not quiet. Each gap is scored for how much of it is also below the noise floor. When the agent cuts pauses that had music or game audio in them, it says so instead of calling them silences — you were about to notice at the first junction anyway.
- Nothing is deleted. The cut is a range subtracted from a keep list in the edit decision list; the original upload is untouched and anything cut can be restored by asking.
The honest limits. Padding is a single symmetric value, not separate lead-in and lead-out. Cuts are hard splices — Valmera has no true crossfade or dissolve and does no room-tone fill, so on a genuinely noisy recording you will hear the floor change at a junction, and padding is the only mitigation. Gap detection is only as good as the transcription underneath it, and English is the best-tested path. And a video with no speech at all and continuous audio has nothing this method can call a silence — in that case the agent says so and asks which parts to keep, rather than guessing pauses from the picture. The full behaviour of find_silences and cut_silences is published in the tool reference.
Related Terms
Other entries in the Valmera video editing glossary that touch this one:
- Word-level timestamps — The clock a good silence cut snaps to — a word edge is a real boundary, a threshold crossing is not.
- Transcription and ASR — Where those word timings come from, and the ceiling on how well speech gaps can be found.
- Edit decision list — Where a removed pause actually lives: a range subtracted from a keep list, restorable at any time.
- Jump cut — What silence removal produces at every junction — the visual bill for the audio tightening.
- B-roll — The standard cover for the jump cuts a silence pass leaves behind.
- J-cut and L-cut — Letting picture and audio cut at different points, which softens a hard splice a straight silence cut cannot.
- LUFS and loudness normalization — The other level measurement — and it runs its own absolute gate at −70 LUFS for related reasons.
- Text-based video editing — Deleting a pause by deleting it from the transcript, which is silence detection with a different interface.
Frequently Asked Questions
Cut the Dead Air Without Cutting the Consonants
Upload real footage and say how long a pause has to be before it goes. Cuts snap to word edges, and anything removed can be restored. 50 free credits, no card.
Start free →