In diesem Artikel zeige ich, wie man mit relativ wenigen Schritten und ein bisschen Zeit einen Offline-Sprachassistenten installiert und das ReSpeaker 4-HAT (http://wiki.seeedstudio.com/ReSpeaker_4_Mic_Array_for_Raspberry_Pi/) in Betrieb nimmt.
Da schöne, bzw. Besondere an "Snips" (https://snips.ai/) ist, dass es generell völlig offline und autark arbeitet. Inzwischen ist es möglich (durch die immer bessere Performance von Einplatinen-PCs und neuronalen Netzen) ein Sprachmodell in der Cloud zu trainieren und es dann auf einen relativ genügsamen Hardware laufen zu lassen.
Es wäre allerdings auch möglich, die Snips-Plattform nur als Hotword-Erkennung zu verwenden und danach die Audiodaten an Amazon oder Google weiterzuleiten und dort die Logik zu implementieren.
In diesem Artikel geht es allerdings um die vollständige Standalone-Implementierung der Plattform auf einem Raspberry Pi 3B+ mit ReSpeaker 4-HAT ohne solche Hilfsmittel.
Benötigte Komponenten:
1x Raspberry Pi 3B+
1x Micro-SD-Karte Class 10 mit mind. 4 GB (in meinem Fall war es eine 16GB Speicherkarte)
1x ReSpeaker 4 HAT
Sowie einen PC oder Notebook mit einem Desktop-Betriebssystem für Node.js und SAM (wird nur für die Einrichtung benötigt)
Grundinstallation
Für die Snips Plattform sollte Debain Stretch verwendet werden. Vorsicht: Die aktuellste Rasbian-Version basiert bereits auf Debian Buster und kann noch nicht für Snips verwendet werden, da hierzu die Repos noch nicht bei Snips verfügbar sind und es noch einige unschöne Softwarebugs gibt.
Die neuste Stretch-Version findet sich unter https://downloads.raspberrypi.org/raspbian/images/raspbian-2019-04-09/.
Auf die weitere Installation des Basissystems gehe ich nun hier nicht weiter ein.
Wichtig: Das SPI-Interface muss für die Nutzung des HAT aktiviert sein.
Die Plattform-Installation
Zuerst fügen wir die Snips.ai Paketquellen hinzu:
sudo apt-get update
sudo apt-get install -y dirmngr
sudo bash -c 'echo "deb https://raspbian.snips.ai/$(lsb_release -cs) stable main" > /etc/apt/sources.list.d/snips.list'
sudo apt-key adv --keyserver pgp.mit.edu --recv-keys D4F50CDCA10A2849
sudo apt-get update
Falls der PGP-Schlüssel nicht empfangen werden kann, hilft evtl. dieser Befehl weiter:
sudo apt-key adv --keyserver gpg.mozilla.org --recv-keys D4F50CDCA10A2849
Nach dem erfolgreichen Import der Schlüssel sollte nun eine Installation der eigentlichen Plattform möglich sein:
sudo apt-get install -y snips-platform-voice
sudo apt-get install -y snips-template snips-skill-server
Wir installieren mit den beiden Befehlen oben nahezu die ganze Snips-Plattform. Es wäre hier z.B. auch möglich, nur den Audio-Server zu installieren, um so genannte "Sateliten" zu installieren (https://docs.snips.ai/articles/platform/satellites).
Damit Snips und nun auch hören kann, muss das ReSpreaker HAT installiert werden. Hierzu klonen wir unsd das Git-Repo. Zuerst müssen wir und dazu aber noch Git installieren:
sudo apt-get install git
Danach klonen wir das Repo, wechseln in das Verzeichnis, markieren das Installations-Script als ausführbar und starten die Installation:
git clone https://github.com/respeaker/seeed-voicecard
cd seeed-voicecard
sudo ./install.sh
Da dauert jetzt ein bisschen, da die Kernelmodule für den Chipsatz nun auf dem Gerät nun für den aktiven Kernel erstellt werden.
Nach der Installation führen wir einen Neustart aus:
sudo reboot
Wenn alles funktioniert hat, kann man nun bereits beobachten, dass die LEDs des HAT direkt nach dem Boot kurz aufleuchten.
Installation von SAM
Nun muss die Plattform noch korrekt eingerichtet werden. Diese Arbeit nimmt einem das Kommandozeilentool "SAM" ab. Es kann auf einem beliebigen PC installiert werden und ermöglicht die Verwaltung des Snips-Geräte sowie später auch das Aufspielen des eigenen Assistenten.
Damit wir SAM auf dem PC nutzen können, müssen wir erst Node.js installieren. Das Installationspaket findet sich unter https://nodejs.org/en/
Nun öffnen wir die Eingabeaufforderung unter Windows und installieren SAM:
npm i snips-sam
Konfiguration der Basis mit SAM
Direkt nach der Installation können wir nun SAM nutzen, um uns mit unserem Raspberry zu verbinden:
sam connect <IP-Adresse des Raspi>
Nun den Usernamen (pi) sowie Kennwort eingeben (hoffentlich nicht mehr raspberry) und mit Return bestätigen.
Nun können wir die verfügbaren Audiogeräte abrufen und die Mikrofone einrichten:
sam setup audio
Hierbei wählt SAM automatisch das ReSpeaker 4-HAT als Mikrofone aus. Es muss nun nur noch festgelegt werden, womit Snips später Audio ausgeben soll. In meinem Beispiel benötige ich keine Sprachausgabe, deshalb setze ich hier den HDMI-Ausgang als Audioquelle.
Nun editieren wir die Datei /etc/snips.toml und fügen im Bereich [snips-dialogue] den Eintrag
sound_feedback_disabled_default = true
ein. Somit wird kein unnötiger Feedback-Sound über HDMI abgespielt. Wenn ein Audiogerät für die Ausgabe verwendet werden soll, entfällt dieser Schritt natürlich.
Konfiguration ReSpeaker 4-HAT LED
Um nun auch die LEDs auf dem HAT in Kombination mit Snips nutzen zu können, wird nun der "Snips ReSpeaker Skill" benötigt.
Auch hier klonen wir uns mittels Git das Repo auf den Raspberry. Das funktioniert auch mit SAM:
sam install actions -g https://github.com/snipsco/snips-skill-respeaker.git
Das Verhalten bzw. die Helligkeit der LEDs kann in der Config-Datei unter
/var/lib/snips/skills/snips-skill-respeaker/config.ini
angepasst werden. Die Dokumentation unter https://github.com/snipsco/snips-skill-respeaker ist hier hilfreich.
Nun müssen wir noch eine kleine Anpassung vornehmen, damit die Konfiguration in der Datei auch übernommen wird:
sudo crontab -e
Danach fügen wir folgende Zeile ein:
@reboot sleep 60 && systemctl restart snips-skill-server.service
Dieser Befehl wird von Cron direkt nach dem Start des Systems ausgeführt, in diesem Falle 60 Sekunden verzögert. Hiermit wir der Snips Skill-Server neu gestartet und die Konfiguration wird dann korrekt geladen.
Deaktivieren der Power/ACT-LED am Raspberry
Damit die rote Power-LED bzw. ACT-LED nicht stört, kann diese mit dem hinzufügen folgenden Zeilen in der /boot/config.txt deaktiviert werden:
# Disable the ACT LED.
dtparam=act_led_trigger=none
dtparam=act_led_activelow=off
# Disable the PWR LED.
dtparam=pwr_led_trigger=none
dtparam=pwr_led_activelow=off
Installation des Diagnosetools SAM-Watch
Um später mit SAM vom PC aus oder auch direkt über SSH auf dem Raspberry verfolgen zu können, welche "Intents" sowie Befehle erkannt werden, sollte das Paket snips-watch installiert werden:
sudo apt-get install snips-watch
Wie geht´s jetzt weiter?
Nun kann über die Snips-Konsole (https://console.snips.ai) ein erster Assistent erstellt (https://docs.snips.ai/getting-started/quick-start-console) und dann mittels SAM auf das Raspberry geladen werden:
sam install assistant -i proj_<Zufälliger Seed>
Nun "hört" das Raspberry auf das Hotword "Hey, Snips". Um zu sehen, ob Snips euch auch richtig "versteht" und der Intent mit den Slots auch korrekt erkannt wurde, hierbei den Befehl
sam watch
oder direkt auf dem Raspberry
snips-watch
ausführen.
Für die Einbindung des Assistenten gibt es z.B. für FHEM bereits ein Modul:
https://github.com/Thyraz/Snips-Fhem
Auch bei OpenHAB gibt es bereits Lösungen:
https://community.openhab.org/t/voice-control-how-to-use-snips-ai-and-mqtt-2-4/73947