---
title: "Silero voice activity detection"
url: https://recursiveai.org/onespeech/docs/vad/
description: "The core assembly embeds the unmodified silero_vad.onnx from Silero VAD v6.2.3, revision 5cd7945676eb32225748052e2e6a0580e4686a08, SHA-256…"
version: "1.0.0"
source: https://github.com/recursive-ai-oss/onespeech-csharp/blob/63002de486786163a0a7800a51811e76d511fae6/docs/vad.md
---

# Silero voice activity detection

The core assembly embeds the unmodified `silero_vad.onnx` from Silero VAD v6.2.3, revision `5cd7945676eb32225748052e2e6a0580e4686a08`, SHA-256 `1a153a22f4509e292a94e67d6f9b85e8deb25b4988682b7e174c65279d8788e3`. It runs on OneModel 1.0.0 in float32 fast arithmetic with one inference thread. The MIT attribution is in `THIRD-PARTY-NOTICES.md`. Weights are not stored in the source tree: building downloads the pinned release model to the external artifacts directory, or accepts an existing file through `-p:SileroModelPath=...`, and verifies its digest before embedding.

`SileroVad` accepts mono PCM at 8,000 or 16,000 Hz. `Detect` creates fresh recurrent state for each recording. Frames are 32 ms: 256 or 512 samples respectively. Each graph input prepends the previous 4 ms of PCM (32 or 64 samples), initially zeros; the recurrent state is initially zeros of shape `[2,1,128]`, and the returned `stateN` becomes the next state. The final short frame is right-padded with zeros; reported intervals are clipped to the actual input duration. An empty input produces no intervals. `CreateState` exposes the same frame processing for callers needing uninterrupted recurrence, and `Reset` starts a new recording. State instances are not thread-safe; the detector must outlive them.

Segmentation uses audio sample positions, not elapsed wall time. The defaults are activation probability 0.5, deactivation probability 0.35, minimum speech 250 ms, minimum silence 100 ms, and 30 ms padding. Activation begins a candidate interval at that frame's start. A probability below the deactivation threshold starts a silence candidate; it closes speech once the silence has lasted at least the configured duration, placing the end at the silence candidate's start. Activation cancels a pending silence candidate. Intermediate probabilities leave the candidate unchanged. Only speech strictly longer than the minimum is retained. A recording ending in active speech closes at the real input length. Padding is clipped to the recording, and adjoining intervals share the intervening gap equally when both pads would overlap. Cancellation is checked before loading/inference and at each frame.

The frame/context protocol and segmentation defaults are checked using only the published model data and black-box calls to `silero-vad` 6.2.3's public API. The targeted probe set comprises three LibriSpeech test-clean clips, a decimated 8 kHz version of one clip, and seeded synthetic silence/noise. The float32 probability tolerance is max absolute error ≤1e-5; this is cross-runtime fast-mode numerical parity, not a bit-exact arithmetic claim. Segment counts must match, and default-parameter boundaries must agree to within one sample. `tools/oracles/silero` contains the pinned evaluation-only harness; no oracle code or runtime is shipped.
