Files

3.0 KiB

tts-server containerizzato (Qwen3-TTS, backend Vulkan)

Containerizza il server TTS (qwentts.cpp) con accelerazione GPU Vulkan, portabile su qualsiasi host con GPU AMD/Intel (Mesa RADV) o NVIDIA (ICD Vulkan).

Architettura

  • Multi-stage build: builder con Vulkan SDK (glslc da LunarG) → runtime minimale con mesa-vulkan-drivers (RADV userspace).
  • Nessun driver kernel nel container: l'host possiede l'hardware; il container monta solo /dev/dri/renderD128 (node render, least-privilege).
  • GGML_NATIVE=OFF: binario portabile tra CPU diverse.
  • Voci clonate (.spk/.rvq) registrate all'avvio da register_voices.py (scansione ricorsiva di /voices; ref_text dal .txt omonimo o *_batch_ref.txt).

Requisiti host

  • Docker Engine + Docker Compose v2
  • GPU con driver Vulkan funzionante: verificare con vulkaninfo --summary
  • Node render: ls -l /dev/dri/renderD128 (su Debian/Ubuntu serve il gruppo render; su Fedora è world-writable)

Build & avvio

cd docker/tts-server
export RENDER_GID=$(getent group render | cut -d: -f3)   # GID gruppo render
docker compose up -d --build

Il compose monta ../models e ../voices (relativi al file compose, cioè la root del repo) e pubblica la porta 8881.

Verifica

curl http://localhost:8881/health          # {"status":"ok"}
curl http://localhost:8881/v1/audio/voices # elenco voci registrate

Configurazione (variabili d'ambiente)

Variabile Default Descrizione
MODEL_PATH /models/qwen-talker-1.7b-base-Q8_0.gguf Modello talker
CODEC_PATH /models/qwen-tokenizer-12hz-Q8_0.gguf Codec audio
TTS_LANG auto Lingua (es. Italian)
MODEL_ALIAS Alias esposto da /v1/models
PORT 8881 Porta di ascolto
VOICE_DIR /voices Directory voci clonate
GGML_BACKEND Vulkan0 Backend ggml
NO_FA / CLAMP_FP16 / MAX_BATCH / ecc. Flag avanzati tts-server

Portabilità su altre macchine

  1. AMD/Intel: nessuna modifica — il container usa Mesa RADV dal mesa-vulkan-drivers dell'immagine. Serve solo il node render.
  2. NVIDIA: aggiungere il runtime nvidia al servizio:
    runtime: nvidia
    environment:
      NVIDIA_VISIBLE_DEVICES: all
    
    (richiede nvidia-container-toolkit sull'host) — oppure usare il target cuda del Dockerfile principale del progetto.
  3. Modelli: montare la directory con i .gguf (talker + codec) come /models:ro.
  4. Voci: montare la directory con .spk/.rvq/.txt come /voices:ro.

Troubleshooting

  1. Host: vulkaninfo --summary deve vedere la GPU.
  2. Container: docker exec tts-server vulkaninfo --summary (se vulkan-tools installato) o controllare i log: docker logs tts-server.
  3. Se Vulkan non vede la GPU: verificare --device /dev/dri/renderD128 e il group_add (GID del gruppo render dell'host).
  4. Non bind-mountare librerie host (/usr/lib, ICD JSON): causa mismatch loader/driver. L'immagine ha già RADV.