4 Punkte von GN⁺ 2024-05-14 | 1 Kommentare | Auf WhatsApp teilen
  • Pi-C.A.R.D ist ein KI-Sprachassistent, der vollständig lokal auf einem Raspberry Pi läuft, und ein Projekt, das konversationelle LLM-Funktionen auf Raspberry-Pi-Hardware umsetzt
  • Es gibt zwei Interaktionsarten: wake-word-basiert mit main.py und GPIO-tastenbasiert mit main_button.py; während eines Gesprächs muss das Wake Word nicht wiederholt werden
  • Der Gesprächsverlauf lässt sich in config.py steuern, und mit kleinerem Speicher erhält man schnellere Antworten
  • Um schnell und leichtgewichtig zu sein, nutzt das Projekt C++-Implementierungen wie whisper.cpp und llama.cpp; für die Entscheidung über den Zugriff auf externe Informationen wird das feinabgestimmte BERT tool-bert2 verwendet
  • Für kamerabasierte Funktionen wird zwar an mehreren Stellen im README erklärt, wie sie eingerichtet werden, es gibt aber den Hinweis, dass sie derzeit wegen Änderungen bei der Unterstützung von Vision-Modellen in llama.cpp vorübergehend entfernt wurden

Was Pi-C.A.R.D macht

  • Pi-C.A.R.D ist ein KI-basierter Assistent, der auf einem Raspberry Pi läuft und darauf abzielt, Aufgaben lokal zu verarbeiten, die ein Standard-LLM wie ChatGPT in einer Gesprächsumgebung ausführt
  • Der Name steht für Raspberry Pi - Camera Audio Recognition Device
  • Es wird darauf hingewiesen, dass sich das Projekt noch in aktiver Entwicklung befindet und Issues oder Pull Requests willkommen sind
  • Von der neu hinzugefügten Docker-Unterstützung erhofft man sich eine einfachere Einrichtung und Anpassung
  • Eine Videoeinführung gibt es noch nicht; sie soll später bereitgestellt werden

Funktionsweise

  • Wake-Word-Modus

    • Wenn main.py ausgeführt wird, lauscht das System auf ein Wake Word und startet dann das Gespräch
    • Die standardmäßigen Wake Words sind "raspberry", "barry", "razbear"
    • Nachdem ein Gespräch begonnen hat, muss das Wake Word nicht bei jeder Äußerung wiederholt werden
    • Mit Ausdrücken wie "stop", "exit", "goodbye" wird das Gespräch beendet
    • Das Wake Word und zugehörige Verhaltensweisen können in config.py geändert werden
  • Tastenmodus

    • Mit Breadboard, Kabeln und einer Taste kann ein Gespräch über eine GPIO-Taste gestartet werden
    • Dabei drückt man die Taste und spricht anschließend den Befehl; laut README ist dies die flüssigere Interaktionsform
    • Die Einrichtung der Taste folgt den Hinweisen in main_button.py
    • In der Tastenvariante kann man Gespräche per Taste starten oder den Assistenten jederzeit unterbrechen
  • Gesprächsspeicher

    • Der Chatbot verfügt über einen konfigurierbaren Gesprächsspeicher
    • Damit kann er frühere Äußerungen wieder aufgreifen oder vorherige Themen ausführlicher behandeln
    • Wer schnellere Antworten möchte, kann den Speicherwert in config.py kleiner setzen

Ziel und Grenzen der lokalen Ausführung

  • Das Ziel des Projekts ist es zu prüfen, wie effizient sich ein vollständig offline arbeitender Sprachassistent auf vergleichsweise günstiger Hardware wie dem Raspberry Pi umsetzen lässt
  • Da sämtliche Verarbeitung lokal erfolgt, ist das System nicht so leistungsfähig oder schnell wie Cloud-basierte Systeme
  • Laut README gab es im vergangenen Jahr große Fortschritte bei kleinen LLM-Modellen, und auch dieses Projekt könne sich dadurch weiter verbessern
  • Als Grund, warum es nicht als App gebaut wurde, wird genannt, dass der schwierigste Teil darin bestehe, einen vollständig offline arbeitenden Sprachassistenten schnell auf einem Raspberry Pi auszuführen
  • Wenn dieser Ansatz funktioniert, könne ein ähnliches System auf leistungsfähigerer Hardware noch schneller laufen

