Versuche und Erfahrungen

Last updated: March 14, 2021

Das ASR Problem

Beschreibung des Problems

Die ASR soll die Stimme des Benutzers erkennen. Die ASR, die von ProjectAlice standartmäßig eingestellt ist, ist Pocketsphinx. Wir wollten den Sprachassistent auf deutsch entwickeln und benutzen, allerdings hat der Sprachassistent nur ganz selten genau verstanden was wir sagen. Also haben wir uns an einer Lösung versucht.

Unsere Lösung

Zunächst haben wir versucht die ASR von Google zu nutzen, aber dafür brauchte man eine Kreditkarte und das Projekt würde wichtige Eigenschaften, wie kostenlos und Datensicher verlieren.

Also haben wir versucht ein anderes ASR zu implementieren, nämlich Deepspeech auf deutsch. Es wurde ein Patch geschrieben der Deepspeech installieren und für Alice nutzbar machen sollte. Nach vielen Versuchen ist es Schließlich an einer nicht vorhandenen Lizenz gescheitert.

Mögliche andere Lösungen

Eine Möglichkeit ist den Sprachassistenten auf Englisch zu stellen und zu testen ob die englische Version besser funktioniert. Eine andere Möglichkeit wäre die Utterances der Intents zu reduzieren, dann werden nur noch bestimmte Sätze die zuverlässig funktionieren verstanden. Denn je weniger Sätze insgesamt und je eindeutiger und verwechslungsfreier die Sätze desto besser versteht der Sprachassistent. Das ist uns während dem Projekt aufgefallen. So wurde zum Beispiel “Mach das Licht an” perfekt von “Mach das Licht aus” aus unserem selbstentwickelten Skill unterschieden.

Alternative Installationsversuche

Neben der Installation im Guide haben wir weitere Installationsversuche unternommen. Da wir jeweils nur eine SD-Karte hatten und das mehrfache Flashen mühsam sein kann, haben wir versucht Alice am PC mit Docker und in einer VM zu installieren sowie eine Installation am Pi mit BerryBoot durchgeführt.

Nur letzteres war erfolgreich. BerryBoot hat uns insgesamt mehr Flexibilität beim Testen gebracht. Durch eine integrierte Backupfunktion der Images können wir damit verschiedene Versionen von Alice im funktionieren Zustand freezen und später wiederherstellen.

Diese Sicherheit ist in unseren Fall sehr wichtig, da wir verschiedenes an Alice ausprobiert haben und es immer sein kann, dass Alice plötzlich nicht mehr funktioniert.

Dies ist zu erwarten, da wir viel mehr ausprobieren als der gewöhnliche User. Dies sollte jedoch kein Problem mehr sein, wenn Alice aus der Betaphase gelangt. Denn in den nächsten Versionen inkl. Release Candidates erfolgt ein Bug Hunting, dass aus Alice eine noch ausgereiftere Lösung machen soll.

Installation am PC mit Docker

Eine Installation auf x64-Rechnern soll mit einer von der Community erstellten Docker-Konfiguration möglich sein. Unser Versuch ist leider gescheitert, da diese Konfiguration zur Zeit nur mit der Google ASR und Snips als Fallback sowie Amazon Polly für TTS funktioniert.

Installation am PC mit Xubuntu und VMWare Workstation

Eine weitere Idee war es eine virtuelle Machine mit VMWare Workstation aufzusetzen. Da Raspbian debianbasiert ist haben wir zuerst auf das Debian-Derivat Xubuntu gegriffen. Bei der Installation hatten wir einige Schwierigkeiten, da Ubuntu aktuellere Software anbietet als Debian. Wir mussten manuell Python 3.7 anstelle von 3.8 mithilfe von PPAs nachinstallieren.

Aus irgendeinem Grund wurde beim Erzeugen der virtuellen Umgebung pip nicht mitinstalliert. Dafür musste man eigenhändig Symlinks im venv erstellen. Das nächste Problem war dass das Installationsskript sudo Befehle aussführt welche bei Raspberry Pi Images keine Eingabe des Passworts erfordern. Bei Ubuntu schon, daher konnte die Installation wieder nicht fortgesetzt werden. Dazu musste man die sudoers-File entsprechend anpassen.

Im Anschluss lief die Installation erfolgreich weiter sodass ein Systemd-Dienst erstellt worden ist. Dieser Dienst installiert wiederum weiter Dinge nach. Es sind mehrere Installationsschritte, die ausgeführt werden. Das Problem war jedoch dass der zweite Installationsschritt immer wiederholt wurde und die restliche Installation nicht durchgeführt worden ist. Den Grund dafür haben wir nicht weiter erforscht, da wir am Ende davon ausgegangen sind, dass die Installation von Alice nicht für Ubuntu angepasst ist.

