microsoft/VibeVoice · error · ValueError

`final_sigmas_type` must be one of 'zero', or 'sigma_min', b

Error message

`final_sigmas_type` must be one of 'zero', or 'sigma_min', but got {self.config.final_sigmas_type}

What it means

While building the sigma array, `set_timesteps` reads `config.final_sigmas_type` to decide the last sigma: `"sigma_min"` uses the smallest trained sigma, `"zero"` appends 0. Any other string reaches this ValueError. Note the constructor only cross-checks `zero` against algorithm_type (error 46); an arbitrary invalid value slips through construction and only fails here, at set_timesteps time.

Source

Thrown at vibevoice/schedule/dpm_solver.py:404

        if self.config.use_karras_sigmas:
            sigmas = np.flip(sigmas).copy()
            sigmas = self._convert_to_karras(in_sigmas=sigmas, num_inference_steps=num_inference_steps)
            timesteps = np.array([self._sigma_to_t(sigma, log_sigmas) for sigma in sigmas]).round()
        elif self.config.use_lu_lambdas:
            lambdas = np.flip(log_sigmas.copy())
            lambdas = self._convert_to_lu(in_lambdas=lambdas, num_inference_steps=num_inference_steps)
            sigmas = np.exp(lambdas)
            timesteps = np.array([self._sigma_to_t(sigma, log_sigmas) for sigma in sigmas]).round()
        else:
            sigmas = np.interp(timesteps, np.arange(0, len(sigmas)), sigmas)

        if self.config.final_sigmas_type == "sigma_min":
            sigma_last = ((1 - self.alphas_cumprod[0]) / self.alphas_cumprod[0]) ** 0.5
        elif self.config.final_sigmas_type == "zero":
            sigma_last = 0
        else:
            raise ValueError(
                f"`final_sigmas_type` must be one of 'zero', or 'sigma_min', but got {self.config.final_sigmas_type}"
            )

        sigmas = np.concatenate([sigmas, [sigma_last]]).astype(np.float32)

        self.sigmas = torch.from_numpy(sigmas)
        self.timesteps = torch.from_numpy(timesteps).to(device=device, dtype=torch.int64)

        self.num_inference_steps = len(timesteps)

        self.model_outputs = [
            None,
        ] * self.config.solver_order
        self.lower_order_nums = 0

        # add an index counter for schedulers that allow duplicated timesteps
        self._step_index = None
        self._begin_index = None

View on GitHub (pinned to 94da20d98b)

Solutions

  1. Set final_sigmas_type to "sigma_min" (default) or "zero" (only with dpmsolver++/sde-dpmsolver++).
  2. If the config value is missing/empty, delete the key so the scheduler default applies.
  3. Validate config right after loading because construction does not catch this value.

Example fix

# before
DPMSolverMultistepScheduler(..., final_sigmas_type="sigma")

# after
DPMSolverMultistepScheduler(..., final_sigmas_type="sigma_min")
Defensive patterns

Strategy: validation

Validate before calling

FINAL = {"zero", "sigma_min"}
cfg = scheduler.config.final_sigmas_type
if cfg not in FINAL:
    raise ValueError(f"final_sigmas_type {cfg!r} invalid; choose from {sorted(FINAL)}")
scheduler.set_timesteps(30)

Type guard

def is_supported_final_sigmas_type(v) -> bool:
    return isinstance(v, str) and v in {"zero", "sigma_min"}

Prevention

When it happens

Trigger: Constructing with `final_sigmas_type="sigma"`, `"zeromin"`, or a case variant like `"Zero"`, then calling `set_timesteps(N)`.

Common situations: Hand-written configs with typos; values copied from other scheduler families (some use `sigma_last` or different names); serialised configs that lost the field default and stored an empty string.

Related errors


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