microsoft/VibeVoice · error · ValueError
Unsupported decoder model type: {decoder_config.get('model_t
Error message
Unsupported decoder model type: {decoder_config.get('model_type', '')} What it means
The streaming variant (VibeVoiceStreamingConfig, configuration_vibevoice_streaming.py:63) of the same decoder guard: a dict decoder_config must have model_type == 'qwen2' or construction fails. All three config classes intentionally restrict the decoder backbone to Qwen2, so this is a supported-architecture boundary, not a bug.
Source
Thrown at vibevoice/modular/configuration_vibevoice_streaming.py:63
if acoustic_tokenizer_config is None:
self.acoustic_tokenizer_config = self.sub_configs["acoustic_tokenizer_config"]()
elif isinstance(acoustic_tokenizer_config, dict):
acoustic_tokenizer_config["model_type"] = "vibevoice_acoustic_tokenizer"
self.acoustic_tokenizer_config = self.sub_configs["acoustic_tokenizer_config"](**acoustic_tokenizer_config)
elif isinstance(acoustic_tokenizer_config, VibeVoiceAcousticTokenizerConfig):
# If an instance of the config class is provided
self.acoustic_tokenizer_config = acoustic_tokenizer_config
if decoder_config is None:
self.decoder_config = self.sub_configs["decoder_config"]()
elif isinstance(decoder_config, dict):
# If a dictionary is provided, instantiate the config class with it
# self.decoder_config = self.sub_configs["decoder_config"](**decoder_config)
if decoder_config.get("model_type", '') == "qwen2":
self.decoder_config = Qwen2Config(**decoder_config)
else:
raise ValueError(f"Unsupported decoder model type: {decoder_config.get('model_type', '')}")
elif isinstance(decoder_config, (Qwen2Config,)):
# If an instance of the config class is provided
self.decoder_config = decoder_config
if diffusion_head_config is None:
self.diffusion_head_config = self.sub_configs["diffusion_head_config"]()
elif isinstance(diffusion_head_config, dict):
diffusion_head_config["model_type"] = "vibevoice_diffusion_head"
self.diffusion_head_config = self.sub_configs["diffusion_head_config"](**diffusion_head_config)
elif isinstance(diffusion_head_config, VibeVoiceDiffusionHeadConfig):
# If an instance of the config class is provided
self.diffusion_head_config = diffusion_head_config
# other parameters
self.acoustic_vae_dim = getattr(self.acoustic_tokenizer_config, 'vae_dim', 64)
# The decoder of the model is divided into two components. The lower Transformer layers are only used for encoding text, while the upper Transformer layers are used for encoding text and generating speech. `tts_backbone_num_hidden_layers` indicates the number of upper layers used for TTS.
self.tts_backbone_num_hidden_layers = tts_backbone_num_hidden_layers
View on GitHub (pinned to 94da20d98b)
Solutions
- Set model_type='qwen2' in the decoder_config dict for the streaming model.
- Validate incoming config dicts before constructing: assert cfg['decoder_config'].get('model_type') == 'qwen2'.
- Diff a known-good streaming checkpoint's config.json against yours and align the decoder block.
- Do not attempt to substitute decoder architectures — weights would not load anyway.
Example fix
# before
VibeVoiceStreamingConfig(decoder_config={"model_type": "qwen3", ...})
# after
VibeVoiceStreamingConfig(decoder_config={"model_type": "qwen2", ...}) Defensive patterns
Strategy: validation
Validate before calling
if isinstance(decoder_config, dict):
decoder_config = {**decoder_config, "model_type": "qwen2"} # force the only supported decoder
VibeVoiceStreamingConfig(decoder_config=decoder_config) Type guard
def is_valid_streaming_decoder(cfg: dict) -> bool:
return cfg.get("model_type") == "qwen2" Try / catch
try:
VibeVoiceStreamingConfig(decoder_config=decoder_config)
except ValueError as e:
raise SystemExit(f"Bad streaming config: {e}; decoder must be qwen2") from e Prevention
- Use repo-shipped streaming configs unmodified
- Normalize decoder model_type to 'qwen2' before construction
- Add CI checks validating config schema for streaming checkpoints
When it happens
Trigger: Building VibeVoiceStreamingConfig(decoder_config={...}) without model_type='qwen2', or loading a streaming checkpoint whose config.json decoder block names another architecture.
Common situations: Porting the streaming config from the non-streaming one with edits; converter scripts that emit 'qwen2_5' or similar; user-supplied YAML/JSON config piped into the constructor.
Related errors
- Unsupported decoder model type: {decoder_config.get('model_t
- segment_length must be positive
- Unsupported mixer layer: {mixer_layer}
- Unsupported norm type: {layernorm}
- Multiple voice presets match the speaker name '{speaker_name
AI-assisted analysis of microsoft/VibeVoice@94da20d98b (2026-08-15).
Data as JSON: /api/errors/79f74781a24933bd.
Report an issue: GitHub.