Fortgeschrittenes

Last updated: March 14, 2021

Betastatus von Alice

Alice ist Stand März 2021 noch in der Beta und ist bis zum Release Candidate nicht für die breite Masse gedacht. Zur Zielgruppe gehören momentan alle, die grundlegendes Wissen zu Linux und dem Raspberry Pi haben, Systemlogs lesen können und Python Module installieren können.

Vorraussetzungen

Für die Installation, Troubleshooting etc. benötigt man grundlegende Kenntnisse über die Kommandozeile unter Unix-ähnlichen Betriebssystemen. Eine gute Einführung in das Thema bietet linuxcommand.org.

Darüber hinaus kann es hilfreich sein grundlegendes Wissen über pip und virtuelle Umgebungen unter Python zu haben. Wir haben das zum Beispiel gebraucht, da bei einem Installationsversuch eine Abhängigkeit von Hermes LED Control nicht mitinstalliert worden ist. Im Homeverzeichnis findet man ~/ProjectAlice und ~/hermesLedControl, welche beide virtuelle Umgebungen haben.

Um Dienste im Hintegrund läufen zu lassen verwendet Raspbian OS systemd. Hier wäre es hilfreich die wichtigsten Optionen des systemd-Kommandos zu kennen um Hintegrunddienste beenden und neustarten zu können.

Darüber hinaus ist es wichtig sich mithilfe unserer Dokumentation eine Wissensbasis über Sprachassistenten und deren Techstack, MQTT, dem Hermes Protokoll, ZigBee und ZigBee2MQTT anzueignen.

Nachinstallieren von Paketen

Je nachdem wofür man Pakete nachinstallieren möchte oder muss, nutzt man verschiedene Packagemanager.

Systempaketverwaltung

Einige Pakete kann man mit apt-get, der Paketverwaltung unter Debian-basierten Distributionen und Debian-Derivaten wie Ubuntu, nachinstallieren.

Jede dieser Distribution hat auch wenn derselbe Paketmanager verwendet wird, eigene Paketquellen. Debian-basierte Distributionen wie Raspbian bieten ältere Versionen der Programme, setzen aber auf Stabilität.

Man kann weitere Fremdquellen / PPAs hinzufügen um z.B. neuere Versionen zu installieren, dadurch verliert man jedoch oft die eben genannte Stabilität und muss externen Quellen vertrauen, bei denen man nicht mit Sicherheit sagen kann ob sie vertrauenswürdig sind.

Virtuelle Umgebungen unter Python

Andere Pakete kann oder muss man mit pip nachinstallieren. Je nachdem ob man für ProjectAlice oder Hermes LED Control Pakete nachinstallieren muss verwendet man eine andere virtuelle Umgebung.

Beispiel:

~/ProjectAlice/venv/bin/pip3 install pyyaml
~/hermesLedControl/venv/bin/pip3 install pyyaml

NPM bei Node Red und Zigbee2MQTT

Es kann zum Beispiel sein, dass bei der Installation des Zigbee2MQTT Skills die Instalaltion der Abhängigkeiten nicht erfolgreich war oder nicht erfolgt ist. Um die Pakete manuell nachzuinstallieren nutzt man npm:

cd /opt/zigbee2mqtt/
npm install

In der package.json sind alle Abhängigkeiten aufgelistet.

Wenn man zum Beispiel Node Red erweitern möchte kann man Pakete mit npm nachinstallieren:

cd ~/.node-red/
npm install node-red-contrib-zigbee2mqtt

Hintergrunddienste

Raspbian OS verwendet Systemd für Hintergrunddienste. Alice installiert einige Komponenten mit der Systempaketverwaltung, die für jedes Paket automatisch einen Hintergrunddienst für Systemd konfiguriert. Andere Pakete werden von Alice selbst installiert und konfiguriert.

Der wichtigste Dienst ist ProjectAlice. Um den Status des Dienstes herauszufinden verwendet man:

systemctl status ProjectAlice

Um den Dienst neuzustarten nutzt man:

sudo systemctl restart ProjectAlice

Andere Dienste, die mitinstalliert werden sind unter anderem:

  • Mosquitto MQTT Broker
  • Hermes LED Control
  • Verschiedene Komponenten des Techstacks (meist Snips Komponenten)

Mit folgendem Kommando kann man sich alle aktiven Dienste anzeigen lassen:

systemctl list-units --type=service

Um auch Dienste anzuzeigen, die nicht aktiv sind, nutzt man:

systemctl list-units --type=service --all

Logs und Troubleshooting

