2026-08 – 2026-09 · Projektleitung, KI-gestützt mit Claude
Lokaler Sprachassistent für Home Assistant
Ein lokaler Sprachassistent für Home Assistant, der Deutsch und Englisch versteht und ohne Cloud auskommt. Spracherkennung, Sprachausgabe und ein 27B-Qwen-Modell laufen auf eigenen GPUs, vier Satelliten hören auf das selbst trainierte Wake-Word „Cassandra“, und eine gesprochene Antwort kommt nach rund 3,4 Sekunden.
Kurzgefasst
Anfangs spielte mein Home-Assistant-Satellit, die Voice Preview Edition, nur Benachrichtigungstöne ab. Daraus wurde ein Sprachassistent, der Deutsch und Englisch versteht, auf ein eigenes Wake-Word hört und die gesamte Sprachverarbeitung auf meinen eigenen GPUs erledigt. Die Vorgaben waren ein eigenes Wake-Word, keine Cloud und eine ruhige, natürliche Stimme. Eine Antwort sollte nach zwei bis fünf Sekunden kommen, und mit rund 3,4 Sekunden liegt sie in diesem Rahmen.
Die Projektleitung lag bei mir. Ich habe die Ziele gesetzt, die Satelliten geflasht und gelötet, Home Assistant eingerichtet und jede Stimme nach Gehör ausgewählt. Claude habe ich eingesetzt, um schneller voranzukommen, vor allem für Recherche, den Container-Stack, die Patches und die Auswertungen.
System
Satelliten
Neben der Voice Preview Edition laufen drei selbst aufgebaute ReSpeaker-Lite-Boards, alle mit ESPHome und einem Wake-Word, das direkt auf dem ESP32-S3 erkannt wird. Bei den ReSpeaker-Boards war die Stummschaltung ab Werk nicht verbunden. Erst nachdem ich die Lötbrücke gesetzt hatte, reagierte ein stummgeschaltetes Board wirklich nicht mehr auf das Wake-Word.
Sprache
Die Spracherkennung läuft mit whisper.cpp über Vulkan, damit der spätere Wechsel von einer NVIDIA- auf eine AMD-Grafikkarte nichts daran änderte, und erkennt einen Befehl in 365 bis 522 Millisekunden. Die Sprachausgabe übernimmt Kyutai Pocket TTS auf der CPU. Seit die Antwort gestreamt wird, beginnt auch eine lange Antwort nach gut einer Sekunde statt nach über zehn, und ein eigener Sprecher für Zahlen und Uhrzeiten sorgt für die richtige Aussprache in beiden Sprachen.
Häufige Befehle erkennt Home Assistant selbst in rund 0,02 Sekunden, und nur was dort nicht passt, geht an das Sprachmodell. Alles, was Datenschutz oder Sicherheit betrifft, etwa das Stummschalten per Sprachbefehl, läuft bewusst über feste Befehle und nie über das Sprachmodell.
Wissensdienst
Ein kleiner Python-Dienst beantwortet Fragen wie „Welcher Supermarkt in der Nähe hat gerade offen?“ aus einem lokalen OpenStreetMap-Index und berücksichtigt dabei regionale Feiertage. Er wird monatlich neu aufgebaut und ist mit 87 Unit-Tests abgesichert.
Stolpersteine
Whisper erfand auf fast stillen Aufnahmen ganze Sätze und transkribierte gelegentlich die eigene Antwort des Assistenten, bis Filter für Sprachaktivität, Sprache und Konfidenz das beendeten. Nach dem Grafikkartenwechsel liefen die GPU-Dienste unbemerkt auf der CPU, weil die Standardlaufzeit von rootless Podman den Zugriff auf die Karte verhinderte. Mit crun als Laufzeit war das behoben.
Stimmklon
Für das Training des Wake-Words brauchte ich viele Aufnahmen genau der Stimme, die es am häufigsten hören wird, also meiner eigenen. Deshalb entstand ein Zero-Shot-Klon meiner Stimme auf Deutsch und Englisch. Grundlage waren 18 Lesepassagen, die ich eingesprochen habe, dazu ein Podcast und eine Hörbuchlesung. Im Podcast fand eine Sprechertrennung mit pyannote meine Stimme automatisch heraus, sodass am Ende 156 Referenzdateien mit 67 Minuten Sprache vorlagen.
Chatterbox Multilingual erzeugte daraus 6.000 Aufnahmen von „Cassandra“ und 11.354 vorgelesene Buchsätze ohne das Wake-Word, die als schwierigste Negativbeispiele dienten. Automatische Prüfungen sortierten doppelte Wörter, abgeschnittene Enden und eingeschleppte Hintergrundgeräusche aus, und in einer Blindprobe von 100 zufälligen Aufnahmen fand ich keinen einzigen Fehler. Als Nebenprodukt entstand ein Werkzeug, das beliebigen Text mit meiner Stimme vorliest. Der Assistent selbst spricht weiterhin mit einer Standardstimme.
Wake-Word „Cassandra“
Das Wake-Word ist ein rund 138 Kilobyte kleines Modell, das direkt auf den Satelliten läuft. In rund 20 Tagen entstanden vier Generationen. Die vierte habe ich von Grund auf neu trainieren lassen, nachdem der Assistent bei Telefonaten ungewollt aufwachte, mit dem Ziel, an die Zuverlässigkeit des mitgelieferten Wake-Words „Okay Nabu“ heranzukommen.
Aufwand
Die Regeln für die Bewertung standen fest, bevor es ein einziges Ergebnis gab. Das Konzept wuchs über 24 Überarbeitungsrunden mit zwei unabhängigen Gegenprüfern auf rund 5.300 Zeilen. Für die Messung der Trefferquote habe ich an sieben aufeinanderfolgenden Tagen zwölf Aufnahmesitzungen eingesprochen, an fünf dieser Tage zwei. Die Sitzungen wechselten reihum durch vier Räume, und ein Laptop sowie drei Smartphones nahmen jede Äußerung gleichzeitig auf, wobei die Telefone nach einem festen Schema ihre Positionen tauschten.
Jeder Satz kam einmal mit „Cassandra“ und einmal mit „Okay Nabu“, sodass beide Wake-Words dieselbe Aufnahmesituation bekamen. So entstanden 242 Satzpaare in 2.324 Aufnahmen. Zwei frühere Sitzungen habe ich verworfen, weil der Mikrofonschalter des Laptops aus war, obwohl jede technische Prüfung bestanden hatte. Seitdem prüft ein Signaltest jeden Kanal einzeln.
Ergebnis
Das bloße „Cassandra“ erkennt das Modell in 99,2 Prozent der Fälle, „Okay Nabu“ unter denselben Bedingungen nur in 92,6 Prozent, und dieser Vorsprung ist statistisch signifikant. Steht das Wake-Word mitten in einem Befehl, bleibt der Vergleich unentschieden. Bei Fehlauslösungen ist die vierte Generation deutlich besser als die dritte und löste auf denselben Dinnerparty-Aufnahmen dreimal statt 17-mal aus. Die Messlatte von „Okay Nabu“ erreicht sie damit aber noch nicht. Kurz gesagt hört das Modell seinen Besitzer besser als die Referenz, wacht aber häufiger auf, wenn niemand mit ihm spricht.
LLM-Tuning
Vom kleinen zum großen Modell
Im ersten Aufbau lief ein Qwen3-Modell mit 4 Milliarden Parametern über Ollama auf einer RTX 2060 mit 6 GB, und eine Antwort brauchte 169 Sekunden. Nachdem ein Modell ohne Denkmodus im Einsatz war, es vollständig auf der GPU lag, der Kontext auf 4.096 Token verkleinert war und Home Assistant nur noch die nötigen Geräte übergab, waren es im Test 1,47 Sekunden. Seit September läuft ein 27B-Qwen-Modell über vLLM auf einer RTX 5090. Mit abgeschaltetem Denkmodus antwortet es in 2,8 Sekunden und bewältigt auch zusammengesetzte Befehle wie „alle Lichter an außer im Arbeitszimmer“.
Einstellungen, die zählten
Das Modell sollte Home Assistant wirklich steuern, statt nur zu behaupten, es habe das Licht eingeschaltet. Bei der Standardtemperatur von 1,0 rief es nur in 54 Prozent der Fälle ein Werkzeug auf, bei 0,3 und darunter in 132 von 132 Fällen. Deshalb steht die Temperatur für Home Assistant fest auf 0,25. Gemessen wurde jede Änderung, indem echte Anfragen von Home Assistant mitgeschnitten und mit geändertem Prompt wiederholt abgespielt wurden. So stieg etwa die Quote korrekt ausgeführter Befehle beim kleinen Modell von 1 auf 12 von 12.
Übergangslösungen
Insgesamt 14 Übergangslösungen sind dokumentiert, jeweils mit Grund und Verbleib. Die meisten verschwanden mit dem Umzug auf die große Grafikkarte, etwa der kleinere Kontext und die ausgeblendeten Geräte. Andere blieben bewusst, weil sie in die richtige Schicht gehören, zum Beispiel die Zahlenaussprache in der Sprachausgabe statt im Prompt. Einmal setzte ein Update von Home Assistant die Temperatur unbemerkt zurück, obwohl die Oberfläche weiterhin 0,25 anzeigte.
Stand
Der Assistent ist täglich im Einsatz, auf vier Satelliten mit dem eigenen Wake-Word. Offen ist, dass das Sprachmodell nur antwortet, wenn die Workstation läuft, dass das Wake-Word die Messlatte bei Fehlauslösungen noch nicht erreicht und dass die Schwelle auf den ReSpeaker-Mikrofonen noch nicht gemessen ist.
Stack
Home Assistant, ESPHome, microWakeWord, Wyoming, whisper.cpp, faster-whisper, Kyutai Pocket TTS, Chatterbox, pyannote, TensorFlow, Ollama, vLLM, Qwen, Podman, Docker, Debian, Python, OpenStreetMap und SQLite.