Skip to main content

Fast Silero VAD

CI status PyPI version Python 3.12, 3.13, and 3.14 Linux and macOS Typed Python package Linted with Ruff Apache-2.0 license

Fast Silero VAD combines a streamlined ONNX graph with an optimized spectral frontend to improve CPU throughput while preserving numerically equivalent speech probabilities.

Benchmarks

Apple M4 Max (single thread)
AMD EPYC 9655 (single thread)
Speedup by input duration on Apple M4 Max Speedup by input duration on AMD EPYC 9655
RTFx by input duration on Apple M4 Max RTFx by input duration on AMD EPYC 9655

Solid lines measure probability inference. Dashed lines include speech segmentation. RTFx is a ratio of input audio duration to processing time.

  • Upstream throughput plateaus. From 32 to 1024 ms, official Python Silero moves only from 392 to 457 RTFx on AMD and from 371 to 390 RTFx on M4. The official C++ implementation is effectively flat at 574 to 571 RTFx on AMD and 444 to 437 RTFx on M4.
  • The gain reproduces across CPU families. At 1024 ms, Fast RFFT reaches 1,448 RTFx on Linux/x86-64 and 1,165 RTFx on macOS/arm64: 3.17x and 2.98x the throughput of official Python, and 2.53x and 2.67x that of official C++.
  • The graph rewrite pays off without RFFT. Standard Fast ONNX reaches 1,147 RTFx on AMD and 755 RTFx on M4 at 1024 ms. That is 2.51x and 1.93x the Python baseline, or 2.01x and 1.73x the C++ baseline.
  • RFFT provides the largest incremental gain. The custom spectral frontend adds another 26% on AMD and 54% on M4 over the standard Fast ONNX graph at 1024 ms.
  • The full VAD inference with segmentation keeps the gain. The complete RFFT pipeline with Numba-optimized segmentation reaches 1,438 RTFx on AMD and 1,162 RTFx on M4, only 0.7% and 0.3% below probability inference alone. It delivers 3.15x and 2.98x the throughput of official Python Silero VAD, and 2.52x and 2.66x that of the official Silero VAD C++ implementation.

Measurements use deterministic 16 kHz mono audio, one ONNX Runtime thread, and 50 warmups. Values are medians of 500 runs. Model loading and WAV decoding are excluded.

The Python baseline uses load_silero_vad(onnx=True).audio_forward(). The C++ baseline uses the pinned upstream examples/c++ implementation compiled with C++20, -O3, and -DNDEBUG.

Quick Start

Install Fast Silero VAD with the export dependencies:

pip install "fast-silero-vad[export]"

The RFFT export requires a C++20 compiler available as c++ and network access on the first run.

Export

Export a 16 kHz offline bundle with the optimized RFFT frontend:

fast-silero-vad-export \
  --output-dir-path models/fast_silero_vad_16k \
  --model-type offline_vad \
  --vad-branch 16k \
  --threshold 0.01 \
  --min-speech-duration-ms 100 \
  --max-speech-duration-ms 30000 \
  --min-silence-duration-ms 1000 \
  --speech-pad-ms 300 \
  --use-onnxruntime-custom-op

The exporter uses the JIT checkpoint bundled with silero-vad>=6.2.1 and writes the runtime and segmenter settings to model_config.yaml. For streaming, use a new output directory and --model-type streaming_vad. Use --vad-branch 8k to export an 8 kHz bundle.

CLI

fast-silero-vad \
  --model-dir models/fast_silero_vad_16k \
  --wav-dir /path/to/wav/files \
  --output-path segments.tsv

Python

The API accepts one-dimensional normalized floating-point audio. Offline models reset after each call:

import numpy as np

from fast_silero_vad import VAD

audio = np.zeros(16000, dtype=np.float32)

vad = VAD("models/fast_silero_vad_16k")
vad.apply_samplerate(16000)
segments = vad(audio)

A streaming model preserves state until final=True:

vad = VAD("models/fast_silero_vad_16k_streaming")
vad.apply_samplerate(16000)

segments = []
for start in range(0, len(audio), 1600):
    end = min(len(audio), start + 1600)
    segments.extend(vad(audio[start:end], final=end == len(audio)))

Why Fast Silero VAD Scales

At 16 kHz, each Silero window is 512 samples, or 32 ms. The official wrapper executes one ONNX Runtime call per window (see audio_forward and get_speech_timestamps). Longer audio therefore increases the number of calls linearly and leaves RTFx roughly flat.

Fast Silero VAD returns the same 32 ms probability sequence with two independent optimizations:

  1. Multi-window execution: one ONNX Runtime call processes multiple 32 ms windows.
  2. RFFT frontend: a C++ ONNX Runtime custom operator replaces the Conv1d Fourier basis with a real FFT.

The standard Fast ONNX graph gains more as input grows because one ONNX Runtime call handles more 32 ms windows, amortizing Python, tensor binding, and graph dispatch overhead across the input. At 32 ms there is only one window, so multi-window execution offers almost no advantage in this case; most of the speedup comes from the real FFT frontend.

Numerical Equivalence

