RHASSPY/Schnellstart

Aus FHEMWiki
Das Rhasspy-Webinterface nach erfolgreicher Installation und Aufruf des ersten Intents (GetTime)

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.


Einrichtung MQTT2_CLIENT

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.

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.

Installation FHEM Modul

Installation/Update des RHASSPY Moduls via Kommando-Feld

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.

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

RHASSPY mit deutscher Spracheinstellung

In diesem Beispiel soll deutsch mit dem Sprachassistenten gesprochen werden. Das bedeutet

  1. Rhasspy muss ein deutsches Profil verwenden
  2. RHASSPY muss auf die deutsche Sprache eingestellt sein
  3. 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:

  1. im FHEM-Device global wird das Attribut language auf DE eingestellt oder
  2. 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

Anpassung eines erstens Intents nach der Schnellstart-Anleitung

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:

  1. dem language-Kürzel (z.B. de),
  2. der fhemId (z.B. fhem) und
  3. 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

Erfolgreich befüllter Slot mit dem Alias der Lampe
Erfolgreich erstellte Helper für eine Lampe im RHASSPY Modul

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:

  1. genericDeviceType Attribut bei einem Device setzen (z.B. switch)
  2. einen "sprechbaren" Namen im Attribut alias vergeben
  3. 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:

  1. Es gibt neue Slots in Rhasspy bzw. bereits vorhandene wurden mit neuen Werten ergänzt
  2. Ein list rhasspy enthält den Helper devicemap mit den konfigurierten Geräten und dessen Steuermöglichkeiten (intents)
  3. 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

Info green.pngDieses Beispiel enthält bereits einige Sprech-Alternativen und optionale Elemente. Die vorhandenen Möglichkeiten sind zum Einen der offiziellen Dokumentation zu entnehmen, zur Vertiefung gibt es in den Links unten ein sehr informatives Video.
Ein erfolgreich von RHASSPY empfangener und umgesetzter Sprachbefehl

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

Links