Voice — Sprachpfad¶
Spracherkennung und Sprachausgabe für Home Assistant, beides über das Wyoming-Protokoll. Das Sprachmodell selbst läuft nicht hier, sondern resident auf llama-swap.
Endpunkte¶
| Dienst | Endpunkt | Modell |
|---|---|---|
| STT | tcp://10.10.10.7:10300 |
parakeet-tdt-0.6b-v3 (WER 7,6 %, 0,12 s) |
| TTS | tcp://10.10.10.7:10200 |
Piper de_DE-thorsten-high |
Beide Container laufen im Docker-Netz ai und veröffentlichen ihre Ports ins
LAN — Wyoming ist binäres TCP und läuft nicht über einen Reverse Proxy.
Kette¶
Wake Word (CPU) → HA → Parakeet (CPU, 0,12 s) → HA → voice-agent (iGPU, resident) → HA → Piper (CPU)
End-to-End: 634 ms im Median. Home Assistant löst einfache Kommandos über seine eigene Intent-Erkennung; das Sprachmodell ist der Auffangpfad für alles, was dort nicht greift.
Die Aufteilung ist Absicht: Alles, was nie warten darf, läuft auf der CPU. Der ASR-Burst von rund 30 Threads über 0,12 s ist unkritisch, und die iGPU bleibt den Sprachmodellen vorbehalten.
Warum Parakeet und nicht Whisper¶
Im Sprachpfad-Turnier (T3, Juli 2026) trat Parakeet gegen Whisper auf der NPU und gegen einen einstufigen gemma4-Ansatz an:
| Kandidat | WER | Latenz |
|---|---|---|
| Parakeet TDT v3 (CPU) | 7,6 % | 0,12 s |
| Whisper (NPU, FastFlowLM) | 12,1 % | 16-fach |
Parakeet gewann in beiden Disziplinen. Der FastFlowLM-Stack wurde daraufhin
stillgelegt, der npu-whisper-Container entfernt. Das Whisper-Modell liegt
noch unter /opt/ai/npu-models.
Modell-Caches¶
| Pfad | Inhalt | Größe |
|---|---|---|
/opt/ai/volumes/parakeet |
ONNX-Modell | ~600 MB |
/opt/ai/volumes/piper |
Stimm-Datei | ~100 MB |
Beide laden beim ersten Start selbst nach. Sie sind deshalb aus dem Backup ausgeschlossen — reproduzierbar und zusammen 4,9 GB.
Beide Verzeichnisse müssen vorab existieren und 1000:1000 gehören:
sudo mkdir -p /opt/ai/volumes/parakeet /opt/ai/volumes/piper
sudo chown -R 1000:1000 /opt/ai/volumes/parakeet /opt/ai/volumes/piper
Betrieb¶
docker compose -f /opt/aiserver/voice/docker-compose.yaml up -d
docker ps --filter name=wyoming- # beide healthy?
docker logs wyoming-parakeet --tail 50
Der Healthcheck ist eine TCP-Verbindungsprobe — Wyoming spricht kein HTTP, ein
curl gegen den Port läuft ins Leere.
Anbindung in Home Assistant¶
Settings → Devices & Services → Add Integration → Wyoming Protocol, je Endpunkt einmal:
- Host
10.10.10.7, Port10300(STT) - Host
10.10.10.7, Port10200(TTS)
Als Conversation-Agent kommt llama-swap über die OpenAI-kompatible API
(http://10.10.10.7:9292/v1, Modell voice-llamacpp).
Der Sprachpfad existiert derzeit doppelt
Parakeet und Piper laufen mit demselben Image und Modell auch auf dem NUC (siehe Voice-Stack). Der NUC-Stack ist dort produktiv angebunden und nutzt Google Gemini als Conversation-Agent; die hiesige Instanz ist die lokale Ablösung. Die Umstellung von Home Assistant auf diese Endpunkte steht noch aus.
Offen¶
- Voice-Pipeline gegen echtes Home Assistant fahren (Wyoming-Endpunkte umstellen)
gemma4:e4bals einstufigen Audio-Fallback evaluieren (Ollama temporär starten)