three-tier VAD cascade + turn-end state machine
Tier 1: energy gate
cheap, fires on every noise
if RMS > -40 dBFS → "speech"
filters silence but NOT
keyboard / cough / chair
Tier 2: Silero VAD
the 2020-2026 default
1M params · 1 ms / 30 ms chunk
87.7% TPR @ 5% FPR
trained on 6000+ languages
MIT · open · rejects transients
Tier 3: semantic turn detector
LiveKit turn-detector / custom
VAD + recent-words classifier
pauses mid-sentence vs done
("hmm, let me think..." stays)
reduces false-interrupt by 5-10%
turn-detection state machine
state: "idle" ─ VAD fires > 250 ms of speech ─→ state: "speaking" (emit START)
state: "speaking" ─ VAD silent for 500 ms ─→ state: "idle" (emit END)
pre-roll buffer (300 ms): keep audio BEFORE VAD fires, else first word gets clipped
min speech (250 ms): reject transients; silence hangover (500 ms): tune per use case
the flush trick (Kyutai Unmute 2025) — sub-200 ms end-to-end
1. VAD fires end-of-speech at t=0
2. send buffered audio + flush signal to STT server
3. STT processes at 4× realtime → 500 ms look-ahead buffer → 125 ms wall time
4. transcript ready at t+125 ms — same latency as the VAD signal itself