Projekt JARVIS, Der erste Linux Satellit: JARVIS bekommt Ohren und eine Stimme
Chris //
Bisher lief ein großer Teil von JARVIS dort, wo die Entwicklung angefangen hat.
Auf dem Server und im Terminal.
Das ist zum Testen praktisch. Für einen persönlichen Assistenten ist es allerdings nicht besonders hilfreich, wenn ich mich erst per SSH auf einem Server anmelden muss, um mit ihm zu sprechen.
Irgendwann musste JARVIS also den Server verlassen.
Nicht vollständig natürlich.
Der eigentliche Core soll weiterhin zentral laufen.
Aber Mikrofon, Lautsprecher und die Interaktion mit dem Benutzer sollen auf kleinen Geräten verteilt werden können.
Genau dafür gibt es jetzt den ersten Linux Satelliten.
Was ist ein Satellit?
Die Idee ist relativ einfach.
Der JARVIS Core läuft zentral auf einem Server.
In verschiedenen Räumen können kleine Geräte stehen, die sich mit diesem Core verbinden.
Ein solcher Satellit braucht im Grunde nur einige wenige Dinge:
- Ein Mikrofon
- Einen Lautsprecher
- Eine Netzwerkverbindung
- Eine Verbindung zum JARVIS Voice Service
Der Satellit selbst muss dabei nicht die komplette Intelligenz enthalten.
Er nimmt Sprache entgegen, schickt sie an den Server und gibt die Antwort anschließend wieder aus.
Die eigentliche Verarbeitung bleibt zentral.
Damit kann ein zukünftiges Setup beispielsweise so aussehen:
Wohnzimmer Satellit
|
v
JARVIS Voice
|
v
JARVIS Core
|
v
Tools und LLM
Und parallel dazu könnte ein zweiter Satellit in einem anderen Raum mit demselben Core verbunden sein.
Warum Linux?
Für den ersten Satelliten wollte ich bewusst keine komplett eigene Hardware entwickeln.
Ein Linux System bietet für die Entwicklung einige Vorteile.
Audio lässt sich relativ einfach testen.
Python kann direkt verwendet werden.
Fehler lassen sich per SSH untersuchen.
Updates können wie bei einem normalen Server verteilt werden.
Außerdem ist die Hardware nicht fest vorgegeben.
Der Linux Satellit soll langfristig nicht nur auf einem bestimmten Gerät funktionieren.
Ein Raspberry Pi mit USB Mikrofon und Lautsprecher könnte genauso ein Satellit sein wie ein anderes kleines ARM System.
Das erste Testgerät ist allerdings etwas spezieller.
Der ReSpeaker Core v2
Für die ersten Versuche verwende ich einen älteren ReSpeaker Core v2.
Das Gerät besitzt mehrere Mikrofone, Audioausgänge, LEDs und einen eigenen Linux Rechner.
Eigentlich ziemlich passend für einen Sprachassistenten.
Allerdings stammt die Hardware nicht gerade aus dem Jahr 2026.
Auf meinem Gerät läuft:
Debian 9
Kernel 4.4.138
ARMv7
Damit wurde die Installation direkt etwas interessanter als geplant.
Die normalen Debian Paketquellen für Debian Stretch existieren inzwischen nicht mehr an den ursprünglichen Adressen.
Die ersten Updates endeten deshalb erwartungsgemäß mit HTTP 404 Fehlern.
Also mussten zunächst die alten Debian Archive eingebunden werden.
Danach ließ sich das System wieder aktualisieren.
Der erste Erfolg des Satellitenprojekts war damit nicht Spracherkennung.
Es war:
apt update funktioniert wieder.
Auch das gehört offenbar zum Bau eines KI Assistenten.
Ein eigener Satellite Client
Der Linux Satellit läuft als eigenes Projekt.
Er bekommt eine kleine Konfiguration mit den wichtigsten Informationen:
Satellite ID
Core Adresse
Voice Port
API Token
Audio Gerät
Sample Rate
Kanäle
Anschließend verbindet er sich mit dem Voice Service des JARVIS Core.
Die Kommunikation läuft über WebSockets.
Beim Start sieht das beispielsweise so aus:
Satellite ID: satellite-respeaker-v2
Core verbunden
Voice Protocol:
jarvis.voice.v1
Audio:
hw:0,0
Sample Rate:
16000 Hz
Damit weiß der Satellit zunächst nur:
Der Core ist erreichbar.
Die Authentifizierung funktioniert.
Und die beiden Seiten sprechen dasselbe Protokoll.
Das klingt noch nicht besonders beeindruckend.
Es ist aber die Grundlage für alles Weitere.
Der erste Audiotest
Im ersten Test wollte ich bewusst noch kein Wake Word einbauen.
Es gibt zunächst eine sehr einfache Steuerung.
ENTER drücken.
Der Satellit nimmt einige Sekunden Audio auf.
Danach werden die Daten an den Voice Service geschickt.
Der Ablauf sieht ungefähr so aus:
ENTER drücken
Aufnahme läuft
Audiodaten werden gesendet
STT verarbeitet Sprache
JARVIS verarbeitet die Anfrage
Antwort wird erzeugt
TTS erzeugt Audio
Satellit spielt Antwort ab
Damit lässt sich jede einzelne Stufe relativ gut testen.
Gerade während der Entwicklung ist das deutlich angenehmer als eine Wake Word Erkennung, die ständig zusätzlich Fehler verursachen könnte.
Und dann hat es tatsächlich funktioniert
Der erste komplette Test war ziemlich unspektakulär.
Ich habe gefragt:
Wie wird das Wetter?
Der Satellit hat die Sprache aufgenommen.
Die Audiodaten wurden an den Server geschickt.
Die Spracherkennung hat daraus Text erzeugt.
JARVIS hat die Wetterfunktion aufgerufen.
Und anschließend kam die Antwort zurück.
Sinngemäß:
In Geisenheim ist es heute bewölkt.
Die Temperaturen liegen ungefähr zwischen
14 und 25 Grad.
Nennenswerter Niederschlag wird nicht erwartet.
Damit funktionierte zum ersten Mal die komplette Kette:
Mikrofon
Sprache
STT
JARVIS Core
Tool
LLM
Antwort
TTS
Lautsprecher
Das war wahrscheinlich einer der größeren Meilensteine des Projekts.
Nicht weil die Wetterabfrage neu wäre.
Die konnte JARVIS schon vorher.
Sondern weil ich sie zum ersten Mal einfach in den Raum sprechen konnte.
STT und TTS bleiben auf dem Server
Bei der Entwicklung stellte sich relativ schnell eine wichtige Architekturfrage.
Wo sollen Speech to Text und Text to Speech eigentlich laufen?
Direkt auf jedem Satelliten?
Oder zentral auf dem Server?
Für den Moment habe ich mich für die zentrale Variante entschieden.
Der Satellit kümmert sich hauptsächlich um:
Audioaufnahme
Audiowiedergabe
Verbindung zum Core
Hardwaresteuerung
Statusanzeige
Die rechenintensiveren Aufgaben laufen auf dem Voice Server.
Das hat mehrere Vorteile.
Ein Satellit braucht deutlich weniger Rechenleistung.
Die Sprachmodelle müssen nicht auf jedem Gerät installiert werden.
Updates müssen nur zentral durchgeführt werden.
Und auch ältere Hardware kann weiterhin als Ein und Ausgabegerät verwendet werden.
Der ReSpeaker Core v2 ist dafür ein ziemlich gutes Beispiel.
Als moderner KI Rechner ist er nicht besonders interessant.
Als Mikrofon und Lautsprecher mit Netzwerkanschluss dagegen schon.
Linux Satellit bedeutet nicht ReSpeaker Satellit
Ein Punkt ist mir dabei wichtig.
Der aktuelle Client ist kein reines ReSpeaker Projekt.
Der ReSpeaker Core v2 ist lediglich die erste getestete Hardware.
Die allgemeine Architektur des Satelliten soll unabhängig davon funktionieren.
Der Kern des Clients braucht lediglich ein Linux System und funktionierende Audiogeräte.
Hardwareabhängige Funktionen werden separat behandelt.
Beim ReSpeaker sind das beispielsweise die LEDs und der Taster.
Ein normaler Raspberry Pi besitzt diese Funktionen möglicherweise gar nicht.
Der eigentliche Voice Client funktioniert trotzdem.
Langfristig könnten also verschiedene Geräte denselben Linux Satellite Client verwenden.
Die LEDs des ReSpeaker
Wenn die Hardware schon einen LED Ring besitzt, möchte man ihn natürlich auch benutzen.
Die LEDs sollen später den aktuellen Zustand des Satelliten anzeigen.
Zum Beispiel:
Bereit
Hört zu
Verarbeitet
Antwortet
Stumm
Fehler
Aus
Das klingt zunächst nach einer einfachen Spielerei.
In der Praxis ist eine visuelle Rückmeldung bei einem Sprachassistenten allerdings sehr hilfreich.
Wenn ich eine Frage stelle, möchte ich wissen:
Hat das Gerät mich gehört?
Nimmt es gerade auf?
Verarbeitet der Server noch?
Oder ist etwas schiefgegangen?
Bei den ReSpeaker LEDs gab es erwartungsgemäß ebenfalls einige Besonderheiten.
Vor allem verschiedene LED Varianten der Hardware wollten unterschiedlich behandelt werden.
Damit bekam der Client schließlich eine eigene Hardwareerkennung.
Der Taster bekommt ebenfalls Funktionen
Der ReSpeaker besitzt außerdem einen physischen Taster.
Auch dieser wird inzwischen verwendet.
Kurzes Drücken schaltet zwischen stumm und aktiv um.
Ein längeres Drücken kann den Satelliten ein oder ausschalten.
Ein noch längeres Drücken startet das Gerät neu.
Vor den entsprechenden Aktionen zeigen die LEDs den Statuswechsel an.
Damit kann der Satellit komplett ohne Tastatur bedient werden.
Das ist wichtig, wenn das Gerät später einfach irgendwo im Raum steht.
Konfiguration automatisch erzeugen
Beim Installieren und Aktualisieren möchte ich möglichst wenig manuell konfigurieren müssen.
Der Installer beziehungsweise Updater erkennt deshalb die unterstützte Hardware.
Wird beispielsweise ein ReSpeaker erkannt und die passende Hardwarekonfiguration fehlt, kann die Datei automatisch angelegt werden.
Der Linux Client bleibt trotzdem allgemein.
Hardwaredetails landen in einer eigenen Konfiguration.
Damit lässt sich später weitere Hardware ergänzen, ohne den eigentlichen Voice Client komplett umzubauen.
Sicherheit gehört auch hier dazu
Natürlich soll sich nicht einfach irgendein Gerät mit dem Voice Service verbinden dürfen.
Deshalb verwendet auch der Satellit einen API Token.
Dieser wird lokal in einer Umgebungsdatei gespeichert.
Beim Aufbau der Verbindung sendet der Client den Token als Bearer Token an den Core.
Damit kann der Server prüfen, ob der Satellit überhaupt berechtigt ist.
Langfristig möchte ich die Verwaltung noch erweitern.
Beispielsweise könnte jeder Satellit einen eigenen Token bekommen.
Damit ließen sich einzelne Geräte gezielt sperren oder austauschen.
Warum ein eigenes Protokoll?
Für die Kommunikation zwischen Core und Satellit gibt es inzwischen eine definierte Protokollversion:
jarvis.voice.v1
Das klingt zunächst etwas übertrieben.
Für die weitere Entwicklung ist es allerdings wichtig.
Denn neben dem Linux Client gibt es inzwischen auch erste Experimente mit ESP32 Hardware.
Später könnten weitere Satelliten folgen.
Alle müssen verstehen, welche Nachrichten der Server sendet.
Zum Beispiel:
reset
audio_start
audio_end
text
response
error
Mit einer klaren Protokollversion kann der Core später erkennen, ob ein Client überhaupt kompatibel ist.
Das dürfte spätestens dann wichtig werden, wenn unterschiedliche Versionen der Satelliten gleichzeitig im Netzwerk laufen.
Der Satellit ist eigentlich ziemlich dumm
Und das ist durchaus Absicht.
Ein Satellit soll möglichst wenig über JARVIS wissen müssen.
Er muss nicht wissen, wie Wetterdaten abgerufen werden.
Er muss keine Kalender verstehen.
Er muss nicht wissen, welches Sprachmodell verwendet wird.
Im Idealfall weiß er nur:
Ich höre Audio.
Ich sende Audio.
Ich empfange eine Antwort.
Ich spiele Audio ab.
Die Intelligenz sitzt zentral.
Dadurch kann ich später das LLM wechseln, neue Tools hinzufügen oder die komplette interne Architektur verändern.
Die Satelliten müssen davon möglichst wenig mitbekommen.
Wie geht es weiter?
Der aktuelle Linux Satellit ist vor allem die erste funktionierende Referenz.
Als Nächstes möchte ich die Hardwareunterstützung weiter abstrahieren.
Ein Raspberry Pi 5 liegt beispielsweise bereits für weitere Tests bereit.
Zusätzlich experimentiere ich mit einem ESP32 S3 als deutlich kleinerem Satelliten.
Langfristig könnte es damit mehrere Geräteklassen geben.
Ein einfacher Satellit für Sprache.
Ein Satellit mit Display.
Ein leistungsfähigerer Satellit mit guten Lautsprechern für Musik.
Und eventuell spezielle Geräte für einzelne Räume.
Alle sprechen jedoch mit demselben Core.
Der aktuelle Stand
Der Linux Satellit kann inzwischen:
- Sich per WebSocket mit dem Voice Server verbinden
- Sich mit einem Bearer Token authentifizieren
- Das Protokoll
jarvis.voice.v1verwenden - Audio über ALSA aufnehmen
- Audiodaten an den Server übertragen
- STT auf dem zentralen Voice Server verwenden
- Anfragen an den JARVIS Core weitergeben
- Antworten empfangen
- TTS Audio wiedergeben
- Hardwareadapter für spezielle Geräte verwenden
- Beim ReSpeaker LEDs ansteuern
- Beim ReSpeaker den Hardwaretaster verwenden
- Eigene Hardwarekonfigurationen automatisch anlegen
Damit hat sich JARVIS erneut ein Stück weiter vom ursprünglichen Terminalprojekt entfernt.
Am Anfang habe ich eine Frage eingetippt und eine Textantwort bekommen.
Jetzt kann in einem Raum ein kleines Linux Gerät stehen, das mit dem zentralen Assistenten spricht.
Und genau das war ursprünglich einer der Punkte, die mich an den ganzen JARVIS Videos überhaupt fasziniert haben.
Einfach eine Frage in den Raum stellen.
Und eine Antwort bekommen.
Der Unterschied ist nur:
Diesmal weiß ich ziemlich genau, was zwischen diesen beiden Momenten alles schiefgehen kann.