Das Webinterface bietet mit Alice Watch und integrierten Systemlogs Möglichkeiten um mitzuverfolgen was im Hintergrund geschieht. Bei der Beta 4 wird die Weboberfläche jedoch bei einigen Prozessen blockiert wie zum Beispiel dem Trainieren der NLU. In diesem Fall kann man nur mithilfe der Kommandozeile mitverfolgen was im Hintergrund geschieht. Außerdem kann man ältere Logs auch nur per Kommandozeile einsehen.

Das Kommando lautet:

tail -f /var/log/syslog

Alice Watch und Systemlogs

Um in Echtzeit mitzuverfolgen was im Hintergrund geschieht reicht in den meisten Fällen jedoch Alice Watch und die Systemlogs der Weboberfäche.

Bilder, Heat Levels usw

MQTT Clients

Um die Kommunikation zwischen den Komponenten (Hermes Protokoll), ProjectAlice Events usw. und Zigbee2MQTT mitzuverfolgen kann man einen MQTT Client nutzen und die gewünschten Topics subscriben.

Um alle Hermes-Topics zu subscriben nutzt man:

hermes/#

MQTT.fx ist ein empfehlenswerter grafischer MQTT-Client:

MQTTfx

Eine Liste weiterer Topics findet man hier.

ASR und Speech-to-text umgehen

Falls die ASR nicht zuverlässig funktioniert kann das Erkennen des richtigen Texts simuliert werden. Entweder per MQTT Publish oder bei Beta 4 mit einem Skill/Widget, welches man nachinstallieren kann.

Auch wenn die Audioausgabe nicht funktioniert gibt es ein Widget, das Abhilfe leistet.

Folgende Widgets installiert man dafür:

  • SpeechVisualisier
  • TextInputWidget

TextInputWidget unterstützt jedoch keine Dialoge. Falls der Intent weitere Eingaben erfordert, ist das Widget nicht geeignet.

Dialogue View

Ab Alice Beta 5 gibt es mit der Dialogue View eine Lösung, die keine weitere Widgets benötigt und Dialoge unterstützt.

Scenarios

Mit Scenarios, welches eine Node Red Instanz ist, lassen sich Skills erweitern. Es ist außerdem möglich Intent Handling mit Node Red zu betreiben, was jedoch vom Alice Team nicht vorgesehen ist.

In den Einstellung lässt sich Scenarios aktivieren. Sobald es aktiv und installiert ist, taucht ein neuer Tab im Webinterface auf.

Um im Smart Home Geräte zu steuern eignet sich eine Palette für Zigbee2MQTT, die man ganz einfach nachinstallieren kann:

cd ~/.node-red/
npm install node-red-contrib-zigbee2mqtt

Devmode

Der Devmode kann ebenfalls in den Einstellungen aktiviert werden. Er ermöglicht es unter anderem eigene Skills per Weboberfläche zu erstellen bzw. den Boilerplate Code zu generieren.

Wo finde ich was?

Mit Alice werden viele Pakete mitinstalliert und nirgendwo ist dokumentiert wo sich etwas befindet. Manche Verzeichnisse sind versteckt oder befinden sich irgendwo außerhalb des Homeverzeichnisses. Es ist außerdem empfehlenswert die allgemeine Verzeichnisstruktur unter Linux zu kennen.

Im Homeverzeichnis findet man:

  • /home/pi/ProjectAlice/
  • /home/pi/hermesLedControl/
  • /home/pi/.node-red/

In /opt/ findet man Zigbee2MQTT:

  • /opt/zigbee2mqtt/

Generell findet man Konfigurationsdateien unter /etc/ und Logdateien unter /var/log/.

Die Konfigurationsdatei für Snips Komponenten ist: /etc/snips.toml

Von Alice genutzte Modelle findet man unter: /home/pi/ProjectAlice/trained/

Skillentwicklung

Eine aktuelle und ausführliche Anleitung zur Skillentwicklung findet man in der Dokumentation von ProjectAlice selbst.

Einen leeren Skill erstellen

Sobald man den Devmode aktiviert hat erscheint ein neuer TAB “DEVMODE” unter dem “ADMIN”-TAB. In diesem Bereich kann man sich einfach einen Skill erstellen. Hierbei brauch man einen Namen und man muss mindestens die Sprache Englisch unterstützen. Der Rest ist erstmal nicht interessant und für den ersten Skill. Nach einem Neustart von Alice (vorzugsweise über eine SSH-Verbindung mit ‘sudo systemctl restart ProjectAlice’), erscheint der Skill in der Web-Oberfläche im Bereich “SKILLS”.

Entwicklungsumgebungen

Auf der Seite von Alice gibt es eine Anleitung für Pycharm. Pycharm kann man seinem git-Accout verkünpfen und so versioniert mit mehreren Entwicklern an seinem Skill arbeiten. Zum testen auf einem Raspberry Pi muss man allerdings jedesmal den git Ordner auf dem Pi updaten.

