use std::path::Path;
use std::time::Instant;
use decibri::vad::{SileroVad, VadConfig};
const ITERATIONS: usize = 10_000;
const WINDOW_SAMPLES: usize = 512;
const SAMPLE_RATE: u32 = 16_000;
fn main() {
let manifest_dir = env!("CARGO_MANIFEST_DIR");
let model = Path::new(manifest_dir)
.join("..")
.join("..")
.join("models")
.join("silero_vad.onnx");
if !model.is_file() {
panic!(
"bench_vad: silero model not found at {}. Cannot benchmark.",
model.display()
);
}
let config = VadConfig {
model_path: model,
sample_rate: SAMPLE_RATE,
threshold: 0.5,
ort_library_path: None,
};
let mut vad = SileroVad::new(config).expect("SileroVad construction should succeed");
let chunk: Vec<f32> = (0..WINDOW_SAMPLES)
.map(|i| {
let t = i as f32 / SAMPLE_RATE as f32;
(2.0 * std::f32::consts::PI * 440.0 * t).sin() * 0.5
})
.collect();
for _ in 0..100 {
vad.process(&chunk).expect("warmup process should succeed");
}
let mut samples_ns = Vec::with_capacity(ITERATIONS);
for _ in 0..ITERATIONS {
let start = Instant::now();
vad.process(&chunk).expect("bench process should succeed");
samples_ns.push(start.elapsed().as_nanos() as u64);
}
samples_ns.sort_unstable();
let p50 = samples_ns[samples_ns.len() / 2];
let p99 = samples_ns[(samples_ns.len() * 99) / 100];
println!("iterations = {ITERATIONS}");
println!("window_samples = {WINDOW_SAMPLES}");
println!("sample_rate = {SAMPLE_RATE}");
println!("p50 = {p50} ns");
println!("p99 = {p99} ns");
}