The current model IDs are
vad-ms-2.1-xxs-16khz and vad-vf-2.0-s-16khz. Earlier IDs and naming changes are listed in renamed models. Preserve the exact ID when reproducing a deployment.What is VAD?
VAD identifies speech in an audio stream. Voice agents use it for turn-taking, endpointing and gating downstream speech-to-text (STT). Both models run independently of enhancement. Compare whose speech they detect under model differences.Use cases
VAD supplies speech activity, not a complete semantic end-of-turn decision. Your pipeline decides how to combine it with transcription, turn detection and interruption policies.- Gate downstream work. Use activity to decide which audio to send to STT, while preserving enough leading and trailing audio to avoid clipping words.
- Drive turn-taking. Evaluate the speech-start and speech-stop events used by your voice agent. Check quiet speech, pauses and competing speakers.
- Measure the trade-off. Track missed speech and false activity separately. Any cost or transcription benefit depends on the audio and downstream provider.
How it works
The VAD is a standalone object with its own lifecycle, independent of enhancement:- Load a dedicated VAD model,
vad-ms-2.1-xxs-16khzorvad-vf-2.0-s-16khz - Create a VAD from that model and initialize it for your sample rate and block size
- Feed each mono audio block to the VAD
- Query its context to see whether speech was detected
aic-sdk==3.3.0 and numpy==2.2.6. Save it as vad.py, set AIC_SDK_LICENSE in the same terminal and run python vad.py input.wav with a mono, 16 kHz, signed 16-bit PCM WAV. See the Python setup instructions for the environment and key setup.
The example loads VAD Multi Speaker. To use VAD Voice Focus, replace vad-ms-2.1-xxs-16khz with vad-vf-2.0-s-16khz in the model download call. The processing API is the same for both models.
vad.py
block_start_sample is the uncompensated input position. Final-block padding does not flush all delayed predictions. Successful processing alone does not establish detection accuracy.
If model loading fails, check the download path and SDK/model compatibility. If construction or processing fails, inspect the SDK error and key entitlement, correct the problem and rerun. Do not treat all-false decisions as a successful quality test without checking the input and error logs.
Between SDK 0.22.0 and 0.24.0, a dedicated VAD model was the only option: the earlier energy-based VAD derived from an enhancement processor had been removed. Core SDK 0.25.0 brought energy-based detection back under a new API,
EnergyVadContext, so an enhancement processor can report speech again without a separate VAD model. A dedicated VAD model remains the more accurate choice. See Migrate to the dedicated VAD for the differences.Model differences
Both models run independently of enhancement. Neither requires Quail Voice Focus, Quail Multi Speaker or Rook Multi Speaker to be present in the signal chain.
Using VAD alongside enhancement
Run the VAD and the enhancement processor side by side on the same original input block, rather than chaining them:VAD parameters
Read the three parameter defaults from the loaded model through its VAD context. Use these model-specific values as your tuning baseline.Sensitivity
Sensitivity
The probability threshold used to decide whether speech is detected.A block probability above this threshold triggers a speech-detected decision. Higher thresholds require more model confidence and detect speech less aggressively. Confidence does not guarantee a correct classification.Read
raw_vad_probability() on the Python VAD context to see the model’s probability before thresholding
and post-processing. This is the most practical way to choose a threshold from recorded audio.- Range:
0.0to1.0 - Default: model-specific
Speech hold duration
Speech hold duration
Stabilizes speech-to-silence transitions. When the current probability is at or below the sensitivity threshold, speech remains detected while at least 50% of retained frames were above threshold. This history spans approximately
speech_hold_duration * 2 seconds. Above-threshold decisions instead use the consecutive-frame requirement set by minimum speech duration.
With a 0.5 s hold duration and a full history of speech, detection continues for approximately 0.5 s after speech ends. Further speech changes the history and can extend the hold.Effective timing is rounded to the nearest model window, such as a multiple of 15 ms.
get_parameter() returns the stored requested value, not the effective timing.- Unit: seconds
- Range:
0.0to 300x the model window length. For the two 15 ms models listed here, this is 4.5 s - Default: model-specific
Minimum speech duration
Minimum speech duration
Sets how long speech must be present before detection, stabilizing silence-to-speech transitions.
Effective timing is rounded to the nearest model window, such as a multiple of 15 ms.
get_parameter() returns the stored requested value, not the effective timing.- Unit: seconds
- Range:
0.0to1.0 - Default: model-specific
API reference by language
Use your binding’s reference for initialization, parameter values and prediction queries.Best practices
- Choose whose speech should count. Use VAD Multi Speaker for activity from any speaker or VAD Voice Focus for a primary-speaker task.
- Tune against labeled audio. Read model defaults through
get_parameterand evaluate sensitivity and timing with speech, silence, quiet utterances and interfering speakers. - Feed original audio. Run dedicated VAD beside enhancement on the same input signal. Preserve mono format and process blocks in order.
- Align the timeline. Read the VAD’s prediction delay separately from the enhancement processor’s audio delay.
- Keep session state separate. Use one VAD per independent stream. Reset at a discontinuity and terminate after the stream is finished.
Framework integration
Framework adapters can override SDK timing defaults or use a different state machine. The LiveKit quickstart requires both the session VAD and its RoomIO frame processor. The Pipecat quickstart uses PipecatVADParams and explains why a transport enhancement filter feeds enhanced audio to downstream VAD. Do not copy timing values between frameworks without checking their units and behavior.