
Downmixes each AudioFrame to mono at 16 kHz and runs Silero VAD, emitting speech spans as [{start: Double, end: Double}] in seconds relative to the frame — local speech intervals for trimming, gating, or routing.
Pre-ASR gate after denoising — only speech spans reach the recognizer.
Speech-present routing — span output drives an expression gate.
Speech detection feeding an end-of-turn detector for conversational gating.
AudioFrame, not absolute stream time, so carry a sibling timestamp or accumulate a frame offset downstream if absolute times are needed. Multi-channel input is mixed to mono before resampling.AudioFrame emits exactly one span list and never drops a message. An empty frame returns an empty list without invoking the model; silence returns an empty list; an unexpected fault (such as a non-positive sample rate) is logged and also returns an empty list.threshold is the per-frame speech-probability cutoff, min_speech_duration_ms drops too-short spans, min_silence_duration_ms sets how much silence splits one utterance into two, and speech_pad_ms pads the final spans. All four are re-read on every tick, so live tuning takes effect on the next call without a restart.device is captured once at startup and switching CPU/GPU needs a redeploy; a value starting with `cuda` silently falls back to CPU when CUDA is unavailable.Automated release