Voice Pipe: Lokal auf 12 GB VRAM
Voice ist der ehrlichste Beweis dafür, dass lokale KI im Betrieb trägt: eine komplette Sprachkette aus Erkennung, Sprech-Helfer und Ausgabe läuft auf einer einzigen Consumer-Grafikkarte. Der Engpass ist nicht die Intelligenz der Modelle, sondern der Speicher.
Ein Text-Chat verzeiht drei Sekunden Nachdenken. Ein Gespräch verzeiht sie nicht. Ab einer bestimmten Verzögerung redet man nicht mehr mit einem System, sondern bewirbt sich bei ihm um einen Sprechplatz.
Deshalb war Sprache bei mir nie Spielerei, sondern Härtetest. Wenn ein Agent zuhören, denken und antworten kann, ohne dass das Gespräch abreißt, trägt die Infrastruktur auch alles andere.
Heute läuft die komplette Kette auf einer RTX 4070 Ti mit 12 GB, daneben ein Ryzen 9 5900X. Erkennung, Sprech-Helfer und Ausgabe gleichzeitig. Der Weg dorthin war ein halbes Jahr Messen, Verwerfen und Neubauen, und der eigentliche Gegner war nie die Intelligenz der Modelle. Es war der Speicher.
Wie es anfing: eine Telefonnummer
Im Februar 2026 stand am Anfang etwas Unspektakuläres: eine echte Rufnummer, an der ein Assistent abnimmt. SIP-Trunk, dahinter zuerst ein kleiner Daemon, der die Protokollzeilen mitlas und bei „incoming call" ein /accept schickte. Danach Asterisk als Telefonanlage, verbunden über AudioSocket - ein denkbar schlichtes Binärprotokoll, drei Nachrichtentypen, fertig.
Das lief, und zwar echt:
- 136 Anrufe zwischen dem 6. und dem 24. Februar
- 351 Kontext-Einträge über 24 Anrufe: 181 Aufgaben, 156 E-Mails, 14 Termine
- 288 verarbeitete Aufträge
Ein Detail von damals gefällt mir bis heute. Der Assistent musste wissen, was „die" oder „das zweite" meint. Also bekam jede erkannte Sache ein Gewicht, das pro Gesprächsrunde um die Hälfte verfiel. Kein ewiges Mitschleppen, kein Vergessen mitten im Satz. Das ist der direkte Vorfahr des Objekt-Gedächtnisses, das die Agenten heute benutzen.
Was ich alles versucht habe
In dem Ordner liegen sechzehn Varianten derselben Brücke nebeneinander. Jede ist die Antwort auf ein Problem, und die Dateinamen erzählen die Geschichte besser als jede Doku:
| Variante | Das Problem dahinter |
|---|---|
bridge.js |
Erstkontakt, Audio raus, Antwort rein |
bridge_ulaw.js, bridge_slin.js, bridge_tone_test.js |
Es kam nur Rauschen. µ-law gegen slin16, Codec-Suche bis zum reinen Testton |
bridge_whisper.js |
Raus aus der Cloud, eigene Spracherkennung |
bridge_tools.js |
Der Assistent soll etwas tun, nicht nur reden |
bridge_parallel.js |
Mehrere Aufträge in einem Satz, parallel abgearbeitet |
bridge_queue.js |
Sofort quittieren, im Hintergrund arbeiten |
Zwei Kniffe von damals leben bis heute. Der erste: dreißig feste Sätze vorab in der Assistenten-Stimme erzeugt - Begrüßung, Quittung, „erledigt", Verabschiedung. Für diese Sätze ist die Ausgabezeit null. Der Meeting-Agent lädt genau dieses Verzeichnis bis heute beim Start in den Speicher.
Der zweite: erst quittieren, dann arbeiten. „Ok, ich kümmere mich darum" kommt sofort, die eigentliche Arbeit läuft dahinter. Gefühlte Wartezeit ist etwas anderes als gemessene.
Der erste Feind: wann ist der Satz zu Ende?
Das klingt trivial und ist es nicht. Die erste Fassung war reine Energiemessung mit von Hand kalibrierten Schwellen:
SILENCE_THRESHOLD = 1800 // für die Lärmumgebung Auto kalibriert
SILENCE_DURATION = 1500 // 1,5 s Pause = Sprecher fertig
MIN_SPEECH_DURATION = 800 // darunter ist es ein Klicken oder der Blinker
Die Kommentare sind ernst gemeint. Ich habe aus dem Auto angerufen, und der Blinker wurde als Sprache gezählt. Heute macht das ein neuronales Verfahren, das aus Inhalt und Sprachmelodie entscheidet, ob jemand fertig ist - mit einem Nachlauf, der ein Weiterreden nach kurzer Pause an dieselbe Äußerung anhängt, statt sie zu zerschneiden.
Die Modelle kamen und gingen
Bei der Erkennung: Whisper, dann ein Streaming-Modell, heute Parakeet auf der CPU. Bei der Ausgabe: F5-TTS, dann CosyVoice, heute Qwen3-TTS. Jeder Wechsel hatte einen Grund und eine Zahl.
Parakeet dekodiert alle 450 Millisekunden das wachsende Sprachfenster komplett neu. Man sieht dabei zu, wie sich das Zwischenergebnis selbst korrigiert. Gemessen auf denselben Aufnahmen, ohne Grafikkarte:
| Aufnahme | Dauer | Rechenzeit | Echtzeitfaktor |
|---|---|---|---|
| kurz | 0,9 s | 69 ms | 0,077 |
| mittel | 1,7 s | 85 ms | 0,051 |
| mit Störgeräusch | 2,6 s | 124 ms | 0,048 |
| lang | 5,9 s | 218 ms | 0,037 |
Ein Zwanzigstel der Echtzeit, auf Prozessorkernen, die sonst Däumchen drehen. Das ist der Grund, warum die Erkennung heute gar keinen Grafikspeicher mehr belegt.
Beim Sprechen brachte der letzte Wechsel den größten Sprung: etwa 377 Millisekunden bis zum ersten Ton statt 700 bis 1170 - bei halbiertem Speicherbedarf.
Parakeet hat mich falsch verstanden
Und zwar hartnäckig. Der Assistent heißt Donna, das Weckwort ist „Hey Donna". Die Erkennung schrieb konsequent „Donner". Dreimal habe ich hineingesprochen, dreimal blieb es still, und im Protokoll stand jedes Mal das Wetter.
Die Lösung war, die Regel tolerant zu machen: endet der Name auf einen Vokal, zählt auch die Variante mit angehängtem r. In Kauf genommen: ein Gewitter weckt sie jetzt ebenfalls. Damit kann ich leben.
Das größere Problem war das Gegenteil - Erkennung, wo niemand spricht. Deutsche Whisper-Modelle erfinden auf Stille Sätze aus ihren Trainingsdaten. Die Sperrliste in meiner Pipe liest sich wie ein Querschnitt durchs Internet:
Vielen Dank.
Untertitel von …
Untertitelung des ZDF
Herr Präsident, liebe Kolleginnen und Kollegen!
Amara.org
Bis zum nächsten Mal.
Thanks for watching
Der Bundestag und YouTube-Abspänne, hörbar gemacht durch ein schweigendes Mikrofon. In einem Vergleichslauf über 17 echte Aufnahmen waren elf reine Stille - beide geprüften Modelle lieferten korrekt nichts. Genau da erfindet Whisper.
Und ein Befund gegen die Intuition: für den Qualitätsdurchlauf nutze ich bewusst das unveränderte Whisper-Modell statt eines deutschen Fine-Tunes. Die Fine-Tunes verlernen mein eigenes Vokabular. Auf den Fachbegriffen: 0,0 Prozent Fehler gegen 9,2 Prozent.
Die zwölf Gigabyte
Hier liegt der Hauptdarsteller. Drei Modelle laufen gleichzeitig auf der Karte und belegen zusammen rund 9,9 GB:
| Rolle | Modell | Läuft auf |
|---|---|---|
| Spracherkennung | Qwen3-ASR 1,7B, Q8 | Grafikkarte, Vulkan |
| Sprech-Helfer | Gemma-4-E2B, Q4 | Grafikkarte, Vulkan |
| Sprachausgabe | Qwen3-TTS 1,7B | Grafikkarte, torch |
| Satzende-Erkennung | Silero plus Turn-Modell | Prozessor |
| Live-Erkennung | Parakeet | Prozessor |
| Sprecher-Erkennung | ECAPA | Prozessor |
Frei bleiben 1,7 GB. In diesem Rahmen findet alles statt.
Was Knappheit erzwingt, ist Disziplin. Das Ladeskript ist ein Lehrstück in vier Schritten, und die Reihenfolge ist keine Zierde:
# [0] VRAM freimachen: alte und konkurrierende Dienste stoppen
for p in 8088 8082 8083 8081 8087 8009 8000; do fuser -k "$p"/tcp 2>/dev/null; done
sleep 4
echo " GPU frei jetzt: $(nvidia-smi --query-gpu=memory.free --format=csv,noheader)"
# [2/3] Sprech-Helfer laden - Vulkan statt CUDA, 4096 Zeichen Kontext
setsid nohup "$LLAMA/llama-server" -m "$M/gemma-4-e2b/gemma-4-E2B_q4_0-it.gguf" \
--host 0.0.0.0 --port 8082 -ngl 99 --device Vulkan0 -c 4096 &
# Warten, bis alle drei gesund melden (bis 90 s, die Ausgabe braucht am längsten)
for i in $(seq 1 30); do curl -s -m2 "http://127.0.0.1:$p/health" >/dev/null && break; sleep 3; done
# Aufwärmen: schluckt die einmalige Vulkan-Übersetzung,
# damit der erste echte Turn rund 100 ms braucht
curl -s -m30 -o /dev/null "http://127.0.0.1:8088/tts/stream" \
-d '{"text":"Hallo.","voice":"donna"}'
Der Aufwärm-Schritt sieht nach Verschwendung aus und ist der wichtigste. Er schluckt die einmalige Übersetzung der Rechenkerne, damit der erste echte Turn rund 100 Millisekunden braucht statt mehrerer Sekunden.
Sein Vorgänger sagte dasselbe Problem in fünf Zeilen:
# Umschalten zwischen zwei Erkennern - nur EINS passt in den VRAM
case "$1" in
nemotron) sudo systemctl stop whisper-server; sudo systemctl start nemotron-stt;;
whisper) sudo systemctl stop nemotron-stt; sudo systemctl start whisper-server;;
esac
Der teuerste Fehler auf diesem Weg war unsichtbar. Die Sprecher-Erkennung musste auf den Prozessor ausweichen, weil ein deutsches Erkennungsmodell 6,2 GB brauchte und sie aus dem Speicher drängte. Gemerkt habe ich es daran, dass die Gesundheitsprüfung weiter „ok" meldete, während intern loaded:false stand. Ein Dienst, der antwortet, funktioniert noch lange nicht.
Wo es heute steht
Das Konzeptpapier vom Juli hält den damaligen Zustand schonungslos fest: „Latenz zu hoch: 10 bis 45 Sekunden bis zum ersten Wort." Ein einzelner Kalender-Aufruf brauchte 8,7 Sekunden.
Der beste dokumentierte Wert nach dem Umbau: etwa 1,2 Sekunden bis zum ersten hörbaren Ton. Diese Messung stammt allerdings aus der Zeit vor dem letzten Ausgabe-Wechsel, der allein rund 400 Millisekunden gebracht hat. Was die heutige Kette Ende zu Ende leistet, messe ich gerade sauber nach - mit den fertigen Skripten und 700 echten Aufnahmen als Prüfkorpus. Die Zahlen kommen hierher, sobald sie stehen.
Was ich schon sagen kann: der Unterschied zwischen „technisch möglich" und „man redet einfach" liegt nicht in einem einzelnen Modell. Er liegt in einem Dutzend kleiner Entscheidungen - vorproduzierte Sätze, satzweises Streamen mit gebündelten Häppchen, 200 Millisekunden Stille als Abschluss, damit das letzte Wort ausklingt.
Fazit
Eine vollständige Sprachkette läuft auf einer Consumer-Grafikkarte für unter tausend Euro. Kein Abo, keine Anfrage verlässt das Haus, keine fremde Firma hört mit.
Der Preis ist Disziplin. Man kann nicht drei große Modelle nehmen und hoffen. Man nimmt kleine, quantisiert sie, schiebt alles auf den Prozessor, was dort laufen kann, räumt vor dem Laden auf und wärmt vor dem ersten Nutzer auf.
Die 12 GB waren nie das Problem. Sie waren die Anforderung.
Unternehmer, Software-Architekt & AI Builder. Vorstand & CTO der tricoma AG - baut seit über 16 Jahren Unternehmen, Systeme und eigene KI-Infrastruktur. Schreibt hier über das, was er selbst betreibt: keine Theorie, sondern laufender Betrieb.
Mehr über mich