Eine andere Variante ist Visual Studio Code mit den Erweiterungen für Python und für die Entwicklung über eine SSH-Verbindung. Wenn alles installiert ist, kann man die Entwicklungsumgebung mit dem Raspberry Pi über SSH verbinden. Dazu klickt man unten links auf das grüne Symbol (oder F1) und gibt “Remote-SSH: Connect to Host…” ein. Dann gibt man @ ein. Standart Username beim Raspberry Pi ist "pi" und der hostname ist in der Regel die IP-Adresse im Heimnetzwerk. Man wird dann nach einem Host gefragt, das ist der eigene PC. Wenn man sich dann verbindet wird man noch nach dem Passwort gefragt und dann landet man auf dem Raspberry Pi. Der Vorteil bei VS Code ist, dass man den Skill häufiger testen kann, wenn man allerdings mit vielen Entwicklern zusammen arbeitet ist die Versionierung und das zusammenspiel mit GIT etwas mühsam.

Hallo Welt Skill

Der leere Skill soll jetzt mit möglichst einfachem Inhalt gefüllt werden. Im Ergebnis soll der Sprachassistent auf einen erkannten Satz einen anderen antworten. Damit hat man die absoluten Basics die ein Skill können muss. Folgende drei Dateien müssen hierzu geändert werden.

Talk-file

Im Ordner ProjectAlice/skills/LightsController(MySkill) findet man einen Ordner der “talks” heißt. Hier findet man .json Dateien, eine für jede unterstützte Sprache, die man zuvor ausgewählt hat. In einem Talk-file stehen Sätze die Alice sagen kann wenn sie einen Intent erkennt. Für den Hallo Welt Skill verändern wir die de.json Datei, dass nur noch folgendes enthalten ist:

{
	"halloWeltAntwort": [
		"Hallo du wunderschöne Welt"
	]	
}

“halloWeltAntwort” benötigen wir später im SourceCode und “Hallo du wunderschöne Welt” ist das, was der Sprachassistent später antworten wird.

Dialogue-file

Im selben Verzeichnis wie der talks Ordner findet man auch einen “dialogueTemplate” Ordner. Hier sind wieder .json Dateien für jede unterstützte Sprache enthalten und zusätzlich eine .sample Datei für jede unterstützte Sprache. Uns interessiert erst mal die de.json Datei. Diese sollte folgendes enthalten:

{
	"skill": "MySkill",
	"slotTypes": [],
	"intents": [
		{
			"name": "halloWeltAnfrage",
			"enabledByDefault": true,
			"utterances": [
				"Hallo Alice im Wunderland"
			],
		}
}

Bei “MySkill” sollte der Name des Skills stehen, den man am Anfang beim erstellen gewählt hat. “halloWeltAnfrage” ist der Name des Intents. Dieser wird später in MySkill.py benötigt und wird auch im Webinterface angezeigt, wenn man bei Skills auf Intents ansehen klickt. Bei “utterances” stehen all jene Sätze die der Sprachassistent bzw. die NLU verstehen soll, hier nur “Hallo Alice im Wunderland”.

MySkill.py

Die letzte Datei die für den Hallo Welt Skill modifiziert werden muss ist die .py Datei. Hier sollte mindestens folgendes stehen:

class MySkill(AliceSkill):

	@IntentHandler('halloWeltAnfrage')
	def halloWeltIntent(self, session: DialogSession, **_kwargs):
		self.endDialog(session.sessionId, self.randomTalk(text='halloWeltAntwort'))

Es wird eine Klasse “MySkill” erstellt mit einer Funktion “halloWeltIntent”. Der IntentHandler ruft diese Funktion auf, wenn der Intent “halloWeltAnfrage” von der NLU erkannt wurde. Die Funktion bekommt unter anderem die Dialogsession übergeben. Daraufhin beendet die Funktion den Dialog mit einer zufälligen Antwort aus dem Talk File. In diesem Fall gibt es dort nur eine Antwort nämlich: “Hallo du wunderschöne Welt”.

Ergebnis

Nachdem man nun die Dateien gespeichert hat und ProjectAlice neugestartet hat, kann man das WakeWord nennen und dann sagen “Hallo Alice im Wunderland”. Wenn der Satz korrekt erkannt wurde, wird der Sprachassistent anworten: “Hallo du schöne Welt”.

Auf Basis dieses Wissens könnte man zum Beispiel seinen eigenen Witze Skill schreiben. Mit utterances wie: “Erzähl mir einen Witz” oder “Mach einen Witz” und talks wie: “Ein Ball rollt um die Ecke und fällt um” oder “trafen sich zwei Jäger beide tot”. Oder man könnte den Skill RandomUselessFacts nach programmieren.