Files
ARIA-AGENT/xtts/voxtral
duffyduckandClaude Opus 4.8 174d6d643d feat(voxtral): STT-Satellit (Profil) + 2-Karten-GPU-Pinning
Neuer xtts/voxtral-Container (RVS<->vLLM-Realtime-WS, adaptiver Endpointer), hinter Compose-Profil 'voxtral' (braucht >=16GB VRAM, startet nicht im Default). Bestehende Satelliten auf die zwei 3060 gepinnt: whisper->GPU0, f5tts->GPU1, llama-swap->GPU0.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-15 01:21:43 +02:00
..

Voxtral-STT-Satellit (M0.3)

Streaming-STT via Voxtral-Mini-4B-Realtime-2602 (Mistral, Apache 2.0) auf vLLM. Ersetzt whisper als STT — genauer (~5,9 % WER vs 7,4 % FLEURS) und mit echtem Realtime-Streaming. Deutsch ist in den 13 Sprachen abgedeckt.

Zwei Container:

  • voxtral-vllm — das Modell auf vLLM (GPU). Exponiert die Realtime-WS-API.
  • voxtral-bridge — CPU-Glue: RVS ⇄ vLLM-Realtime-WS. Macht das Endpointing selbst (adaptiver Rausch-Boden-VAD, identisch zur whisper-Bridge / M0.1).

⚠️ Hardware-Realität — läuft NICHT auf der 3060

Das Realtime-Modell braucht laut vLLM-Rezept ≥ 16 GB VRAM (BF16, keine Quant). Die RTX 3060 hat 12 GB → passt nicht.

  • Interim-gpubox (nur 3060): whisper (mit M0.1-Fix) + F5-TTS bleiben aktiv. Voxtral NICHT starten.
  • Ab der 24-GB-Karte: Voxtral-Profil hochziehen, whisper wird Fallback.

Deshalb liegen beide Services hinter dem Compose-Profil voxtral und starten NUR explizit — sonst würden whisper und voxtral dieselben stt_*-Messages beantworten (Kollision).

Starten (erst wenn die 24-GB-Karte drin ist)

cd xtts
docker compose --profile voxtral up -d --build
docker logs -f aria-voxtral-vllm      # laedt Modell (mehrere GB, dauert)
docker logs -f aria-voxtral-bridge    # "RVS verbunden" + service_status ready

Whisper vorher stoppen, damit nur eine STT-Engine antwortet:

docker compose stop whisper-bridge

⚠️ Auf echter Hardware verifizieren (blind gebaut, kein Test hier)

  1. vLLM-Version ≥ 0.20.0 und die Serve-Form. Das Rezept nutzt vllm serve <model> …. Falls das vllm/vllm-openai-Image einen anderen Entrypoint hat, das command: in docker-compose.yml anpassen (Rezept-Command steht dort als Kommentar).
  2. Realtime-WS-Frames. Die exakten Event-Namen sind in bridge.py ganz oben als Konstanten gebündelt (VLLM_SEND_APPEND, VLLM_DELTA_SUFFIXES, …), modelliert nach dem OpenAI-Realtime-Schema. Gegen das offizielle vLLM-Realtime-Client-Beispiel prüfen und dort anpassen — nur an dieser einen Stelle. Das Response-Handling ist bereits defensiv (mehrere Feldnamen).
  3. Endpoint-URL/Port. Default ws://voxtral-vllm:8000/v1/realtime — prüfen ob vLLM auf 8000 lauscht und /v1/realtime registriert (Log-Zeile Route: /v1/realtime).
  4. Endpointing. Voxtral liefert keine eigene VAD → unser adaptiver Endpointer entscheidet (akustisch + semantisch am Delta-Wachstum). endpointMs kommt wie bei whisper aus der App; voiceFactor per Session tunebar.

Protokoll (RVS, identisch zu whisper — drop-in)

Rein: stt_stream_start, stt_audio_chunk (16 kHz mono s16le, base64), stt_stream_end. Raus: stt_partial, stt_endpoint (das Event, auf das aria-bridge horcht), stt_stream_done.

TTS-Hinweis

Voxtral-TTS (Voice-Cloning) ist hier NICHT enthalten — braucht ebenfalls 16 GB VRAM und ist ein eigener Bau. Bis zur 24-GB-Karte bleibt F5-TTS aktiv. Danach: eigener voxtral-tts-Satellit (separates Ticket).

Quellen