parakeet + cosyvoice: add stacks + deploy to irv-ml1

Two new speech stacks on irv-ml1, both on the /worktank/<stack>/
pattern, no tnet (irv-ml1 is local-endpoints-only for now).

parakeet — ASR via Shadowfita/parakeet-tdt-0.6b-v2-fastapi:
  - docker buildx git context pinned to SHA 31c5652; no source
    vendored. Rebuild on SHA bump.
  - GPU-capable FastAPI + Silero VAD + WS streaming.
  - API: POST /transcribe, WS /ws/transcribe, GET /healthz. Not the
    literal OpenAI `/v1/audio/transcriptions` path — note in README.
  - HF cache at /worktank/parakeet/models/ (excluded from restic).
  - Build ~158s first time; steady-state start ~40s.

cosyvoice — TTS via neosun/cosyvoice:v1.3.2 shipping
Fun-CosyVoice3-0.5B-2512 (CosyVoice 3, chosen over v2 for the
expanded 5,000-hour instruction-following data covering emotions,
speed, tones, dialects, accents, role-playing; ~150ms streaming
TTFB matches v2). API: /v1/audio/speech (OpenAI drop-in),
/v1/voices/create (cloning), /health.
  - Host port 8190 (container 8188; host 8188 already taken by comfyui).
  - /worktank/cosyvoice/{voices,input,output}/; voices include in
    restic (precious — reproducing a clone needs the original ref
    audio), input+output excluded (scratch).
  - Model weights (~2-3 GB) live inside image layer; re-download on
    tag bump, persist across `compose up -d`.

Both healthy on first deploy.
This commit is contained in:
vh
2026-04-23 23:40:36 -07:00
parent 06476745f1
commit 1a67370138
6 changed files with 410 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
# CosyVoice — multilingual expressive TTS with voice cloning.
#
# Ships the Fun-CosyVoice3-0.5B-2512 model from FunAudioLLM (latest
# as of 2026-04). Streaming PCM chunks with ~150 ms TTFB. Emotional
# control via either XML tags (<angry>text</angry>) or instruction
# prompts (`You are a helpful assistant. <|endofprompt|>` syntax).
#
# Runs on irv-ml1 (dual GPU). Both GPUs exposed via
# NVIDIA_VISIBLE_DEVICES=all; image reads CUDA_VISIBLE_DEVICES if
# you later want to pin.
#
# Path split:
# /worktank/cosyvoice/voices → /data/voices cloned speaker profiles
# /worktank/cosyvoice/input → /data/input scratch for uploaded source audio
# /worktank/cosyvoice/output → /data/output synthesized clips
#
# Models (~2–3 GB) download on first run into the image's internal
# pretrained_models/ path. Not bind-mounted (the image expects an
# exact layout we don't have authoritative docs for); recreating the
# container without the cached image will re-download. Cached image
# layer persists through `compose up -d` recreates.
#
# API routes (OpenAI-compatible where marked):
# POST /v1/audio/speech — OpenAI drop-in for TTS
# POST /v1/voices/create — voice cloning (reference audio in)
# GET /v1/voices — list cloned voices
# GET /health — health probe
#
# All tunables live in .env — edit that, not this file.
services:
cosyvoice:
image: neosun/cosyvoice:${COSYVOICE_VERSION}
container_name: cosyvoice
restart: unless-stopped
runtime: nvidia
ports:
- "${COSYVOICE_BIND:-0.0.0.0}:${COSYVOICE_PORT}:8188"
environment:
- NVIDIA_VISIBLE_DEVICES=all
- MODEL_DIR=${COSYVOICE_MODEL_DIR:-pretrained_models/Fun-CosyVoice3-0.5B}
- PORT=8188
- GPU_IDLE_TIMEOUT=${COSYVOICE_GPU_IDLE_TIMEOUT:-600}
volumes:
- ${COSYVOICE_VOICES_DIR}:/data/voices
- ${COSYVOICE_INPUT_DIR}:/data/input
- ${COSYVOICE_OUTPUT_DIR}:/data/output
healthcheck:
test: ["CMD-SHELL", "curl -fsS http://localhost:8188/health >/dev/null || exit 1"]
interval: 30s
timeout: 10s
retries: 3
# First boot pulls ~2–3 GB of model weights.
start_period: 300s
labels:
- homepage.group=AI Systems
- homepage.name=CosyVoice
- homepage.icon=mdi-account-voice
- homepage.description=Expressive multilingual TTS + cloning (irv-ml1)
- homepage.href=http://10.100.79.3:${COSYVOICE_PORT}