# 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}