# VibeVoice 1.5B long-form TTS via groxaxo/VibeVoice-FastAPI1
# (fork of ncoder-ai/VibeVoice-FastAPI). Multi-speaker dialogue support
# via the extended /v1/vibevoice/generate endpoint with a Speaker N:
# script format. OpenAI-compat /v1/audio/speech also exposed.
#
# Why this stack exists alongside the other TTS:
#   * Long-form / podcast-quality slot — VibeVoice is Microsoft's
#     diffusion-based long-form TTS designed for multi-speaker output.
#   * Dialogue mode: feed `Speaker 0: ... \n Speaker 1: ...` and the
#     model handles voice switching natively.
#   * Trade-off: NOT streaming-friendly — generation is single-shot
#     latent denoising over the whole sequence, then vocode. For
#     low-latency English, use Kokoro or Chatterbox Turbo instead.
#
# Image is built locally from the upstream Dockerfile via docker
# buildx git-context (no source vendored on the host). Pinned to a
# SHA in .env so rebuilds are reproducible.
#
# Default model is VibeVoice-1.5B (~7 GB bf16 VRAM). Switch to
# rsxdalv/VibeVoice-Large for the 7B variant (~18 GB) — pin to A6000
# in that case.
#
# All tunables live in .env — edit that, not this file.

services:
  vibevoice:
    image: local/vibevoice:${VIBEVOICE_TAG}
    build:
      context: https://github.com/groxaxo/VibeVoice-FastAPI1.git#${VIBEVOICE_SHA}
      dockerfile: Dockerfile
    container_name: vibevoice
    restart: unless-stopped
    runtime: nvidia
    ports:
      - "${VIBEVOICE_BIND:-0.0.0.0}:${VIBEVOICE_PORT}:8001"
    environment:
      - NVIDIA_VISIBLE_DEVICES=${VIBEVOICE_GPU_DEVICES:-1}
      - VIBEVOICE_MODEL_PATH=${VIBEVOICE_MODEL:-microsoft/VibeVoice-1.5B}
      - VIBEVOICE_DEVICE=cuda
      - VIBEVOICE_INFERENCE_STEPS=${VIBEVOICE_INFERENCE_STEPS:-10}
      - VIBEVOICE_DTYPE=${VIBEVOICE_DTYPE:-bfloat16}
      - VIBEVOICE_ATTN_IMPLEMENTATION=${VIBEVOICE_ATTN:-flash_attention_2}
      - VIBEVOICE_QUANTIZATION=${VIBEVOICE_QUANT:-}
      - TORCH_COMPILE=${VIBEVOICE_TORCH_COMPILE:-false}
      - TORCH_COMPILE_MODE=${VIBEVOICE_TORCH_COMPILE_MODE:-default}
      - VOICES_DIR=/app/voices
      - DEFAULT_CFG_SCALE=${VIBEVOICE_CFG_SCALE:-1.8}
      - MAX_GENERATION_LENGTH=${VIBEVOICE_MAX_GEN_LEN:-5400}
      - HF_HOME=/root/.cache/huggingface
    volumes:
      - ${VIBEVOICE_VOICES_DIR}:/app/voices:ro
      - ${VIBEVOICE_CACHE_DIR}:/root/.cache/huggingface
    healthcheck:
      # Upstream Dockerfile exposes /health.
      test: ["CMD-SHELL", "curl -fsS -o /dev/null http://localhost:8001/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
      # First boot pulls VibeVoice-1.5B (~7 GB) on a cold cache and
      # may also build flash-attn / torch.compile JIT cache on the
      # first inference. Generous deadline.
      start_period: 900s
    labels:
      - homepage.group=AI Systems
      - homepage.name=VibeVoice
      - homepage.icon=mdi-podcast
      - homepage.description=Long-form / multi-speaker dialogue TTS (irv-ml1)
      - homepage.href=http://10.100.79.3:${VIBEVOICE_PORT}
