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.
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.
Je nachdem wofür man Pakete nachinstallieren möchte oder muss, nutzt man verschiedene Packagemanager.
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.
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
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
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:
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
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
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
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:
Eine Liste weiterer Topics findet man hier.
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:
TextInputWidget unterstützt jedoch keine Dialoge. Falls der Intent weitere Eingaben erfordert, ist das Widget nicht geeignet.
Ab Alice Beta 5 gibt es mit der Dialogue View eine Lösung, die keine weitere Widgets benötigt und Dialoge unterstützt.
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
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.
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:
In /opt/ findet man 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/
Eine aktuelle und ausführliche Anleitung zur Skillentwicklung findet man in der Dokumentation von ProjectAlice selbst.
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”.
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
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.
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.
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”.
Die letzte Datei die für den Hallo Welt Skill modifiziert werden muss ist die
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”.
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.