RHASSPY/Schnellstart

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


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 Moduls

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.

Einrichtung des MQTT2_CLIENT

Ein erfolgreich mit Rhasspy verbundenes MQTT2_CLIENT Device

Rhasspy kommuniziert hauptsächlich über das MQTT-Protokoll, und zwar sowohl Rhasspy-intern, als 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

Info green.pngWird die Sprache im Device global nach Definition des RHASSPY-Devices geändert, kann es notwendig sein, die DEF des RHASSPY-Devices einmal ohne Änderungen zu bearbeiten (z.B. ein Leerzeichen anfügen).
rhasspy mit deutscher Spracheinstellung

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

  1. Rhasspy - also die Anwendung im Docker-Container - muss ein deutsches Profil verwenden
  2. rhasspy - also das FHEM-Device - muss auf die deutsche Sprache eingestellt sein
  3. 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:

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

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 - 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:

  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


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. Allerdings hat dsa Modul schon passende Slots erstellt, die in eigenen Intents verwendet werden können. Zusätzlich müssen aber Tags verwendet, 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