Recursive AI

Silero voice activity detection

All onespeech docs

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.