Ausführung und Einrichtung

  • Nach dem Herunterladen des Repositorys sowie dem Abschließen der Anforderungen und Einstellungen wird es mit folgendem Befehl gestartet
python main.py
  • Die Tastenvariante wird mit folgendem Befehl gestartet
python main_button.py
  • Die Ausführung mit Docker wird als empfohlene Methode vorgestellt und verwendet folgende Befehle
sudo docker-compose build
sudo docker-compose up
  • Die Docker-Unterstützung wurde erst kürzlich hinzugefügt und funktioniert möglicherweise noch nicht vollständig
  • Mit Docker funktioniert derzeit nur die Wake-Word-Variante; wie sich GPIO-Zugriff in den Container durchreichen lässt, ist noch nicht sicher geklärt

Verwendete Software und Werkzeuge

  • Um ein schnelles und leichtgewichtiges System zu bauen, werden wo immer möglich C++-Implementierungen verwendet
  • Für die Audiotranskription wird whisper.cpp genutzt; die Einrichtung soll anhand des Quick-Start-Guides erfolgen
  • Das README erklärt, dass für Vision-Funktionen llama.cpp verwendet wird, aber der Hinweis am Anfang besagt, dass die Kamerafunktion vorübergehend entfernt wurde, weil llama.cpp Vision-Modelle nicht mehr aktiv unterstützt
  • Damit der Assistent eher wie ein echter Assistent arbeitet, gibt es einige Funktionen für den Zugriff auf Werkzeuge
    • Die Entscheidung über den Werkzeugzugriff erfolgt über tool-bert
    • tool-bert2 ist ein feinabgestimmtes BERT, das entscheidet, wann auf externe Informationen zugegriffen werden soll
    • Wie dieses Modell erstellt wird, ist im tool-bert-Repository beschrieben
    • Um den Werkzeugzugriff zu aktivieren, müssen in .env.example die erforderlichen Schlüssel und Secrets geprüft werden

Status der Kamera- und Vision-Funktionen

  • Im README wird beschrieben, dass man durch Anschließen einer Kamera an den Raspberry Pi Fotos aufnehmen, Gesehenes beschreiben und Fragen zu dem Bild stellen kann
  • Die Vision-Funktion wird eingerichtet, indem in config.py vision_model auf vlm gesetzt wird
  • Als zu verwendendes Modell wird Qwen2-VL-2B-Instruct genannt
  • Da die Größe der Eingabebild-Token dynamisch ist, lässt sich die Inferenzzeit verkürzen, wenn man die Größe der aufgenommenen Bilder reduziert
  • Laut dem Hinweis am Anfang des Projekts ist die Kamerafunktion derzeit jedoch vorübergehend entfernt

Benötigte Hardware

  • Die grundlegende Hardwarekonfiguration besteht aus einem Raspberry Pi 5 Model B, einem USB-Mikrofon und Lautsprechern
  • USB-Mikrofon und Lautsprecher werden an die USB-Ports des Raspberry Pi angeschlossen
  • Die Kamera wird an den Kamera-Port des Raspberry Pi angeschlossen
  • Im README wurden folgende Komponenten verwendet
  • Der Raspberry Pi 5 verwendet einen neuen Kamera-Port, daher wird ein neuer Kameraanschluss benötigt
  • Der Kameraanschluss ist optional, muss aber gekauft werden, wenn die Kamerafunktion genutzt werden soll
  • Für die Einrichtung der GPIO-Taste sei der erste Teil dieses Tutorials hilfreich gewesen
  • Das Projekt konzentriert sich darauf, auf dem Raspberry Pi 5 zu funktionieren, soll aber auch auf anderen Geräten laufen können

