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

  1. Set model_type='qwen2' in the decoder_config dict for the streaming model.
  2. Validate incoming config dicts before constructing: assert cfg['decoder_config'].get('model_type') == 'qwen2'.
  3. Diff a known-good streaming checkpoint's config.json against yours and align the decoder block.
  4. 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

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


AI-assisted analysis of microsoft/VibeVoice@94da20d98b (2026-08-15). Data as JSON: /api/errors/79f74781a24933bd. Report an issue: GitHub.