#414·VibeVoice

Text-Only Inference Report for Upstream

Author: faridnasiriCreated Jun 23, 2026Updated Jun 23, 2026

Summary

We attempted to run VibeVoice-1.5B for text-to-speech locally (without SGLang) using the published vibevoice pip package. The model loads correctly and the tokenizer works after a minor patch, but the inference pipeline cannot produce audio without SGLang — the generate() method's speech-processing path is never initialized for text-only input, and speech_outputs returns [None].

This report documents the full investigation, the specific code paths involved, and two concrete suggestions for enabling standalone text-to-speech.


What We Tried

We used the VibeVoiceForConditionalGenerationInference class from vibevoice.modular.modeling_vibevoice_inference with direct imports (bypassing AutoConfig, since vibevoice is not in CONFIG_MAPPING). We used the Qwen2 tokenizer vocabulary files since the VibeVoice HF repo contains no tokenizer config.

Step 1: Model loading — WORKS

from vibevoice.modular.configuration_vibevoice import VibeVoiceConfig
from vibevoice.modular.modeling_vibevoice_inference import VibeVoiceForConditionalGenerationInference

cfg = VibeVoiceConfig.from_pretrained("microsoft/VibeVoice-1.5B")
model = VibeVoiceForConditionalGenerationInference.from_pretrained(
    "microsoft/VibeVoice-1.5B", config=cfg,
    device_map="cuda", torch_dtype=torch.bfloat16)

Result: Model loads in 3-8 seconds, 5.4 GB VRAM on an RTX 5060 Ti. No state dict errors, no OOM.

Step 2: Tokenizer — WORKS (with patch)

The VibeVoiceTextTokenizer.__init__() passes add_special_tokens=True to PreTrainedTokenizerBase.__init__(). In transformers 4.51.3, add_special_tokens is both a constructor parameter and a method on the base class — causing an AttributeError collision.

Workaround:

import transformers.tokenization_utils_base as tub
_orig_init = tub.PreTrainedTokenizerBase.__init__
def _patched_init(self, **kwargs):
    kwargs.pop("add_special_tokens", None)
    return _orig_init(self, **kwargs)
tub.PreTrainedTokenizerBase.__init__ = _patched_init

Since the HF repo has no tokenizer files, we used Qwen2's vocabulary:

vocab_file = hf_hub_download("Qwen/Qwen2-0.5B", "vocab.json")
merges_file = hf_hub_download("Qwen/Qwen2-0.5B", "merges.txt")
tok = VibeVoiceTextTokenizer(vocab_file=vocab_file, merges_file=merges_file)

Result: Tokenizer constructs and tokenizes correctly.

Step 3: Inference — FAILS (two issues)