RHASSPY/Schnellstart: Unterschied zwischen den Versionen
Drhirn (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
Drhirn (Diskussion | Beiträge) KKeine Bearbeitungszusammenfassung |
||
Zeile 13: | Zeile 13: | ||
==Installation FHEM Modul== | ==Installation FHEM Modul== | ||
[[File:Rhasspy03.png|thumb|right|Installation/Update des RHASSPY Moduls via Kommando-Feld]] | [[File:Rhasspy03.png|thumb|right|Installation/Update des RHASSPY Moduls via Kommando-Feld]] | ||
Zeile 62: | Zeile 45: | ||
Der Vorteil dieser Variante ist, dass bei einem FHEM-Update auch gleich das RHASSPY-Modul mit aktualisiert wird. | Der Vorteil dieser Variante ist, dass bei einem FHEM-Update auch gleich das RHASSPY-Modul mit aktualisiert wird. | ||
--> | --> | ||
==Einrichtung MQTT2_CLIENT== | |||
[[File:Rhasspy02.png|right|thumb|Ein erfolgreich mit Rhasspy verbundenes MQTT2_CLIENT Device]] | |||
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. | |||
<syntaxhighlight lang="text"> | |||
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183 | |||
attr rhasspyMQTT2 clientOrder RHASSPY | |||
attr rhasspyMQTT2 subscriptions setByTheProgram | |||
</syntaxhighlight> | |||
Läuft Rhasspy auf einem anderen Server und/oder wird ein anderer Port verwendet, sind die passenden Daten im obigen ''defmod'' entsprechend anzupassen. | |||
Hat alles funktioniert, steht '''opened''' im ''STATE'' dieses Devices. | |||
<br clear=all> | |||
== Define eines RHASSPY Devices == | == Define eines RHASSPY Devices == | ||
Läuft der Rhasspy-Dienst auf derselben Maschine mit den Standardeinstellungen, genügt für ein erstes Kennenlernen: | Läuft der Rhasspy-Dienst auf derselben Maschine mit den Standardeinstellungen, genügt für ein erstes Kennenlernen: |
Version vom 1. Dezember 2021, 09:02 Uhr
Die folgende Kurzanleitung soll den Einstieg erleichtern. Es ist dabei wichtig, jeden der Schritte vollständig abgeschlossen zu haben, bevor mit dem nächsten begonnen wird!
Voraussetzung für diese Anleitung ist, dass Rhasspy bereits funktionsfähig ist. Dazu bitte der Anleitung in der offiziellen Dokumentation folgen. Empfohlen wird, Rhasspy als Docker Container zu installieren. Und zwar aus folgenden Gründen:
- Alle Software-Abhängigkeiten sind gelö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.
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 FHEM Modul
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 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.
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
- ein Reading intents vorhanden ist, das z.B. den Wert GetTime enthält, und
- STATE auf online gegangen ist.
Spracheinstellungen
Basissprache
In diesem Beispiel soll deutsch mit dem Sprachassistenten gesprochen werden. Das bedeutet
- Rhasspy muss ein deutsches Profil verwenden
- RHASSPY muss auf die deutsche Sprache eingestellt sein
- Eine deutsche #Sprachdatei muss installiert sein
Welche Sprache RHASSPY verwendet, ist am Internal LANGUAGE des RHASSPY-Devices 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 DEF des RHASSPY-Devices um language=de ergänzt.
defmod rhasspy RHASSPY language=de
In beiden Fällen kann es möglich sein, dass das RHASSPY-Device neu geladen werden muss, um die Änderung wirksam zu machen:
reload 10_RHASSPY.pm
Sprachdatei
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 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 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
Danach muss im Modul der Befehl set rhasspy update all
ausgeführt werden. Dieser Befehl sorgt dafür, dass alle für die Zusammenarbeit zwischen Rhasspy und dem Modul ausgetauscht werden (Geräte, Slots, etc.). Außerdem startet er das Training von Rhasspy. Dadurch kann der Intent [de.fhem:GetTime] erst von Rhasspy erkannt werden. Nach wenigen Sekunden wird im Modul das Reading training befühlt und es kann losgehen.
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