Installation am PC mit Raspberry Pi Desktop und VMWare Workstation

Anstatt Debian zu nutzen haben wir für eine optimale Kompatibilität die Desktop-Version für Raspberry Pi OS installiert: Raspberry Pi Desktop. Hier gab es keine Probleme mit den Paketquellen und die sudoers-Konfiguration war identisch wie beim Pi. Die Installation ist bis zum Ende durchgelaufen (auch wenn es ein paar Fehlermeldungen dabei gab, die nicht weiter erforscht worden sind). Ein Problem war hier, dass das Mikrofon über Pulseaudio nicht erkannt worden ist.

Aus Zeitgründen haben wir diesen Versuch leider unterbrochen und den nächsten Versuch mit BerryBoot gewagt.

Mehrfachinstallation am Pi mit BerryBoot

Mit BerryBoot lässen sich mehrere Images auf einmal installieren. Diese können entweder alle auf der SD-Karte selbst oder auf ein externes Medium gespeichert werden. Das externe Medium kann z.B. ein einfacher USB-Stick sein aber auch ein SSD-Speicher ist möglich und sogar zu empfehlen.

BerryBoot erhöht die Flexibilität des Systems, da es nicht nötig ist verschiedene SD-Karten zu flashen bzw. die SD-Karte mehrmals zu flashen. Man hat beim Boot die Auswahl zwischen mehreren installierten Images. Diese kann man mit wenigen Klicks verwalten. Images kann man online nachinstallieren oder mittels spezieller Image-Files per USB-Stick nachflashen. Es ist möglich ein Abbild einer Installation zu erstellen und dieses später wiederherzustellen. Es ist außerdem möglich mehrere Instanzen davon zu erstellen. Ein Beispielszenario wäre die Installation zweier Instanzen der Beta Version von Alice mit verschiedenen Techstack oder unterschiedlichen Spracheinstellungen. Wir hatten beispielsweise bei der Beta 4 Probleme mit dem Umschalten von Deutsch auf Englisch.

Vorbereitungen

Zunächst müssen alle Partitionen auf der SD Karte gelöscht werden und eine große FAT32 erstellt werden. Falls dies der Fall ist, muss die Partition trotzdem formatiert werden sodass keine Dateien vorhanden sind.

Anschließend muss BerryBoot heruntergeladen werden. Auf Ihrer SourceForge Seite gibt es BerryBoot als Zip für den Pi 4 (pi4) und ältere Pis (pi0-pi1-pi2-pi3). Die passende Zip ist herunterzuladen und in die neuformatierte Partition zu entpacken.

Falls eine Headlessinstallation über VNC gewünscht ist muss die Datei cmdline.txt erweitert werden. Bei einer Installation über WLAN auch die Datei wpa_supplicant.conf.

cmdline.txt

elevator=deadline quiet bootmenutimeout=10 qmap=de vncinstall ipv4=192.168.178.50/255.255.255.0/192.168.178.1/wlan0

wpa_supplicant.conf

country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1

network={
    ssid="to-be-replaced"
    psk="my-secret-psk"
}

Nun kann die SD-Karte eingesetzt werden und die Installation vorgenommen werden. Bei einer Headless-Installation benötigt man einen VNC-Client.

Installation von Images

Images können entweder online oder über einen USB-Stick installiert werden. Da bei den älteren Pis es Online kaum Images mehr gibt bleibt nur die Installation per USB-Stick. Dafür benötigt man spezielle BerryBoot Images, die man entweder hier bekommt oder unter einem unix-ähnlichen Betriebssystem selbst erstellt/umwandelt.

Bei einem langen Rechtsklick auf Add OS sieht man erst die Option von einem USB-Stick zu installieren. Man wählt das richtige Image aus und startet mit der Installation. Dies kann einige Minuten in Anspruch nehmen.

Image per USB installieren

Enwicklung eines eigenen Skills

Weil der Skill Zigbee2Mqtt für unser Ziel eine Lampe über Sprache ansteuern unbrauchbar war brauchten wir eine andere Lösung. Unsere Idee: einen Skill erstellen, der (wenn auch Hardcode) für uns funktioniert.

Schritt 1 Skill mit Intents

Hier geht es zur Kurzanleitung zur Erstellung eines Skills.

Wir haben uns bei der Entwicklungsumgebung für VS Code entschieden, weil immer nur einer an dem Skill gearbeitet hat und wir so schneller und einfacher den Skill testen konnten. Man muss nur die geänderten Dateien speichern und dann Alice neustarten im Terminal von VS Code mit ‘sudo systemctl restart ProjectAlice’. Dann kann man den Skill über Sprache testen oder noch einfacher und schneller mit den Skills TextInputWidget und SpeechVisualizer.

