Qognio
← Lab · LiveKit
🎙️
⭐ live

LiveKit — Sovereign Voice-Agent

Self-hosted WebRTC-Server + Python-Agent gegen unseren Bunker-Stack. Whisper-STT, qwen-LLM, voxcpm2-TTS — alles in einem Sovereign-Container, keine Audio-Sekunde verlässt unsere Hardware.

Framework
LiveKit + livekit-agents
Lizenz
Apache-2.0
STT
whisper-large-v3-turbo
LLM
qwen3.6-27b-bunker
TTS
voxcpm2-bunker/lea
Hosting
Sovereign-Container im Bunker

Architektur

Browser (Mikrofon)
  │  wss:// — TLS-terminiert am Edge
  ▼
Edge-Reverse-Proxy  →  Sovereign-Container
                         ├─ /rtc    → LiveKit-Server (WebRTC)
                         ├─ /token  → Token-Issuer (FastAPI/JWT)
                         └─ /       → Demo-UI

Python-Agent-Worker joined denselben Room:
  ├─ VAD (silero)
  ├─ STT — whisper-large-v3-turbo-bunker
  ├─ LLM — qwen3.6-27b-bunker (mit Persona)
  └─ TTS — voxcpm2-bunker/lea  (deutsche Voice)

Sovereign-Aspekt

Vapi und ElevenLabs Conversational AI sind US-Cloud-Closed-Source. Unser Stack: komplett Open-Source und komplett im Bunker. Auch die Telefon-Bridge (sobald wir SIP einbauen) bleibt sovereign — kein Anruf läuft jemals durch ein US-Datacenter.

Demo-Persona

Die Demo läuft als generische Bestellauskunft: fragt nach Kunden- oder Bestellnummer und antwortet mit plausiblen Mock-Status. In einer Production-Variante hängt das LLM am eigenen Datenmodell — als RAG über eure Doku oder als read-only-Adapter gegen ein bestehendes Backend.

Lessons-Learned

1) WebRTC will Host-Networking

UDP-Port-Range für Media (~50 Ports) + TCP-Signalling. Docker-Bridge mit Port-Range-Mapping zerschießt die ICE-Candidates. network_mode: host im Container ist die unkomplizierte Wahl.

2) use_external_ip: true in livekit.yaml

Damit der Server seine extern erreichbare IP als ICE-Candidate ausweist statt der internen Container-Adresse — sonst läuft der Handshake aus dem Browser ins Leere.

3) Whisper über LiteLLM ist STT-OpenAI-kompatibel

STT-Plugin nimmt einen openai-Adapter mit base_url-Override — drop-in gegen den Bunker-LiteLLM, kein Custom-Provider nötig.

4) Kernel-Keyring-Limits für Docker-in-Container

Bei Docker innerhalb eines unprivilegierten LXC-Containers laufen die Default-Keyring-Limits voll → „disk quota exceeded" beim Start. Fix: kernel.keys.maxkeys auf dem Host hochsetzen.

📦 Als Addon buchbar

ab 4.500 € pauschal

Voice-Stack on-prem für eure Use-Cases:

Termin vereinbaren →