microsoft/VibeVoice · critical · RuntimeError

No voice preset (.pt) files found in {voices_dir}

Error message

No voice preset (.pt) files found in {voices_dir}

What it means

Raised by StreamingTTSService._load_voice_presets when the voices directory exists but contains no .pt files anywhere under it (rglob finds nothing). This means the download step created the folder but the presets were never placed there — partial or failed download, wrong subdirectory, or files with a different extension.

Source

Thrown at demo/web/app.py:138

        )
        self.model.set_ddpm_inference_steps(num_steps=self.inference_steps)

        self.voice_presets = self._load_voice_presets()
        preset_name = os.environ.get("VOICE_PRESET")
        self.default_voice_key = self._determine_voice_key(preset_name)
        self._ensure_voice_cached(self.default_voice_key)

    def _load_voice_presets(self) -> Dict[str, Path]:
        voices_dir = BASE.parent / "voices" / "streaming_model"
        if not voices_dir.exists():
            raise RuntimeError(f"Voices directory not found: {voices_dir}")

        presets: Dict[str, Path] = {}
        for pt_path in voices_dir.rglob("*.pt"):
            presets[pt_path.stem] = pt_path

        if not presets:
            raise RuntimeError(f"No voice preset (.pt) files found in {voices_dir}")

        print(f"[startup] Found {len(presets)} voice presets")
        return dict(sorted(presets.items()))

    def _determine_voice_key(self, name: Optional[str]) -> str:
        if name and name in self.voice_presets:
            return name

        default_key = "en-Carter_man"
        if default_key in self.voice_presets:
            return default_key

        first_key = next(iter(self.voice_presets))
        print(f"[startup] Using fallback voice preset: {first_key}")
        return first_key

    def _ensure_voice_cached(self, key: str) -> Tuple[object, Path, str]:
        if key not in self.voice_presets:

View on GitHub (pinned to 94da20d98b)

Solutions

  1. Re-run demo/download_experimental_voices.sh and let it finish; confirm .pt files appear under demo/voices/streaming_model.
  2. Check for misplaced files: find demo/voices -name '*.pt' and move them into demo/voices/streaming_model if they are one level off.
  3. If files came from git LFS, run git lfs pull so placeholders become real .pt weights.
  4. Verify file integrity (non-zero size, loadable via torch.load) after download.

Example fix

# before
mkdir -p demo/voices/streaming_model  # empty dir -> RuntimeError

# after
bash demo/download_experimental_voices.sh
find demo/voices/streaming_model -name '*.pt' | wc -l  # > 0
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path
voices = Path("demo/voices/streaming_model")
pts = list(voices.rglob("*.pt")) if voices.exists() else []
if not pts:
    raise SystemExit("No .pt presets. Re-run demo/download_experimental_voices.sh (and git lfs pull if applicable).")

Prevention

When it happens

Trigger: demo/voices/streaming_model exists but is empty; presets were downloaded to the wrong directory (e.g. demo/voices root instead of streaming_model/); files renamed to something other than .pt; download script interrupted mid-way leaving an empty dir.

Common situations: Interrupted download_experimental_voices.sh; git LFS placeholders not pulled; presets manually moved; directory created manually as a placeholder.

Related errors


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