Both deploys failed against irv-ml1 today with upstream-changed-on-us errors: * vibevoice: VIBEVOICE_SHA=7614c469a145 (12-char short) made docker buildx report "repository does not contain ref 7614c469a145" — same commit IS still HEAD of main, but buildx's git source resolver doesn't accept short hashes even when unambiguous. Now full 40-char. * chatterbox: dockerfile: docker/Dockerfile.gpu — devnen restructured the repo to put Dockerfiles at root, renamed by CUDA version (Dockerfile.cu128, .cpu, .rocm). Switched to Dockerfile.cu128 (GPU build for CUDA 12.8 toolkit; works on irv-ml1's 595.58.03 driver). Also pinned CHATTERBOX_SHA to a full 40-char SHA instead of `main` so future upstream churn doesn't break the deploy without warning. Live host .env files patched directly (the playbook only seeds .env when absent, so canonical edits don't propagate to existing installs).
VibeVoice
Microsoft's diffusion-based long-form TTS, served via groxaxo/VibeVoice-FastAPI1 (a recent fork of ncoder-ai/VibeVoice-FastAPI which moves faster than upstream).
Model: microsoft/VibeVoice-1.5B
by default. Switch to the 7B variant via .env if you want the
bigger checkpoint.
Why this stack exists
Long-form / podcast-quality TTS with native multi-speaker dialogue support. Designed for one-shot generation of multi-minute scripts where conversation flow matters. Not for low-latency single-line synthesis — for that use Kokoro or Chatterbox Turbo.
| use case | |
|---|---|
| VibeVoice 1.5B | long-form, multi-speaker dialogue (this stack) |
| Kokoro | low-latency English, fixed voice library |
| Chatterbox Turbo | low-latency English w/ voice cloning |
| IndexTTS-2 | English voice cloning + emotion control |
| Qwen3-TTS-1.7B-Base | high-quality English voice cloning |
| CosyVoice 3 | multilingual (Chinese-leaning) |
API
OpenAI-compat at http://10.100.79.3:8194:
# Single-speaker (OpenAI-style).
curl -fsS -X POST http://10.100.79.3:8194/v1/audio/speech \
-H 'Content-Type: application/json' \
-d '{"model":"vibevoice","input":"Hello there.","voice":"voice-name","response_format":"wav"}' \
> out.wav
# Multi-speaker dialogue — the headline feature. Format the input
# as a script with `Speaker N:` prefixes (0-indexed). The wrapper's
# extended /v1/vibevoice/generate endpoint handles voice switching.
curl -fsS -X POST http://10.100.79.3:8194/v1/vibevoice/generate \
-H 'Content-Type: application/json' \
-d '{
"script":"Speaker 0: Welcome to the show.\nSpeaker 1: Glad to be here.\nSpeaker 0: Today we discuss…",
"voices":["voice-host","voice-guest"],
"stream":true
}' > podcast.wav
# List available voices.
curl http://10.100.79.3:8194/v1/audio/voices
OpenAPI / docs at /docs. Healthcheck at /health.
stream=true is honored on the multi-speaker endpoint; the
single-shot OpenAI endpoint returns the full file in one go.
Voices
Drop .wav / .mp3 / .flac / .m4a into
/worktank/vibevoice/voices/ on the host (mounted read-only into
the container). Restart the container after adding; the wrapper
scans the dir at init, not per-request:
ssh irv-ml1 'cd /opt/docker/compose/vibevoice && docker compose restart'
VibeVoice also has built-in voice presets (Carter, Davis, Emma, Frank, Grace, Mike, Samuel) accessible by name. Microsoft has not released the cloning tooling so you can't add new "trained" voices — but the bundled ones already cover most podcast use cases.
Deploy
scripts/elway irv-ml1 --playbook playbooks/deploy-vibevoice.yaml
Cold deploy budget:
- ~12 GB image build (CUDA 12.8 + torch 2.8 + flash-attn)
- ~7 GB model download (VibeVoice-1.5B) on first start
- Total: ~19 GB on /worktank/vibevoice/
First build: ~12 min. First generation: ~30-60 s warmup.
Switching to the 7B variant
ssh irv-ml1 '
cd /opt/docker/compose/vibevoice
sed -i "s|^VIBEVOICE_MODEL=.*|VIBEVOICE_MODEL=rsxdalv/VibeVoice-Large|" .env
docker compose up -d
'
The 7B model auto-downloads on next start (~18 GB). VRAM jumps from
~7 GB to ~18 GB bf16 — keep VIBEVOICE_GPU_DEVICES=1 (A6000) for it.
For lower VRAM at slight quality cost, set VIBEVOICE_QUANT=int8_torchao
which brings 7B down to ~10 GB.
Gotchas
- Not streaming-friendly for single-line use. The diffusion head
has to denoise the whole latent before vocoding. Streaming on
/v1/vibevoice/generateworks at script-segment granularity (paragraph-ish), not token-by-token. - Voice cloning isn't published. Microsoft released the inference models but not the training pipeline. Use the built-in voices, or pick another stack (IndexTTS-2 / Qwen3-TTS / Chatterbox Turbo).
flash_attention_2is the upstream default; if your GPU/torch combo doesn't have it built, setVIBEVOICE_ATTN=sdpain.envto fall back to PyTorch's scaled-dot-product attention.- License: VibeVoice MIT (Microsoft); wrapper MIT.