Skip to main content
Before: the VAD was a side effect of enhancement. It inferred speech from how much energy was left after the enhancement model suppressed non-speech, so its accuracy depended on which model you ran. Now: the VAD is its own object, running a model trained for the task. You create it from a dedicated VAD model and drive it yourself.
This is not a drop-in replacement. Sensitivity changed from an energy threshold to a probability, so your old value cannot be carried across. See Retune sensitivity.

What changed

Use vad-2.1-xxs-16khz for general speech detection, or vad-vf-2.0-s-16khz to detect the primary speaker only.

Migrate the setup

Feed the VAD your original audio

If you run enhancement and VAD together, give both the same original input block. Do not chain them.
Enhancement changes the signal on purpose, so running the VAD on its output means detecting speech in audio the VAD model was not trained on. It also stacks the processor’s delay on top of the VAD’s own.
The two models can have different optimal block sizes and sample rates. If yours disagree, initialize both to the configuration your stream already uses, or keep separate block sizes and feed each object from your own buffer.

Retune sensitivity

This is the step most likely to change your application’s behavior. There is no conversion formula. The old value described leftover energy after enhancement, the new one describes model confidence, and the direction is inverted.
An old value like 5.0 is out of range and raises a parameter error. One that happens to be in range, like 1.0, is valid but means “only at maximum confidence”, which looks like a VAD that never fires.
Start from the model default and adjust against representative production audio. raw_vad_probability() gives the model’s probability before thresholding, which is the practical way to pick a threshold from recordings. SpeechHoldDuration and MinimumSpeechDuration keep their previous meaning and units.

Delay queries

The processor delays audio, the VAD does not, so there is no single output delay any more. The VAD’s prediction delay tells you how far behind its input the published decision is, so you can align speech decisions with the audio timeline. Fed from the same block, the two are independent.
Node.js has not adopted the rename yet. Its VadContext.getOutputDelay() returns the prediction delay, so only the name differs.
If you previously compensated for VAD timing using the processor’s delay, read the VAD’s own delay instead.

Also worth knowing

  • Model types are enforced. A processor takes enhancement and bypass models, a VAD takes VAD models, an analyzer takes analysis models. A mismatch fails at creation with AIC_ERROR_CODE_MODEL_TYPE_UNSUPPORTED, or ModelTypeUnsupportedError in Python, instead of silently doing something else.
  • Reset clears published values immediately. After a reset, the speech decision is false and the raw probability is 0.0, so queries no longer return stale values from the previous stream.
  • Sessions can be closed explicitly with aic_vad_terminate_session, or terminate_session() in Python, without waiting for the object to be destroyed. Useful where deallocation is delayed. The object cannot process more audio afterwards.

Multi-channel to mono

The same release removed multi-channel processing and buffering.

Python SDK 2.5 to 3.0

Every Python-specific rename in this release.