Schon bei diesem ersten Schritt traten die ersten Probleme auf, denn unser Skill war in der Skillübersicht von ProjectAlice “disabled” und konnte nicht enabled werden. Die Lösung war die Datei .py im Ordner skills/LightsController/widget zu löschen. Dieses Problem ist auch bei anderen Entwicklern aufgetreten. Nachzulesen hier

Als nächstes müssen noch die Intents geschrieben werden, wie in unserer Anleitung beschrieben. Einen Intent zum einschalten, einen zum ausschalten und einen um die Farbe zu wechseln. Neu bei dem Farbenintent ist, dass SlotTypes verwendet werden. Diese sind Bestandteil von dem DialogueTemplate und der Benutzer kann dadurch verschiedene Farben oder verschiedene Lampen nennen und der Sprachassistent kann auch Synonyme verstehen. Zum Beispiel lila und violett haben beiden den value violette und ergeben später die selbe Färbung der Lampe. Wie das dann genau aussieht kann man hier nachschauen.

Das Ergebnis ist nach diesem Schritt ist ein Skill, mit dem man jetzt dem Sprachassistenten sowas sagen kann wie “Mach das Licht an” oder “Ändere die Farbe der PC-Lampe zu rot” und der Sprachassistent antwortet “Das Licht ist jetzt an” und “Die Farbe wurde geändert”, auch wenn bis hierhin weder das Licht wirklich angeht noch die Farbe der Lampe sich verändert.

Schritt 2 NodeRed implementation

Über die Webgui von ProjectAlice kann man im Adminbereich die Funktion NodeRed aktivieren. Hier fehlt allerdings ein Paket Nodes von Zigbee2Mqtt, das hinzugefügt werden muss. Zuvor sei gesagt, dass Zigbee2Mqtt auf dem Pi installiert wurde und, weil es einfacher ist, über das Frontend von Zigbee2Mqtt die beiden Lampen verbunden wurden. Unsere Lampen heißen PC-Lampe und Sofa-Lampe.

Man benötigt jetzt die Nodes “mqtt in”, um das Topic hermes/intent/ zu fangen und mit der Message weiter zu arbeiten. Zunächst wird die Message ins .json-Format übersetzt, damit die Debug Nachrichten lesbar sind. Will man jetzt nur den Intent "Licht an" zum funktionieren bringen, brauch man einen node aus dem paket Zigbee2Mqtt, nämlich das "out" Node. In diesem stellt man die Lampen ein und wählt aus, dass diese eingeschaltet werden soll.

Möchte man allerdings die Farbe ändern benötigt man eine “switch” Node. Diese wird nach der Übersetzung der Message aufgerufen. Im Switch wird untersucht welchen Value der Slottype hat und je nach Wert geht es aus unterschiedlichen Ausgängen raus. Bleibt nur noch an die Ausgänge je ein “out” Node zu setzen und einzustellen, dass die Lampen dann einen Hexwert entsprechend der Farbe bekommen. Möchte man nun mit einem zweiten Slottype arbeiten, um zum Beispiel unterschiedliche Lampen mit demselben Intent anzusprechen, muss man mit zwei hinter einander geschalteten Switches arbeiten, wodurch der Flow doppelt so groß wird.

Schritt 3 Testen

Mit den Skills TextInputWidget und SpeechVisualizer kann man den Skill jetzt hervorragend testen. Es hilft auch an einigen Stellen im NodeRed Flow “debug” Nodes einzufügen, um die Message zu lesen und zu analysieren. Zum Beispiel war es ein Problem, dass man nicht wusste welcher SlotType zuerst kommt, also zuerst die Farbe oder welche Lampe. Je nach dem muss man dann den Flow danach ausrichten.

Bewertung

Unser Skill ist maximal Hard gecodet und damit nicht universell einsetzbar. Wenn man zum Beispiel nur einen anderen Namen einer Lampe hat ändert sich der gesamte Flow und ein großer Teil des DialogueTemplate. Wenn man eine Lampe hinzufügen will, muss man auch fast alles überarbeiten und an vielen anderen Stellen treten ähnliche Probleme auf.

Von den Hauptenwicklern von ProjectAlice ist es auch gar nicht vorgesehen, dass man viel oder überhaupt mit NodeRed arbeitet. Das Tool soll nur zum testen von Teilfunktionen genutzt werden. Die bessere Lösung wäre alles über Python zu programmieren. Dies war uns aber aus zeitlichen und wegen einer Menge anderer Aufgaben nicht möglich.