RHASSPY/Schnellstart
Installation von Rhasspy
Empfohlen wird, Rhasspy als Docker Container zu installieren. Und zwar aus folgenden Gründen:
- Alle Software-Abhängigkeiten sind aufgelöst
- Es kommt zu keinen Konflikten mit Abhängigkeiten anderer Anwendungen (Python-Version, Paket-Versionen, ...)
- Wird der Container wieder gelöscht, ist Rhasspy vollständig vom System entfernt
Soll Docker verwendet werden, finden sich am Ende dieser Anleitung zwei Docker-Compose Dateien für den schnellen Einstieg. Dazu bitte mit einer Ausnahme der Anleitung in der offiziellen Dokumentation folgen. Die Ausnahme ergibt sich daraus, dass für den schnellen Einstieg der interne MQTT-Server von Rhasspy genutzt werden soll. Dieser ist auf dem Port 12183 erreichbar, der beim Start des Docker Containers auch mit exposed werden muss.
Das Kommando zum Starten des Docker-Images lautet deshalb korrekterweise
docker run -d -p 12101:12101 -p 12183:12183\ --name rhasspy \ --restart unless-stopped \ -v "$HOME/.config/rhasspy/profiles:/profiles" \ -v "/etc/localtime:/etc/localtime:ro" \ --device /dev/snd:/dev/snd \ rhasspy/rhasspy \ --user-profiles /profiles \ --profile en
Die Vorbereitung ist abgeschlossen, wenn im Web-Interface von Rhasspy der gesprochene Testsatz wie spät ist es erkannt wird und links als erkannter Intent GetTime angezeigt wird.
Installation des FHEM Modul
Es ist dabei wichtig, jeden der Schritte vollständig abgeschlossen zu haben, bevor mit dem nächsten begonnen wird!
Das RHASSPY-Modul kann ganz einfach mit einem einzelnen Befehl, der in die FHEM-Kommandozeile eingetragen werden muss, installiert werden:
{ Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }
Danach muss FHEM neu gestartet werden.
Einrichtung des MQTT2_CLIENT
Rhasspy kommuniziert hauptsächlich über das MQTT-Protokoll. Und zwar sowohl Rhasspy-intern, wie auch mit FHEM. Da dies auch für die übertragene Sprache und Audio-Dateien gilt und es daher zu sehr viel MQTT-Verkehr kommt, sollte der Rhasspy-interne MQTT-Server verwendet und die für FHEM relevanten Daten über einen MQTT2_CLIENT bezogen werden.
Dieses Beispiel geht davon aus, dass Rhasspy auf dem selben Gerät installiert ist, auf dem auch FHEM läuft.
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183
attr rhasspyMQTT2 clientOrder RHASSPY
attr rhasspyMQTT2 subscriptions setByTheProgram
Läuft Rhasspy auf einem anderen Server und/oder wird ein anderer Port verwendet, sind die passenden Daten im obigen defmod entsprechend anzupassen. Typischerweise ist der Rhasspy-interne MQTT-Server eines extern laufenden Rhasspy unter der Portnummer 12183 zu erreichen, die Definition wäre dann also
defmod rhasspyMQTT2 MQTT2_CLIENT <IP-Adresse>:12183
attr rhasspyMQTT2 clientOrder RHASSPY
attr rhasspyMQTT2 subscriptions setByTheProgram
Hat alles funktioniert, steht opened im STATE dieses Devices.
Define eines RHASSPY Devices
Läuft der Rhasspy-Dienst auf derselben Maschine mit den Standardeinstellungen, genügt für ein erstes Kennenlernen:
define rhasspy RHASSPY
Für einen entfernten Rhasspy-Dienst muss angeben werden, wo dessen Web-Interface zu erreichen ist:
defmod rhasspy RHASSPY baseUrl=http://192.168.1.210:12101
Dieser Schritt war erfolgreich, wenn
- im Device rhasspy ein Reading intents vorhanden ist, das z.B. den Wert GetTime enthält, und
- STATE dieses Devices auf online gegangen ist.
Spracheinstellungen
Basissprache
In diesem Beispiel soll deutsch mit dem Sprachassistenten gesprochen werden. Das bedeutet
- Rhasspy - also die Anwendung im Docker_Container - muss ein deutsches Profil verwenden
- rhasspy - also das FHEM-Device - muss auf die deutsche Sprache eingestellt sein
- Eine deutsche Sprachdatei muss installiert sein
Welche Sprache das Device rhasspy verwendet, ist am Internal LANGUAGE zu erkennen.
Sollte dieses Internal nicht de anzeigen, gibt es zwei Möglichkeiten, dies zu ändern:
- im FHEM-Device global wird das Attribut language auf DE eingestellt oder
- die Definition des rhasspy-Devices um language=de ergänzt.
defmod rhasspy RHASSPY language=de
Sprachdatei
Das Modul RHASSPY enthält einige vorgefertigte Antwortsätze für diverse Situationen. Um diese von Englisch auf Deutsch umzustellen, wird eine zusätzliche (Muster-) Sprachdatei benötigt, die man mit folgendem Befehl erhält:
{ Svn_GetFile('contrib/RHASSPY/rhasspy-de.cfg', './rhasspy-de.cfg') }
Ergänzend muss dem Device rhasspy mitgeteilt werden, wo diese zu finden ist:
attr rhasspy languageFile ./rhasspy-de.cfg
Dieser Schritt war erfolgreich, wenn der Befehl list Rhasspy
einen Abschnitt lng enthält, der deutsche Antworten auflistet.
Erste Interaktion
Um dem Sprachassistenten jetzt eine Antwort auf eine Frage zu entlocken, muss zuerst im Webinterface von Rhasspy - also in der Anwendung im Docker-Container - im Menüpunkt Sentences ein Intent erstellt werden. Für diese Schnellstart-Anleitung wird aber einfach der standardmäßig in Rhasspy vorhandene Intent [GetTime] verwendet. Um diesen aber benutzen zu können, muss er vorher umbenannt werden. Jede Instanz des RHASSPY-Moduls reagiert nur auf Intents, die "für sie" bestimmt und daher entsprechend gekennzeichnet sind. Diese Kennungzeichnung besteht aus:
- dem language-Kürzel (z.B.
de
), - der fhemId (z.B.
fhem
) und - dem Intent-Namen (z.B.
GetTime
).
Der Name des Intents ist daher in der sentences.ini wie folgt zu ändern:
[de.fhem:GetTime]
wie spät ist es
sag mir die uhrzeit
Jetzt kann der Sprachassistent nach der aktuellen Uhrzeit gefragt werden. Ist alles richtig konfiguriert, wird er diese Frage auf deutsch beantworten und die Readings des Moduls werden mit entsprechenden Werten befüllt.
Ein Gerät mit Rhasspy verbinden
Wenn nach dieser Anleitung vorgegangen wurde, ist das Modul so konfiguriert, dass es Rhasspy alle FHEM-Devices bekannt macht, bei denen das Attribut genericDeviceType definiert ist.
Für die Verbindung eines FHEM-Devices mit Rhasspy sind also folgende Schritte auszuführen:
- genericDeviceType Attribut bei einem Device setzen (z.B. switch)
- einen "sprechbaren" Namen im Attribut alias vergeben
set rhasspy update devicemap
ausführen, um das Device Rhasspy bekannt zu machen
Anhand einer Lampe "Office", die sich nur ein- und ausschalten lässt, könnte das z.B. so aussehen:
attr Office genericDeviceType switch
attr Office alias Licht
Der genericDeviceType switch gibt für ein Gerät vor, dass es sich nur ein- und ausschalten lässt. Beim Typ light z.B. könnte man auch noch die Helligkeit und die Farbe regulieren. Der alias Licht bewirkt, dass in Zukunft einfach "Licht aus" oder "Licht an" gesagt werden kann. Dazu aber später mehr.
Die Lampe ist somit fertig vorbereitet.
Damit Rhasspy auch von diesem Gerät erfährt, muss FHEM ihm davon erzählen. Das passiert, in dem folgender Befehl ausgeführt wird:
set rhasspy update devicemap
Darauf hin werden mehrere Aktionen durchgeführt:
- Es werden in Rhasspy Slots erstellt, die später in Intents verwenden werden können
- Diese Slots werden mit den Daten befüllt, die in FHEM für die Verwendung in Rhasspy konfiguriert wurden. In diesem Fall nur der Alias dieser Lampe
- Ein Training von Rhasspy wird angestoßen, damit Rhasspy das Gerät in gesprochenen Sätzen erkennt
Ob alles funktioniert hat, lässt sich an drei Dingen erkennen:
- Es gibt neue Slots in Rhasspy bzw. bereits vorhandene wurden mit neuen Werten ergänzt
- Ein
list rhasspy
enthält den Helper devicemap mit den konfigurierten Geräten und dessen Steuermöglichkeiten (intents) - In den Readings udpateSlots und training des Moduls ist kein Fehler zu erkennen (unter Umständen die Seite im Browser aktualisieren, wenn die Readings noch nicht vorhanden sind)
Einen ersten Intent erstellen
Um die konfigurierte Lampe schlussendlich auch steuern zu können, muss Rhasspy noch wissen, was nach einem erkannten Sprachbefehl anfangen soll. Dazu werden in Rhasspy Sentences/Intents erstellt. Im Falle dieser Lampe, reicht ein einfacher SetOnOff-Intent. Sie kann ja nicht mehr.
Da der Intent aber potentiell für mehrere Geräte dienen können soll, wird es etwas komplizierter, als beim GetTime Intent. Da aber vom Modul schon passende Slots erstellt wurden, können wir diese in den Sätzen verwenden, anstatt einen eigenen Satz für jedes Gerät schreiben zu müssen. Zusätzlich müssen wir aber Tags verwenden, damit das Modul dann unterscheiden kann, ob ein von Rhasspy geliefertes Wort ein Gerät, ein Raum oder ein Nummernwert ist.
Ein ganz einfacher Intent, um die Lampe ein- und ausschalten zu können, kann z.B. so aussehen:
[de.fhem:SetOnOff]
schalte das $de.fhem.Device-SetOnOff{Device} ( an{Value:on} | aus{Value:off})
Kurz umrissen bedeuten die Teile des Satzes:
- $de.fhem.Device-SetOnOff ist der Slot, der die Geräte enthält, die mit diesem Intent gesteuert werden sollen. Das Dollarzeichen am Anfang des Slots wird gerne vergessen, darauf also besonders gut aufpassen
- {Device} ist ein Tag, der dem FHEM-Modul und Rhasspy verrät, dass es sich bei diesem Wort um ein Device handelt. Wichtig bei Tags, die in Verbindung mit diesem Modul verwendet werden ist, dass sie immer mit einem Großbuchstaben beginnen!
- ( ... | ... ) ist eine Gruppe. Wobei die runden Klammern eine Gruppe beschreiben, die einzelnen Mitglieder dieser Gruppe werden durch die "Pipe" getrennt. In diesem konkreten Fall bedeutet es, der Wert kann "an" ODER "aus" sein
- {Value:on}/{Value:off} ist wieder ein Tag. Dieser gibt an, dass es sich beim übergebenen Wort um einen Wert handelt. Da das Modul aber die deutschen Wörter "an" und "aus" nicht versteht, müssen hier Synonyme verwendet werden. Das sind jeweils die Werte hinter dem Doppelpunkt.
Wichtig: Da mit Erstellen des ersten Intents wieder Änderungen an der Konfiguration vorgenommen wurden, muss jetzt wieder ein set rhasspy update all
ausgeführt werden. In diesem Fall, damit das Modul vom neuen Intent erfährt.
Ist man dieser Schnellstart-Anleitung gefolgt, können aus diesem Satz mit der vorhandenen Lampe jetzt zwei gesprochene Sätze gebildet werden:
schalte das licht an
schalte das licht aus
Die Infos, die daraus resultierend nach einem Sprachbefehl "schalte das licht an" im FHEM-Modul ankommen sind dann unter anderem:
"intent":"SetOnOff"
"Device":"licht"
"Value":"on"
Schlusswort
Sind alle Punkte dieser Schnellstart-Anleitung erfolgreich abgeschlossen, kann damit begonnen werden RHASSPY auf die eigenen Bedürfnisse anzupassen und weitere Geräte damit zu steuern. Alle Informationen dazu finden sich auf der Hauptseite von RHASSPY.
Anhang
Docker-Compose File - Base
version: '3'
services:
rhasspy:
image: "rhasspy/rhasspy"
container_name: rhasspy
restart: unless-stopped
volumes:
- ".config/rhasspy/profiles:/profiles"
- /etc/timezone:/etc/timezone:ro
ports:
- "12101:12101"
- "12183:12183"
command: --user-profiles /profiles --profile de
environment:
- TZ=Europe/Berlin
Docker-Compose File - Satellite
version: '3'
services:
rhasspy:
image: "rhasspy/rhasspy"
container_name: rhasspy
restart: unless-stopped
volumes:
- ".config/rhasspy/profiles:/profiles"
- "/etc/localtime:/etc/localtime:ro"
- "/etc/asound.conf:/etc/asound.conf"
ports:
- "12101:12101"
command: --user-profiles /profiles --profile de
devices:
- "/dev/snd:/dev/snd"
ipc: host