stacks: add dia + zonos to the TTS bench

dia: Nari Labs dialogue TTS (Dia 1.6B / Dia2-1B / Dia2-2B) via
devnen/Dia-TTS-Server — OpenAI-compat, fills the multi-speaker
dialogue-scene slot for skaldsong. Port 8200 on irv-ml1.

zonos: Zyphra Zonos-v0.1 (Apache-2.0, 44kHz, emotion sliders) via the
official Gradio interface. Audition surface only — no OpenAI-compat
endpoint yet (needs the FastAPI fork to become skaldsong-pluggable).
Port 8199 on irv-ml1.

Both follow the chatterbox/fish-s2 convention: local image built from a
pinned wrapper SHA via buildx git-context, .env-driven port/GPU, python
healthcheck, homepage labels.
This commit is contained in:
vh
2026-05-31 10:53:27 -07:00
parent 53157b193d
commit 666f7f31e0
6 changed files with 356 additions and 0 deletions
+67
View File
@@ -0,0 +1,67 @@
# Dia / Dia2 (Nari Labs' dialogue-focused TTS) served via
# devnen/Dia-TTS-Server — the same OpenAI-compat wrapper author as our
# chatterbox stack, with multi-model support for the Dia 2 family
# (Dia 1.6B / Dia2-1B / Dia2-2B), switchable from the Web UI.
#
# Why this stack exists alongside the other TTS:
# * DIALOGUE scenes with nonverbal cues — Dia generates multi-speaker
# turn-taking in a single pass with inline [S1]/[S2] speaker tags
# and nonverbals like (laughs), (coughs), (sighs). Purpose-built for
# the character-dialogue case skaldsong's storytelling hits, which
# the single-speaker engines (Fish/Index/Chatterbox) don't own.
# * Dia2 (released 2025-11-19) adds realtime streaming + a 2B
# high-quality checkpoint.
# * Apache-2.0 model weights; MIT wrapper; OpenAI-compat
# /v1/audio/speech so skaldsong can target it by base-URL.
# * ~7 GB VRAM at BF16 SafeTensors.
#
# Image is built locally from the upstream wrapper via docker buildx
# git-context (no source vendored on the host) — same pattern as
# chatterbox/fish-s2.
#
# All tunables live in .env — edit that, not this file.
services:
dia:
image: local/dia:${DIA_TAG}
build:
# Single Dockerfile at repo root; GPU via NVIDIA Container Toolkit.
context: https://github.com/devnen/Dia-TTS-Server.git#${DIA_SHA}
dockerfile: Dockerfile
container_name: dia
restart: unless-stopped
runtime: nvidia
ports:
- "${DIA_BIND:-0.0.0.0}:${DIA_PORT}:8003"
environment:
- NVIDIA_VISIBLE_DEVICES=${DIA_GPU_DEVICES:-0}
- NVIDIA_DRIVER_CAPABILITIES=compute,utility
# Speeds the first-boot HF download of the checkpoint.
- HF_HUB_ENABLE_HF_TRANSFER=1
- HF_HOME=/app/hf_cache
volumes:
- ${DIA_REFERENCE_DIR}:/app/reference_audio
- ${DIA_CACHE_DIR}:/app/hf_cache
# Model selection lives in the wrapper's config.yaml (model.repo_id):
# mount a host config to pin a default of Dia2-1B / Dia2-2B instead
# of the in-image default (Dia 1.6B). Otherwise switch live in the
# Web UI (selection may not survive a container recreate).
# - ${DIA_CONFIG}:/app/config.yaml
healthcheck:
# devnen's Dia server exposes GET /health (liveness) plus
# /api/model-status (download/load progress) and /api/model-info.
# /health is the simple liveness probe; start_period covers the
# first-boot model pull. python urllib (image has no curl), bound
# to 127.0.0.1 (uvicorn is IPv4-only).
test: ["CMD-SHELL", "python3 -c \"import urllib.request,sys; urllib.request.urlopen('http://127.0.0.1:8003/health', timeout=5); sys.exit(0)\""]
interval: 30s
timeout: 10s
retries: 3
# First boot pulls the checkpoint (~6-10 GB) — generous deadline.
start_period: 600s
labels:
- homepage.group=AI Systems
- homepage.name=Dia / Dia2
- homepage.icon=mdi-account-voice
- homepage.description=Dialogue TTS — multi-speaker turn-taking + nonverbals (irv-ml1)
- homepage.href=http://10.100.79.3:${DIA_PORT}