Numerically equivalent means float32-close, not bit-identical. The export equivalence tests run 12 seeded PCM chunks statefully through the original Silero JIT checkpoint and through both standard and real FFT exports at 8 kHz and 16 kHz. Every speech probability must match within rtol=1e-4 and atol=1e-6.

Reproducing

These commands reproduce the duration sweep. They require uv, a C++20 compiler named c++, and network access on the first run. ONNX Runtime is limited to one thread.

Setup

pip install uv
uv sync --frozen --extra export --extra plot
mkdir -p benchmarks/output/m4_max

EXPORT_ARGS=(
  --model-type offline_vad
  --vad-branch 16k
  --threshold 0.01
  --min-speech-duration-ms 100
  --max-speech-duration-ms 30000
  --min-silence-duration-ms 1000
  --speech-pad-ms 0
)

uv run --frozen --extra export fast-silero-vad-export \
  --output-dir-path models/benchmark_standard_16k \
  "${EXPORT_ARGS[@]}"

uv run --frozen --extra export fast-silero-vad-export \
  --output-dir-path models/benchmark_custom_op_16k \
  "${EXPORT_ARGS[@]}" \
  --use-onnxruntime-custom-op

Python generates its input in memory. Create the equivalent mono 16-bit WAV for the original Silero VAD C++ harness:

uv run --frozen --extra export python - <<'PY'
import wave
from pathlib import Path

import numpy as np

from benchmarks.utils import make_synthetic_audio

output_path = Path("benchmarks/output/m4_max/synthetic_1024ms.wav")
audio = make_synthetic_audio(1.024, 16000)
pcm = np.clip(audio * (2**15 - 1), -32768, 32767).astype(np.int16)

with wave.open(str(output_path), "wb") as output:
    output.setnchannels(1)
    output.setsampwidth(2)
    output.setframerate(16000)
    output.writeframes(pcm.tobytes())
PY

Python

uv run --frozen --extra export python -m benchmarks.duration_sweep \
  --standard-model-dir models/benchmark_standard_16k \
  --custom-op-model-dir models/benchmark_custom_op_16k \
  --durations-ms 32 64 128 256 512 1024 \
  --samplerate 16000 \
  --threshold 0.01 \
  --min-speech-duration-ms 100 \
  --max-speech-duration-ms 30000 \
  --min-silence-duration-ms 1000 \
  --speech-pad-ms 0 \
  --warmup 50 \
  --repeats 500 \
  --output-tsv-path benchmarks/output/m4_max/python.tsv

C++

The builder downloads the pinned upstream source and matching ONNX Runtime headers, then packages the runtime library beside the executable.

uv run --frozen --extra export python benchmarks/cpp/build.py

OFFICIAL_ONNX=$(find .venv -path '*/silero_vad/data/silero_vad.onnx' -print -quit)

benchmarks/cpp/build/vad_benchmark \
  "$OFFICIAL_ONNX" \
  benchmarks/output/m4_max/cpp.tsv \
  50 500 \
  benchmarks/output/m4_max/synthetic_1024ms.wav \
  0 \
  32 64 128 256 512 1024

Plots

uv run --frozen --extra plot python -m benchmarks.plot_benchmark \
  --input-tsv-path \
    benchmarks/output/m4_max/python.tsv \
    benchmarks/output/m4_max/cpp.tsv \
  --output-dir-path docs/plots/m4_max \
  --formats svg

License

Fast Silero VAD source code is licensed under Apache-2.0. Exported model weights are derived from Silero VAD and remain subject to the Silero VAD MIT License. This project is independent and is not affiliated with or endorsed by the Silero Team. See the project NOTICE.

Metadata

Release files for fast-silero-vad 0.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fast-silero-vad 0.1.2
File Size Uploaded Provenance Actions
fast_silero_vad-0.1.2.tar.gz 69.4 kB With provenance Details for fast_silero_vad-0.1.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for fast-silero-vad 0.1.2
File Interpreter ABI Platform Actions
fast_silero_vad-0.1.2-py3-none-any.whl Python 3 none any Details for fast_silero_vad-0.1.2-py3-none-any.whl

Total release size: 116.2 kB

Release files / fast_silero_vad-0.1.2.tar.gz

Download URL fast_silero_vad-0.1.2.tar.gz
Size 69.4 kB
Tags Source
SHA-256 checksum
How to use checksums
81b3eeb55e329a34aea042807652ccc57a8c190c57d34977866feff56b1b4ebd
BLAKE2b-256 checksum
How to use checksums
bda71f1ac50f5443812d993d21a39959e731132a66a9aec187c500f008c2731b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 18, 2026.

Transparency log

Release files / fast_silero_vad-0.1.2-py3-none-any.whl

Download URL fast_silero_vad-0.1.2-py3-none-any.whl
Size 46.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
02838d84560ef8f14c8c5c6524756efe7f92efa2fdebcb2bc98eb5d1ca4e355c
BLAKE2b-256 checksum
How to use checksums
3d7e3557bc013d5dedbad79b21ba10949a325b8c349665cac66e917ad68d753c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 18, 2026.

Transparency log

Security for fast-silero-vad 0.1.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for fast_silero_vad-0.1.2.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 18, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.2 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page