Aufgabenstellung
Im Rahmen eines Forschungsprojekts soll eine Erweiterung (auch Skill genannt) für den Sprachassistenten Mycroft programmiert werden. Dieser Skill soll es ermöglichen, über Sprachkommandos mit dem NextCloud Kalender zu interagieren. Der genaue Funktionsumfang wurde in einem Pflichtenheft festgehalten.
Die Kommunikation mit dem Sprachassistenten soll möglichst robust und natürlich funktionieren. Das bedeutet, dass mindestens für die Kernfunktionen Mycroft verschiedene Kommandoversionen versteht und diese verarbeiten kann. Dem Team wurde ein vorkonfigurierter Pi mit dem darauf installierten Mycroft Framework, sowie die Codevorlage für einen Mycroft Skill zur Verfügung gestellt.
Zunächst haben wir uns eingelesen, wie der Skill zu Mycroft hinzugefügt werden muss und wie grundsätzlich ein Skill aufgebaut ist. Dafür hatten wir die Mycroft Dokumentation zur Verfügung. (https://mycroft-ai.gitbook.io/docs/skill-development/introduction/)
Skill Setup / Integration
Zunächst wurde die bereitgestellte Vorlage auf den Pi in den Skillordner des Mycroftprogramms übertragen. Die wichtigste Datei des Skills ist die __init__.py. Diese wird von Mycroft beim Start aufgerufen. Sämtliche Intent Handler müssen dort definiert werden (Intents werden im Abschnitt „Anlegen eines Intents“ genauer beschrieben). Um zu überprüfen, ob der Skill aufgerufen wird, kann betrachten, ob die __init__(self) Funktion des Skills aufgerufen wird, wenn Mycroft startet.
Verknüpfung NextCloud Calendar
Um mit dem NextCloud Calendar zu kommunizieren, wurde die connector Klasse definiert (connector.py). Bei der Initialisierung wird die update() Funktion aufgerufen, die über die caldav Schnittstelle mit dem NextCloud Kalender kommuniziert und sämtliche Termine abfragt und zwischenspeichert. Für die Schnittstelle wurde das caldav Package für Python genutzt. Die Dokumentation des Packages und des CalDav Formats (https://caldav.readthedocs.io/en/latest/) wurde von uns genutzt, um zu verstehen, wie die zu Daten verarbeitet werden müssen und welche Interaktionsmöglichkeiten über CalDav mit dem Kalender möglich sind.
Kommunikation & Sprachkommandos
Damit Funktionalitäten des Skills aufgerufen werden, muss der genaue Ablauf der Kommunikation definiert werden. Wie das funktioniert, wird in den folgenden Abschnitten beschrieben.
Hooks zum Aufrufen der Skill Funktionen
Damit Funktionen im Skill aufgerufen werden, müssen sogenannte „intends“ definiert werden. Dies geschieht über Deklarationen wie @intent_handler(‚x.y.z.intent‘). Dieser Code gibt an, dass die darauffolgende Funktion aufgerufen werden soll, wenn Mycroft ein Sprachkommando mit dem in ./locale/en-us/x.y.z/x.y.z.intent hinterlegten Intent übereinstimmt. Wie genau ein Intent definiert wird, wird im folgenden Abschnitt „Anlegen eines Intents“ beschrieben.
Anlegen eines Intents
Damit Sprachkommandos verstanden und nötige Informationen herausgefiltert werden können, muss jeweils ein Intent angelegt werden (https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/intents). Dabei wird die grobe Satzstruktur vordefiniert, die für das Kommando notwendig ist. Dabei gibt es die Möglichkeit mehrere Varianten, Platzhalter (Entitys) und Wortabweichungen anzulegen. Sogenannte Entitys dienen als Platzhalter, bei denen im Sprachkommandos die dort platzierten Worte zwischengespeichert und in den Funktionen abgerufen werden können. Wortvariationen werden in Klammern angegeben. Bsp.: Es soll möglich sein das Wort event oder meeting zu nutzen -> (event|meeting) Platzhalter / Entitys werden in geschweiften Klammern angegeben. Bsp.: Es soll ein Name genannt und in der Funktion abgerufen werden -> {name}
Anlegen einer Entity
Wenn Daten aus einem Sprachkommande benötigt werden, ist es sinnvoll diese in sogenannten Entitys zu definieren. Dafür kann unter ./locale/en-us/eine xyz.entity Datei angelegt werden. Dort können erlaubte Werte hinterlegt werden. Diese Datei muss anschließend in der __init__.py initialisiert werden. Wenn keine Entity Datei angelegt werden, sind sämtliche Eingaben an dieser Stelle möglich.
Anlegen eines Dialogs
Zuletzt muss der Dialog definiert werden, um eine Antwort von Mycroft auszugeben. Ähnlich wie bei den Intents könne hier Entitys genutzt werden, um Werte bei der Sprachausgabe auszugeben. Mehr dazu findet man hier: https://mycroft-ai.gitbook.io/docs/skill-development/user-interaction/statements