Roadmap und Fortschritt

  • Als abgeschlossen markiert sind grundlegende Gesprächsfunktionen, Kamerafunktionen, Benchmarks für Antwortzeiten, Overclocking-Tests und die Suche nach Möglichkeiten zur Verkürzung der Whisper-Laufzeit
  • Ebenfalls als abgeschlossen markiert sind das Unterbrechen des Assistenten und Stellen einer neuen Frage, die Verwendung eines custom tuned model sowie Verbesserungen am externen Service-Funktionsmodell tool-bert
  • Auch Tests mit portabler Stromversorgung und die Dockerisierung für weitere Gerätetests sind abgeschlossen
  • Zu den verbleibenden Punkten gehören verbesserte Tutorials und Videos, optionale Modellerzeugung mit entropix, Tests mit anderen Sprachen und die Einbindung weiterer externer Services
  • Ein Notion-Board zur Fortschrittsverfolgung ist noch nicht fertig; ein Link ist angegeben

1 Kommentare

 
GN⁺ 2024-05-14
Meinungen auf Hacker News
  • Ich wollte einen vollständig offline arbeitenden Sprachassistenten bauen, der keinerlei Internetverbindung benötigt, um die Privatsphäre der Nutzer zu schützen und zu verhindern, dass Daten an Server Dritter gehen.
    Guter Versuch, danke dafür.

    • Es wäre schön, wenn Apple/Google eine Technik einbauen würden, die nachweisbar und überprüfbar macht, dass Kamera/Mikrofon eines Geräts nur dann erfassen können, wenn die Kontrollleuchte an ist, und dass weder Apps noch höhere Ebenen des Betriebssystems das umgehen können.
    • Die wichtigste Funktion, die ich mir bei jedem „Assistenten“ wünsche, ist Offline-Betrieb.
      Ich frage mich, ob das nur auf dem Pi 5 läuft oder auch auf anderen Boards als dem Raspberry Pi.
    • Der Name ist gut, und noch besser ist die Verwendung des alten Picard-Facepalm-Memes.
      Im Ernst: Wegen des Namens ist es mir aufgefallen, und nach dem Lesen der Vorstellung dachte ich: „Eine Alexa, die nicht alles, was ich sage, zu Amazon hochlädt, könnte auch für mich nützlich sein.“
      Wenn das Standard-Wake-Word „hey assistant“ ist, würde ich „Computer“ empfehlen :) Natürlich sollte die Stimme wie https://en.wikipedia.org/wiki/Majel_Barrett klingen.
  • Was ich brauche, ist ein Sprachassistent, den ein RPi 4 stemmen kann, der in HomeAssistant integriert ist und nur offline läuft, damit meine Daten nirgendwohin gesendet werden.
    Im Vergleich zu allem, was ich bisher gesehen habe, scheint dieses Projekt fast alle Anforderungen zu erfüllen; wirkt also gut gemacht.
    Außerdem würde mich interessieren, ob jemand ein RPi-kompatibles Mikrofon empfehlen kann, das sich für Einsatzzwecke wie Alexa eignet.

    • Schau dir am besten Rhasspy an.
      Ein großes Sprachmodell praktisch auf einem 4B laufen zu lassen, ist schwierig, aber es muss nicht unbedingt auf einem großen Sprachmodell basieren.
      In der Rhasspy-Community ist das Muster verbreitet, auf Satellitengeräten mit Mikrofon eine günstige, leichtgewichtige Wake-Word-Erkennung lokal auszuführen (dafür sollte auch ein 4B reichen) und die eigentliche Aufnahme für bessere Ergebnisse über das lokale Netzwerk an einen zentralen Hub zu streamen.
    • https://www.robotshop.com/products/respeaker-usb-microphone-...
    • Die Playstation-3/4-Kamera hat ebenfalls Mikrofone, und die Ergebnisse waren ordentlich.
      Auf eBay bekommt man sie für etwa 15–20 Dollar.
    • Hast du dir die in HA integrierte Voice Assistant-Funktion schon angesehen? https://www.home-assistant.io/voice_control/
      NabuCasa hat den Hauptentwickler von Rhasspy eingestellt, um an dieser Funktion zu arbeiten, und sie wird mit jedem Update besser.
  • „Warum Pi-card? Raspberry Pi - Camera Audio Recognition Device“ — damit wurde offenbar die LCARS-Chance verpasst.
    Man hätte es LLM Camera Audio Recognition Service nennen und natürlich auf das Schlüsselwort „computer“ reagieren lassen können. Wenn es auch auf Nicht-Pi-Hardware läuft, könnte es LCARS werden.

    • Pi-C.A.R.D ist perfekt.
      Es liest sich zu 100 % wie Picard und ist leichter zu erkennen als LCARS.
    • Deshalb können wir keine coolen LCARS-Dinge haben: https://en.wikipedia.org/wiki/LCARS#Legal
    • Oder man könnte LLM Offline Camera, User Trained Understanding Speech daraus machen, dann wäre auch LOCUTUS möglich.
    • Es müsste so etwas wie Beneficial Audio Realtime Recognition Electronic Transformer heißen.
  • Ich freue mich darauf, das auszuprobieren.
    Nach meinem Wissen gibt es immer noch viel zu wenige Sprachassistenten, die offen, stabil, flexibel und auf Privatsphäre ausgerichtet sind; ich hoffe also, dass dieses Projekt Fahrt aufnimmt.
    Vor etwa einem Jahr wollten meine Familienmitglieder unbedingt Alexa anschaffen, aber ich wollte kein Bezos-Überwachungsgerät im Haus haben und habe sie überzeugt, stattdessen selbst etwas zu bauen. Ich entschied mich für Mycroft auf einem Pi 4, aber es lief nicht gut: Die Wake-Word-Erkennung war unzuverlässig, es fehlten Integrationen, und zu dem Zeitpunkt wirkte das Projekt praktisch verwaist. Ich wollte zum Projekt und zu den Integrationen beitragen, an denen ich hängenblieb, aber das Leben kam dazwischen und ich bin nie dazu zurückgekehrt; zum Glück hat meine Familie Alexa inzwischen vergessen.

    • In manchen Maker-Produkten, die bei Target verkauft wurden, steckten eine Pappschachtel, oben ein Arcade-RGB-LED-Button, ein Lautsprecher und vier Mikrofone auf einem „Hat“ für den RPi.
      Ob es ein Nano oder Pico war, weiß ich nicht mehr; jedenfalls war es ein Board ungefähr in SO-DIMM-Größe. Es gab kein Wake-Word: Man drückte den weiß leuchtenden Button, woraufhin die Farbe zweimal wechselte – einmal als Bestätigung des Tastendrucks und einmal als Anzeige, dass es zuhört. Wenn man fertig gesprochen hatte, wechselte die Farbe wieder und es sprach die Antwort aus.
      Im Backend lief irgendetwas von Google, und es war wirklich frustrierend, es einzurichten und dauerhaft am Laufen zu halten, aber es funktionierte. Ich habe zwei solche Geräte und warte seitdem auf etwas, mit dem ich etwas Ähnliches selbst hosten kann.
    • Das zu lesen hat mich wirklich ermutigt; ich hoffe, es hilft.
      Ich plane, noch mehr daran zu arbeiten. Es gibt auf YouTube ein paar kurze Demos, die einen Eindruck von der aktuellen Qualität vermitteln: https://www.youtube.com/watch?v=OryGVbh5JZE
  • Ich frage mich, ob man das auf einer normalen Linux-Maschine ausführen kann.
    Oder ob jemand ein ähnliches Projekt kennt, bei dem das möglich ist.
    Ich hatte früher schon einmal danach gesucht, aber dieser Bereich ist komplex, und die Einschränkungen waren subtil.

    • Ein Raspberry Pi ist einer normalen Linux-Maschine sehr ähnlich; der größte Unterschied ist, dass er statt einer Intel/AMD-CPU ARM verwendet, wodurch der Support-Umfang etwas kleiner ist.
      Insgesamt scheint Pi-C.A.R.D Python und C++ zu verwenden, daher dürfte es kein großes Problem sein, es überall dort laufen zu lassen, wo man Python und C++ ausführen bzw. kompilieren kann.
  • Vor etwa drei Jahren habe ich versucht, so etwas auf einem RPI 4 der frühen Generation zu bauen, bin aber an den Grenzen der Hardware und meines Wissens gescheitert.
    Zu sehen, dass es jetzt tatsächlich funktioniert, ist wirklich großartig.

  • Ein raspi hat, in den man eine GPU stecken kann, wäre ziemlich cool, aber ich bin mir nicht sicher, ob das praktikabel oder überhaupt möglich ist.
    Die Grafikkarte von heute ist der Elektroschrott von morgen; vielleicht könnte sie in solchen DIY-Raspi-Projekten ein zweites Leben bekommen.

    • Abgesehen vom Ökosystem rund um eine einheitliche Plattform liegen die meisten Alleinstellungsmerkmale des Raspberry Pi bei Formfaktor und Stromverbrauch.
      Wenn man GPU/Adapter/Netzteil anschließt, um billige CUDA-Cores zu nutzen, ist das bei Strom, Preis und Größe wahrscheinlich schlechter als eine bessere SoC- oder x86-NUC-Lösung.
    • Für Krypto-Mining hat man aus einem PCIe-Slot oft vier x1-PCIe-Slots gemacht oder gleich Boards mit 12 oder mehr x1-PCIe-Slots verwendet.
      Ich weiß nicht, welche Magie in PCIe steckt, aber zumindest eines der käuflichen Boards, das Atomic Pi, hatte eine „offengelegte“ PCIe-Schnittstelle.
      Jedenfalls saß die GPU auf einer kleinen PCB, und diese PCB war über ein USB3-Kabel mit einer kleineren PCB im PCIe-Slot des Mainboards verbunden. Der Punkt ist: Was auch immer PCIe genau ist, man kann es offenbar über ein USB3-Kabel zur GPU durchreichen und sie damit arbeiten lassen.
  • In der Hardwareliste sehe ich einen Lautsprecher; ich frage mich, ob das Gerät auch per Sprache antwortet.

    • Ja.
      Im Moment wird https://espeak.sourceforge.net/ verwendet, was nicht gerade besonders angenehm anzuhören ist.
      Außerdem werden die Antworten des großen Sprachmodells gestreamt, daher dauert es nicht lange, bis eine Antwort kommt. Da in Chunks verarbeitet wird, wird gelegentlich kurz nur ein Teil eines Wortes ausgesprochen. Natürlich hängt die Wartezeit auch davon ab, welches Modell verwendet wird und wie groß das Kontextfenster ist.
  • Warum muss Picard beim Earl-Grey-Tee immer sogar seine Temperaturpräferenz angeben?
    Eine so intelligente KI müsste seine Vorlieben doch längst gelernt haben, oder?

    • Völlig off topic, aber vermutlich müsste er das in Wirklichkeit gar nicht.
      In der Serie geben viele Figuren dem Replikator flexiblere Anweisungen. „Tea, Earl Grey, Hot“ wirkt wie Picards Gewohnheit und könnte von primitiveren Essens- und Getränkeautomaten stammen als dem Replikator der Enterprise-D.
    • Vielleicht muss man es so konkret sagen, um einen aus Haftungsgründen sehr defensiven Default zu überschreiben, der deutlich zu lauwarm ist.
      Gibt es in einer Post-Scarcity-Welt noch Klagen? Wahrscheinlich schon.
    • Vielleicht ist es einfach die Macht der Gewohnheit.
      Die meisten Leute bei Starfleet scheinen nicht zu wissen, wie man Replikatoren richtig benutzt. Obwohl sie so ein intelligentes Gerät haben, verwenden sie es wie ein normales Haushaltsgerät, dessen Anleitung sie nie gelesen haben, verpassen 90 % der Funktionen und beschweren sich dann, dass repliziertes Essen schlecht schmeckt.
    • Eigentlich ist er eher nicht spezifisch genug.
      https://i.redd.it/hluqexh3oqc91.jpg
    • Einmal hat er nur „Tea, Earl Grey“ gesagt, und der Computer hat es als „Tea, Earl Grey, luke warm“ verstanden.
  • Ich frage mich, wie das Wake Word funktioniert.
    Hört es ständig mit und ignoriert alles, wenn in den letzten paar Sekunden kein Wake Word oder keine Wake Phrase vorkam?

    • Im Großen und Ganzen ist das die Idee.
      Genauer gesagt speichert man mehrere Audio-Chunks und verwirft jeweils den ältesten; also ein Rolling Window.