Model reference · open weights
ultraVAD is an open-weight embedding model from fixie-ai. ultraVAD (BF16) weighs 1.4 GB; the smallest configuration that runs it is RTX 3060 12 GB.
Summary of the fixie-ai/ultraVAD model card, 2026-10-01
What it is
| Released by | fixie-ai |
|---|---|
| Released | 2025-08-28 |
| Parameters | 687M |
| VRAM | 1.4 GB for the weights |
What it runs on
| Card | Runs | Memory |
|---|---|---|
| RTX 3060 12 GB | fits | 11.6 GB |
| RTX 4060 Ti 16 GB | fits | 15.4 GB |
| RTX 3090 24 GB | fits | 23.4 GB |
| RTX 4090 24 GB | fits | 23.4 GB |
| RTX 5090 32 GB | fits | 31.0 GB |
| L40S 48 GB | fits | 44.0 GB |
| A100 80 GB | fits | 78.2 GB |
| H100 80 GB | fits | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | fits | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | fits | 107 GB |
| H200 141 GB | fits | 138 GB |
| B200 180 GB | fits | 176 GB |
From the model card
UltraVAD is a context-aware, audio-native endpointing model. It estimates the probability that a speaker has finished their turn in real time by fusing recent dialog text with the user’s audio. UltraVAD consumes the dialogue history and the last user audio turn, then produces a probability for the end-of-turn token ``.
What it predicts. UltraVAD computes the probability P( | context, user_audio)
Use UltraVAD as a turn-taking oracle in voice agents. Run it alongside a lightweight streaming VAD; when short silences are detected, call UltraVAD and trigger your agent’s response once the `` probability crosses your threshold.
import transformers
import torch
import librosa
import os
pipe = transformers.pipeline(model='fixie-ai/ultraVAD', trust_remote_code=True, device="cpu")
sr = 16000
wav_path = os.path.join(os.path.dirname(__file__), "sample.wav")
audio, sr = librosa.load(wav_path, sr=sr)
turns = [
{"role": "assistant", "content": "Hi, how are you?"},
]
# Build model inputs via pipeline preprocess
inputs = {"audio": audio, "turns": turns, "sampling_rate": sr}
model_inputs = pipe.preprocess(inputs)
# Move tensors to model device
device = next(pipe.model.parameters()).device
model_inputs = {k: (v.to(device) if hasattr(v, "to") else v) for k, v in model_inputs.items()}
# Forward pass (no generation)
with torch.inference_mode():
output = pipe.model.forward(**model_inputs, return_dict=True)
# Compute last-audio token position
logits = output.logits # (1, seq_len, vocab)
audio_pos = int(
model_inputs["audio_token_start_idx"].item() +
model_inputs["audio_token_len"].item() - 1
)
# Resolve token id and compute probability at last-audio index
token_id = pipe.tokenizer.convert_tokens_to_ids("")
if token_id is None or token_id == pipe.tokenizer.unk_token_id:
raise RuntimeError(" not found in tokenizer.")
audio_logits = logits[0, audio_pos, :]
audio_probs = torch.softmax(audio_logits.float(), dim=-1)
eot_prob_audio = audio_probs[token_id].item()
print(f"P() = {eot_prob_audio:.6f}")
threshold = 0.1
if eot_prob_audio > threshold:
print("Is End of Turn")
else:
print("Is Not End of Turn")
Text-only post-training (LLM): Post-train the backbone to predict in dialog, yielding a probability over likely stop points rather than brittle binary labels. Data: Synthetic conversational corpora with inserted tokens, translation-augmented across 26 languages.
Audio-native fusion (Ultravox projector): Attach and fine-tune the Ultravox audio projector so the model conditions jointly on audio embeddings and text, aligning prosodic cues with the objective. Data: Robust to real-world noise, device/mic variance, overlapping speech.
Calibration: Choose a decision threshold to balance precision vs. recall per language/domain. Recommended starting threshold: 0.1. Raise the threshold if you find the model interrupting too eagerly, and lower the threshold if you find the model not responding when its supposed to.
Latency (forward pass): ~65-110 ms on an A6000.
Common pattern: Pair with a streaming VAD (e.g., Silero). Invoke UltraVAD on short silences; its latency is often hidden under TTS time-to-first-token.
UltraVAD is evaluated on both context-dependent and single-turn datasets.
Contextual benchmark: 400 held-out samples requiring dialog history (fixie-ai/turntaking-contextual-tts).
Single-turn sets: Smart-Turn V2’s Orpheus synthetic datasets (aggregate).
Results
Context-dependent turn-taking (400 held-out samples)
| Metric | UltraVAD | Smart-Turn V2 |
|---|---|---|
| Accuracy | 77.5% | 63.0% |
| Precision | 69.6% | 59.8% |
| Recall | 97.5% | 79.0% |
| F1-Score | 81.3% | 68.1% |
| AUC | 89.6% | 70.0% |
Single-turn datasets (Orpheus aggregate)
| Dataset | UltraVAD | Smart-Turn V2 |
|---|---|---|
| orpheus-aggregate-test | 93.7% | 94.3% |
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.