The last detected speech section in our test begins 11.490 seconds into the original recording. Remove the gaps, join the selected sections together, and it begins at 4.760 seconds. Both timestamps are correct. They refer to different files.
That small displacement becomes consequential when somebody wants to find a quotation in an interview, match a transcript to a video or return to the surrounding conversation. A shorter audio file is useful; the route back to the original makes it much more useful.
Silero VAD supplies the first part of that workflow. VAD means voice activity detection: the model identifies intervals likely to contain speech. Its output can guide cuts or select material for a later transcription system. Silero distributes the model under the MIT licence and provides local Python examples.[1]
What happened in our recording
For this demonstration on 18 October, we generated three original English sentences with FFmpeg’s flite speech synthesiser, separated them with digital silence, then added a one-second 440 Hz tone and more silence. The complete mono recording was 19.785 seconds long, sampled at 16,000 Hz. These were artificial test conditions, not an interview or a test of performance in background noise.
We ran the pinned Silero ONNX model locally on a CPU, using the project’s own probability-to-interval function. With a speech threshold of 0.5, a minimum speech duration of 250 milliseconds, a minimum silence duration of 100 milliseconds and 30 milliseconds of padding, it selected three sections: 2.242–4.478 seconds, 6.754–9.278 seconds and 11.490–14.654 seconds. None overlapped the inserted silence or tone.
Joined together, those sections lasted 7.924 seconds. That removed 11.861 seconds, or 59.95% of this deliberately padded recording. The percentage describes our constructed example; it is not an estimate of savings on ordinary recordings. We did not score transcription accuracy or certify that every speech sound survived the boundaries.
The companion timestamp file preserved both clocks. The second section occupied 6.754–9.278 seconds in the source and 2.236–4.760 seconds in the edited audio. For a position inside that section, add 4.518 seconds to recover its original location. Each section needs its own offset because each removed gap changes the relationship.
Try the documented Python route
You need a computer with Python and audio-decoding support. The packaged route uses PyTorch; its installation guide describes optional dependencies. Our test used ONNX Runtime with a local WAV reader. The steps below are the maintainers’ documented package route.[1][3]
- Start with a copy of a short recording whose words and pauses you know. Keep the original unchanged.
- Install the documented audio package with python -m pip install 'silero-vad[audio]'. If your environment needs an audio backend, follow the repository’s FFmpeg guidance.
- In Python, import load_silero_vad, read_audio and get_speech_timestamps from silero_vad. Set model = load_silero_vad(), then audio = read_audio('recording.wav', sampling_rate=16000).
- Set timestamps = get_speech_timestamps(audio, model, sampling_rate=16000). The normal result contains start and end sample positions. Save those positions before making cuts; divide them by 16000 when you want seconds.
To build the second clock, begin the edited timeline at zero. For each selected interval, subtract its start sample from its end sample to find its length. Place that interval after the previous one, record the new start and end, then advance the edited timeline by its length. Keep one row per interval with its source start, source end, edited start and edited end. These four values are enough to translate a later timestamp back to the recording.
Save those rows as speech-timestamps.csv. To create the listening copy, also import collect_chunks and save_audio from silero_vad, then run save_audio('speech-only.wav', collect_chunks(timestamps, audio), sampling_rate=16000). Use the sample-based timestamps here. The resulting WAV joins the selected source sections in their original order.[3]
Listen at the joins
A detector works in short windows and then groups its predictions into intervals. The padding setting gives the selected speech extra room at the edges. The minimum-silence setting governs how long a low-speech stretch must last before it separates sections. If pauses within a sentence produce unwanted fragments, increasing that setting is a targeted adjustment; the supplied default is 100 milliseconds.[2]
Before using the result, listen to the start and end of each selected section. Keep more surrounding audio when a clipped consonant, breath or meaningful pause matters. Check the input format if detection fails entirely, and use a short known passage to separate a loading problem from a model decision. A detected speech interval does not tell you who spoke or what they said.
The practical deliverable is a pair: a convenient listening copy and a timestamp map. In our example, the final section began 6.730 seconds earlier in the edited file. Retaining that relationship means an editor can enjoy the shorter file and still find the passage exactly where it occurred.
Sources & further reading
- Silero VAD: source repository and installation instructions Silero Team · Accessed 18 Oct 2026
- Silero VAD utilities at commit 1e261b036686cd0017d500ee96acd1c4ba572a9d Silero Team · Accessed 18 Oct 2026
- Examples and Dependencies Silero Team · Accessed 18 Oct 2026