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
- Re-run demo/download_experimental_voices.sh and let it finish; confirm .pt files appear under demo/voices/streaming_model.
- Check for misplaced files: find demo/voices -name '*.pt' and move them into demo/voices/streaming_model if they are one level off.
- If files came from git LFS, run git lfs pull so placeholders become real .pt weights.
- 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
- Verify download script exit code
- git lfs pull after cloning when presets are LFS-tracked
- Check files land in demo/voices/streaming_model, not demo/voices
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
- Voices directory not found: {voices_dir}
- Voice preset {key!r} not found
- MODEL_PATH not set in environment
- Multiple voice presets match the speaker name '{speaker_name
- StreamingTTSService not initialized
AI-assisted analysis of microsoft/VibeVoice@94da20d98b (2026-08-15).
Data as JSON: /api/errors/0df51df63e9ba04a.
Report an issue: GitHub.