Fhem-rhasspy
An dieser Seite wird momentan noch gearbeitet. |
Rhasspy ist eine open-source Lösung für Spracherkennung und Sprachsteuerung. Es besteht aus einer Sammlung von Scripten, die unter einer einheitlichen Bedienoberfläche zusammengefasst sind, die sehr flexibel genutzt und erweitert werden können. Die Besonderheit an Rhasspy ist, dass es nach der Installation komplett Offline betrieben wird. Es wir also keine Sprache zur Erkennung an einen Server im Internet geschickt, und für den Betrieb nur für FHEM werden nur moderate Hardwareanforderungen gestellt - ein aktueller Raspberry Pi ab Modell 3B+ sollte in der Regel genügen.
Die Anbindung weiterer Räume ist über sogenannte "Satelliten" möglich. Dies kann z.B. ein Pi Zero mit Mikro und Lautsprecher sein, ein ESP32 mit entsprechender Hardware oder ein Mobiltelefon mit Android und der entsprechenden App.
- RHASSPY bezieht sich auf das FHEM-Modul oder das FHEM-Device
- Rhasspy bezeichnet die (zentrale) Installation bzw. das Web-Interface, unter dem die Scriptsammlung verwaltet werden kann.
Quick-Start
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!
Vorbereitung
Zunächst muss Rhasspy funktionsfähig sein. Dazu bitte der Anleitung in der offiziellen Dokumentation folgen. Für diese Anleitung wird vorausgesetzt, dass der Dienst an sich läuft und mind. ein Audio Ein- und Ausgabegerät funktionsfähig ist. 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.
FHEM Modul
Download
Das für FHEM erforderliche Modul ist in contrib verfügbar und kann über FHEMWEB mit
{ Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }
heruntergeladen werden. Hinweis: Für die hier dargestellte Vorgehensweise ist mind. Version 0.5.03 erforderlich, die derzeit nur über das Forum erhältlich ist: https://forum.fhem.de/index.php/topic,119447.msg1189195.html#msg1189195 oder später.
MQTT2_CLIENT
Rhasspy kommuniziert hauptsächlich über das MQTT-Protokoll, und zwar sowohl intern wie mit FHEM. Da dies auch für Audiodaten gilt, sollte schlicht der interne MQTT-Server aktiviert bleiben und die für FHEM relevanten Daten ein MQTT2_CLIENT eingerichtet werden:
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. Paßt alles, sollte opened im STATE dieses Devices stehen.
Define
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 wäre anzugeben, 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.
Sprache
Basissprache
Unterstellt, RHASSPY und Rhasspy sollen deutsch miteinander sprechen, sollte das Internal LANGUAGE den Wert de anzeigen. Ist dies nicht der Fall, kann entweder in den allgemeinen FHEM-Einstellungen (zu finden im Device global) das Attribut language auf DE geändert werden und anschließend die DEF der RHASSPY-Instanz geändert werden (z.B. indem ein Leerzeichen angefügt wird), oder es kann direkt die DEF geändert werden, indem "language=de" ergänzt wird:
defmod rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 language=de
Das Internal LANGUAGE hat den Wert de? Dann ist dieser Teilschritt abgeschlossen.
Sprachdatei
RHASSPY enthält einige vorgefertigte Antwortsätze für diverse Situationen. Um diese von Englisch auf Deutsch umzustellen, wird eine zusätzliche 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 list Rhasspy
einen Abschnitt lng enthält, der deutsche Antworten auflistet.
Erste Interaktion
Im Menüpunkt sentences muss jetzt zunächst der vorhandene Intent [GetTime] umbenannt werden. Jede Instanz von RHASSPY reagiert nur auf intents, die "für sie" ist und entsprechend gekennzeichnet wird. Diese Kennung besteht aus dem language-Kürzel und der fhemId und ist in der sentences.ini wie folgt zu verwenden:
[de.fhem:GetTime] wie spät ist es sag mir die uhrzeit
Die Schritte bis hierhin waren erfolgreich, wenn nach einer gesprochenen Anfrage nach der Uhrzeit eine (deutsche) Sprachansage erfolgt.
Erstes Gerät steuern
Erfassung
Sollten mit list Rhasspy
bereits Geräte im Abschnitt devicemap aufgeführt sein, kann als erstes Testgerät eines davon verwendet werden, wobei es sich empfiehlt, eines zu wählen, dass man ein- und ausschalten kann, also dem gernericDeviceType light oder switch entspricht. Ist noch kein solches im list enthalten, sollten ein oder zwei Geräte über das (jetzt) verfügbare globale Attribut gernericDeviceType als light oder switch gekennzeichnet werden. Anschließend muss die Erkennung für neue Geräte gestartet werden:
set rhasspy update devicemap
Dieser Teilschritt war erfolgreich, wenn
- im list der RHASSPY-Instanz die Geräte unter devicemap erscheinen und in deren Unterstruktur Kommandos unter SetOnOff gelistet sind, und
- im Rhasspy-Webinterface unter Slots page diverse Intents
- mit der de.fhem-Kennung vorhanden sind und
- diese auch in den slots enthalten sind (z.B. in de.fhem.device-SetOnOff). Die Bezeichnungen in den Slots sollte dabei denen entsprechen, die im list unter alias bzw. names aufgeführt sind.
Intent erstellen
Analog zu [GetTime] muss jetzt ein neuer, passender Intent in sentences.ini aufgenommen werden. Da hierbei ja potentiell eines von vielen Geräten gesteuert werden soll, muss mind. der Gerätename speziell gekennzeichnet werden, damit RHASSPY daraus eine sinnvolle Aktion ableiten kann. Eine erste Fassung könnte sein:
[de.fhem:SetOnOff] schalte (den|die|das) $de.fhem.Device-SetOnOff{Device} [(im|in (der|dem)) $de.fhem.Room{Room}] ( an{Value:on} | aus{Value:off} )
Nunmehr sollte sich das Gerät mit gesprochenen Anweisungen (unter Verwendung eines eventuell "komischen" Namens) an- und ausschalten lassen.
Gratulation: Damit sollte die prinzipielle Vorgehensweise klar sein, wie RHASSPY und Rhasspy miteinander interagieren.
Abrundung
Um die an Rhasspy übermittelten Infos (im Sinne der Sprechbarkeit etc.) zu verbessern, stehen diverse Optionen zur Auswahl:
- Im Attribut rhasspyTweaks (an rhasspy) können beliebige Schlüsselwörter für rooms und groups zentral ausgefiltert werden (FHEM-Restart erforderlich):
attr rhasspy rhasspyTweaks ignoreKeywords=rooms=alexa|mqtt.*device|googleassistant|huedevice groups=türen.und.fenster
- Statt des technischen Device-Namens des FHEM-Devices wird
- das globale alias verwendet, oder (falls gesetzt) das von RHASSPY an den "untergeordneten Geräten" bereitgestellte Attribut
- rhasspyName
- entsprechendes gilt für rhasspyGroup und rhasspyRoom
Werden die speziellen Attribute verwendet, können (komma-getrennt) mehrere Angaben gemacht werden. Dabei ist das jeweils erste Element der "Hauptname", der im RHASSPY-list dann als alias erscheint.
- danach verbleibende "Unverständliche Wörter" (z.B. für Dialekt) zeigt Rhasspy in seinem Web-Interface an und können dort "lautmalerisch" so abgebildet werden, dass Rhasspy auch diese erkennen kann.
Weitere Geräte steuern
Für weitere Geräte gilt das oben gesagte entsprechend.
Gruppen
Mehrere Geräte lassen sich über den intent [SetOnOffGroup] schalten
[de.fhem:SetOnOffGroup] \[(schalt|mach)] ( alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [im] [( überall:global | $de.fhem.Room ){Room}] ( an{Value:on} | aus{Value:off} )
Dabei sollte darauf geachtet werden, dass es keine Überschneidungen mit "Sätzen" gibt, die für andere intents verwendet werden. Hier ist dies das obligatorische alle oder sämtliche gegeben.
Zahlenwerte
Hier ein Beispielsatz, um z.B. Leuchten zu hoch- und herunterzudimmen:
[de.fhem:SetNumeric] ( mach |schalt|schalte|stelle) $de.fhem.Device-light{Device} [um] [(0..100){Value}] [prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}
Für andere genericDeviceType-Geräte könnten passende weitere Satz-Muster ergänzt werden, z.B. für Rollladen. Das geht auch für Gruppen, wenn man einen passenden intent anlegt, und es geht mit dem passenden Satzmuster auch für die direkte Ansteuerung eines Werts.
Farben
Farben und Weisswerte erwartet RHASSPY als nummerischen Wert von 0-360 , entsprechend dem HSV-Farbraum. Für deutsch ist ein entsprechender Abschnitt in der oben genannten rhasspy-de.cfg (languageFile) enthalten, der direkt auch an Rhasspy als slot übermittelt wird. Für Farbtemperatru-Werte gilt das entsprechend mit einem Wertebereich von 0-100.
[de.fhem:SetColor] \[setze|färbe] $de.fhem.Device-light{Device} [$de.fhem.Room{Room}] [auf die Farbe] ( $de.fhem.Colors{Hue} | $de.fhem.Colortemp{Colortemp} )
Alternativ kann
- auch ein RGB-Wert übergeben oder erzwungen werden (siehe den entsprechenden slot bzw. rhasspySpecials). Dabei ist zu beachten, dass RGB immer auch einen festen Helligheitswert enthält;
- rhasspyColors als Attribut gesetzt werden. Diese Methode ist historisch bedingt und nicht mehr zu empfehlen.
Abfragen
RHASSPY kann - abhängig von den konkreten Einstellungen - auf Fragen nach Zuständen usw. beantworten. Dazu und für weitere Optionen ist am Ende der commandref eine Liste der von RHASSPY direkt verstandenen intents zu finden.