Fhem-rhasspy: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
K (Wird jetzt auf RHASSPY weiter geleitet)
Markierung: Neue Weiterleitung
 
(8 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{SEITENTITEL:RHASSPY}}
#WEITERLEITUNG [[RHASSPY]]
{{Infobox Modul
|ModPurpose=Anbindung von FHEM an den Rhasspy Sprachassistenten
|ModType=contrib
|ModCmdRef=RHASSPY
|ModForumArea=Frontends/Sprachsteuerung
|ModTechName=10_RHASSPY.pm
|ModOwner=BetaUser ({{Link2FU|9229|Forum}}/[[Benutzer Diskussion:Beta-User|Wiki]]), drhirn ({{Link2FU|15727|Forum}}/[[Benutzer Diskussion:Drhirn|Wiki]])
}}
{{Baustelle}}
{{Baustelle}}
[https://github.com/rhasspy/rhasspy 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.
[https://github.com/rhasspy/rhasspy 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.
Zeile 14: Zeile 6:


{{Hinweis| In diesem Artikel und der commandref werden folgende Schreibweisen verwendet:
{{Hinweis| In diesem Artikel und der commandref werden folgende Schreibweisen verwendet:
* '''RHASSPY''' bezieht sich auf das FHEM-Modul oder das FHEM-Device
* '''[[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.}}
* '''Rhasspy''' bezeichnet die (zentrale) Installation bzw. das Web-Interface, unter dem die Scriptsammlung verwaltet werden kann.}}


== Quick-Start ==
== 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!
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 ===
=== Vorbereitung ===
Zunächst muss ''Rhasspy'' funktionsfähig sein. Dazu bitte der Anleitung in der [https://rhasspy.readthedocs.io/en/latest/#getting-started offiziellen Dokumentation] folgen. [Gisbert: Es kann vorkommen, dass andere Pakete, die für die Installation von Rhasspy unbedingt erforderlich sind, fehlen und seperat heruntergeladen werden müssen. Es wird dann bei der Installation explizit darauf hingewiesen.] Für diese Anleitung wird vorausgesetzt, dass der Dienst an sich läuft und mind. ein Audio Ein- und Ausgabegerät funktionsfähig ist.   
[[Datei:Rhasspy Webinterface.png|mini|rechts|Rhasspy Web-Interface]]
Zunächst muss ''Rhasspy'' funktionsfähig sein. Dazu bitte der Anleitung in der [https://rhasspy.readthedocs.io/en/latest/#getting-started offiziellen Dokumentation] folgen<ref>Für die Installation über des Debian-Pakets kann es erforderlich sein, weitere Pakete zu installieren und den automatischen Start bei Systemstart selbst einzurichten.</ref>. Es wird dann bei der Installation explizit darauf hingewiesen.] 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 [https://rhasspy.readthedocs.io/en/latest/#web-interface Web-Interface von Rhasspy] der gesprochene Testsatz ''wie spät ist es'' erkannt wird und links als erkannter ''intent'' "GetTime" angezeigt wird.
Die Vorbereitung ist abgeschlossen, wenn im [https://rhasspy.readthedocs.io/en/latest/#web-interface Web-Interface von Rhasspy] der gesprochene Testsatz ''wie spät ist es'' erkannt wird und links als erkannter ''intent'' "GetTime" angezeigt wird.


[[Datei:Rhasspy Webinterface.png|none|mini]]
=== FHEM Modul ===
==== Installation ====
''Hinweis:'' Für die in diesem Quick-Start dargestellte Vorgehensweise ist mindestens die Version 0.5.02 erforderlich.
 
Aktuelle Entwicklungsversionen sind im [https://github.com/fhem/fhem-rhasspy GitHub-Repository] des Moduls zu finden.


=== FHEM Modul ===
=====FHEM SVN=====
==== Download ====
Das für FHEM erforderliche Modul ist in "contrib" verfügbar und kann über [[FHEMWEB]] mit dem Befehl
Das für FHEM erforderliche Modul ist in contrib verfügbar und kann über FHEMWEB mit  
<syntaxhighlight lang="Text">
  { Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }
  { Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }
</syntaxhighlight>
heruntergeladen werden.
heruntergeladen werden.


Hinweis: Für die hier dargestellte Vorgehensweise ist mind. Version 0.5.02 erforderlich.
Genauere Informationen zu dieser Vorgangsweise sind unter [[Update#Einzelne_Dateien_aus_dem_SVN_holen|einzelne Dateien aus dem SVN holen]] beschrieben.
 
=====FHEM Update und Git=====
Eine andere Möglichkeit ist, den [[update]] Befehl von FHEM zu nutzen, um das Modul zu installieren oder auf den neuesten Stand zu bringen.
Dazu muss das GIT-Repository des Moduls in die Liste der - vom update Befehl - zu verarbeitenden Module aufgenommen werden:
<syntaxhighlight lang="Text">
update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt
</syntaxhighlight>
 
Danach kann das Modul mit folgendem Befehl installiert oder upgedatet werden:
<syntaxhighlight lang="Text">
update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt
</syntaxhighlight>
 
Weitere Informationen zu dieser Vorgehensweise stehen in der {{Link2CmdRef|Anker=update}} oder sind für den FHEM [[update]] Befehl beschrieben.


Aktuelle Entwicklungsversionen sind im [https://github.com/fhem/fhem-rhasspy GitHub-Repository] des Moduls zu finden.
==== MQTT2_CLIENT ====
==== 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 über einen [[MQTT2_CLIENT]] bezogen werden:
[[Datei:Rhasspy02.png|mini|right|Ein erfolgreich mit Rhasspy verbundenes MQTT2_CLIENT Device]]
defmod rhasspyMQTT2 MQTT2_CLIENT localhost:12183
Rhasspy kommuniziert hauptsächlich über das [[MQTT]]-Protokoll. Und zwar sowohl intern, als auch mit FHEM. Da dies auch für die übertragene Sprache gilt und es daher zu sehr viel MQTT-Verkehr kommt, sollten der Rhasspy-interne MQTT-Server aktiviert bleiben und die für FHEM relevanten Daten über einen [[MQTT2_CLIENT]] bezogen werden:
attr rhasspyMQTT2 clientOrder RHASSPY
 
attr rhasspyMQTT2 subscriptions setByTheProgram
<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. Passt alles, sollte '''opened''' im ''STATE'' dieses Devices stehen.
Läuft Rhasspy auf einem anderen Server und/oder wird ein anderer Port verwendet, sind die Daten im obigen ''defmod'' entsprechend anzupassen. Passt alles, sollte '''opened''' im ''STATE'' dieses Devices stehen.


==== Define ====
==== Define ====
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:
define Rhasspy RHASSPY
:<code>define Rhasspy RHASSPY </code>
Für einen entfernten Rhasspy-Dienst muss angeben werden, wo dessen '''Web-Interface''' zu erreichen ist:
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
<syntaxhighlight lang="text">
defmod rhasspy RHASSPY baseUrl=http://192.168.1.210:12101
</syntaxhighlight>


Dieser Schritt war erfolgreich, wenn  
Dieser Schritt war erfolgreich, wenn  
Zeile 55: Zeile 73:
==== Sprache ====
==== Sprache ====
===== Basissprache =====
===== 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'' eingestellt 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:
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'' eingestellt 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
<syntaxhighlight lang="text">
defmod rhasspy RHASSPY baseUrl=http://192.168.1.210:12101 language=de
</syntaxhighlight>
Das Internal ''LANGUAGE'' hat den Wert ''de''? Dann ist dieser Teilschritt abgeschlossen.
Das Internal ''LANGUAGE'' hat den Wert ''de''? Dann ist dieser Teilschritt abgeschlossen.


===== Sprachdatei =====
===== 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:
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:
<syntaxhighlight lang="text">
  { Svn_GetFile('contrib/RHASSPY/rhasspy-de.cfg', './rhasspy-de.cfg') }
  { Svn_GetFile('contrib/RHASSPY/rhasspy-de.cfg', './rhasspy-de.cfg') }
</syntaxhighlight>
Ergänzend muss RHASSPY mitgeteilt werden, wo diese zu finden ist:  
Ergänzend muss RHASSPY mitgeteilt werden, wo diese zu finden ist:  
<syntaxhighlight lang="text">
  attr Rhasspy languageFile ./rhasspy-de.cfg
  attr Rhasspy languageFile ./rhasspy-de.cfg
 
</syntaxhighlight>
Dieser Schritt war erfolgreich, wenn <code>list Rhasspy</code> einen Abschnitt ''lng'' enthält, der deutsche Antworten auflistet.
Dieser Schritt war erfolgreich, wenn <code>list Rhasspy</code> einen Abschnitt ''lng'' enthält, der deutsche Antworten auflistet.


=== Erste Interaktion ===
=== Erste Interaktion ===
Im Menüpunkt [https://rhasspy.readthedocs.io/en/latest/tutorials/#training 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:
Im Menüpunkt [https://rhasspy.readthedocs.io/en/latest/tutorials/#training 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:
<syntaxhighlight lang="text">
  [de.fhem:GetTime]
  [de.fhem:GetTime]
  wie spät ist es
  wie spät ist es
  sag mir die uhrzeit
  sag mir die uhrzeit
 
</syntaxhighlight>
Die Schritte bis hierhin waren erfolgreich, wenn nach einer gesprochenen Anfrage nach der Uhrzeit eine (deutsche) Sprachansage erfolgt.
Die Schritte bis hierhin waren erfolgreich, wenn nach einer gesprochenen Anfrage nach der Uhrzeit eine (deutsche) Sprachansage erfolgt.


Zeile 78: Zeile 102:
==== Erfassung ====
==== Erfassung ====
Sollten mit <code>list Rhasspy</code> bereits Geräte im Abschnitt ''devicemap'' aufgeführt sein, kann eines davon als erstes Testgerät verwendet werden. Es empfiehlt sich, eines zu wählen, dass man ein- und ausschalten kann, also dem ''genericDeviceType'' ''light'' oder ''switch'' entspricht. Ist noch kein solches im ''list'' enthalten, sollten ein oder zwei Geräte über das (jetzt) verfügbare globale Attribut ''genericDeviceType'' als ''light'' oder ''switch'' gekennzeichnet werden. Anschließend muss die Erkennung für neue Geräte gestartet werden:
Sollten mit <code>list Rhasspy</code> bereits Geräte im Abschnitt ''devicemap'' aufgeführt sein, kann eines davon als erstes Testgerät verwendet werden. Es empfiehlt sich, eines zu wählen, dass man ein- und ausschalten kann, also dem ''genericDeviceType'' ''light'' oder ''switch'' entspricht. Ist noch kein solches im ''list'' enthalten, sollten ein oder zwei Geräte über das (jetzt) verfügbare globale Attribut ''genericDeviceType'' als ''light'' oder ''switch'' gekennzeichnet werden. Anschließend muss die Erkennung für neue Geräte gestartet werden:
<syntaxhighlight lang="text">
  set rhasspy update devicemap
  set rhasspy update devicemap
 
</syntaxhighlight>
Dieser Teilschritt war erfolgreich, wenn  
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 list der RHASSPY-Instanz die Geräte unter ''devicemap'' erscheinen und in deren Unterstruktur Kommandos unter ''SetOnOff'' gelistet sind, und
Zeile 85: Zeile 110:
** mit der ''de.fhem''-Kennung vorhanden sind und
** mit der ''de.fhem''-Kennung vorhanden sind und
** diese Geräte- und Raumnamen usw. auch in den slots enthalten sind (z.B. das gewählte Licht in ''de.fhem.device-SetOnOff''). Die Bezeichnungen in den Slots sollte dabei denen entsprechen, die im list unter ''alias'' bzw. ''names'' aufgeführt sind.
** diese Geräte- und Raumnamen usw. auch in den slots enthalten sind (z.B. das gewählte Licht 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 ====
==== 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 als Übergabeelement für die Automatisierung "gekennzeichnet" werden, damit RHASSPY daraus eine sinnvolle Aktion ableiten kann. Entsprechendes gilt für Zielwerte usw.. Eine erste Fassung könnte sein:
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 als Übergabeelement für die Automatisierung "gekennzeichnet" werden, damit RHASSPY daraus eine sinnvolle Aktion ableiten kann. Entsprechendes gilt für Zielwerte usw. Eine erste Fassung könnte sein:
<syntaxhighlight lang="text">
  [de.fhem:SetOnOff]
  [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} )
  schalte (den|die|das) $de.fhem.Device-SetOnOff{Device} [(im|in (der|dem))  $de.fhem.Room{Room}] ( an{Value:on} | aus{Value:off} )
 
</syntaxhighlight>
{{Hinweis | Dieses 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.}}
{{Hinweis | Dieses 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.}}


Nunmehr sollte sich das Gerät mit gesprochenen Anweisungen (unter Verwendung eines eventuell "komischen" Namens) an- und ausschalten lassen.  
Nunmehr sollte sich das Gerät mit gesprochenen Anweisungen (unter Verwendung eines eventuell "komischen" Namens) an- und ausschalten lassen.  
Zeile 98: Zeile 125:
==== Abrundung ====
==== Abrundung ====
Um die an Rhasspy übermittelten Infos (im Sinne der Sprechbarkeit etc.) zu verbessern, stehen diverse Optionen zur Auswahl:
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):
* Im Attribut ''rhasspyTweaks'' (an rhasspy) können beliebige Schlüsselwörter für ''rooms'' und ''groups'' zentral ausgefiltert werden (FHEM-Restart erforderlich):<syntaxhighlight lang="text">attr rhasspy rhasspyTweaks ignoreKeywords=rooms=alexa|mqtt.*device|googleassistant|huedevice groups=türen.und.fenster</syntaxhighlight>
attr rhasspy rhasspyTweaks ignoreKeywords=rooms=alexa|mqtt.*device|googleassistant|huedevice groups=türen.und.fenster
* Statt des technischen Device-Namens des FHEM-Devices wird  
* 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  
** das globale ''alias'' verwendet, oder (falls gesetzt) das von RHASSPY an den "untergeordneten Geräten" bereitgestellte Attribut  
Zeile 113: Zeile 139:
==== Gruppen ====
==== Gruppen ====
Mehrere Geräte lassen sich über den ''intent'' [SetOnOffGroup] schalten
Mehrere Geräte lassen sich über den ''intent'' [SetOnOffGroup] schalten
<syntaxhighlight lang="text">
  [de.fhem:SetOnOffGroup]
  [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} )
  \[(schalt|mach)] ( alle | sämtliche ) $de.fhem.Group-SetOnOff{Group} [im] [( überall:global | $de.fhem.Room ){Room}] ( an{Value:on} | aus{Value:off} )
</syntaxhighlight>
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.
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 ====
==== Zahlenwerte ====
Hier ein Beispielsatz, um z.B. Leuchten zu hoch- und herunterzudimmen:
Hier ein Beispielsatz, um z.B. Leuchten zu hoch- und herunterzudimmen:
<syntaxhighlight lang="text">
  [de.fhem:SetNumeric]
  [de.fhem:SetNumeric]
  ( mach |schalt|schalte|stelle) $de.fhem.Device-light{Device} [um] [(0..100){Value}] [prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}
  ( mach |schalt|schalte|stelle) $de.fhem.Device-light{Device} [um] [(0..100){Value}] [prozent{Unit:percent}] ( heller:lightUp | dunkler:lightDown){Change}
</syntaxhighlight>
Für andere ''genericDeviceType''-Geräte könnten passende weitere Satz-Muster ergänzt werden, z.B. für Rollladen.
Für andere ''genericDeviceType''-Geräte könnten passende weitere Satz-Muster ergänzt werden, z.B. für Rollladen.


Zeile 127: Zeile 157:
==== Farben ====
==== Farben ====
Farben erwartet RHASSPY als nummerischen Wert von 0-360 , entsprechend der Hue-Dimension im [https://de.wikipedia.org/wiki/HSV-Farbraum 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 Farbtemperatur-Werte gilt das entsprechend mit einem Wertebereich von 0-100.
Farben erwartet RHASSPY als nummerischen Wert von 0-360 , entsprechend der Hue-Dimension im [https://de.wikipedia.org/wiki/HSV-Farbraum 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 Farbtemperatur-Werte gilt das entsprechend mit einem Wertebereich von 0-100.
<syntaxhighlight lang="text">
  [de.fhem:SetColor]
  [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} )
  \[setze|färbe] $de.fhem.Device-light{Device} [$de.fhem.Room{Room}] [auf die Farbe] ( $de.fhem.Colors{Hue} | $de.fhem.Colortemp{Colortemp} )
</syntaxhighlight>
Alternativ kann  
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 Hellikheitswert enthält;
* auch ein RGB-Wert übergeben oder erzwungen werden (siehe den entsprechenden ''slot'' bzw. ''rhasspySpecials''). Dabei ist zu beachten, dass RGB immer auch einen festen Hellikheitswert enthält;
Zeile 134: Zeile 166:


==== Abfragen ====
==== 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, samt der Datenfelder, die Benötigt werden.
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, samt der Datenfelder, die benötigt werden.


== Links ==
== Links ==

Aktuelle Version vom 1. Dezember 2021, 10:32 Uhr

Weiterleitung nach:


Clock - Under Construction.svg 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.


Info blue.png
In diesem Artikel und der commandref werden folgende Schreibweisen verwendet:
  • 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

Rhasspy Web-Interface

Zunächst muss Rhasspy funktionsfähig sein. Dazu bitte der Anleitung in der offiziellen Dokumentation folgen[1]. Es wird dann bei der Installation explizit darauf hingewiesen.] 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

Installation

Hinweis: Für die in diesem Quick-Start dargestellte Vorgehensweise ist mindestens die Version 0.5.02 erforderlich.

Aktuelle Entwicklungsversionen sind im GitHub-Repository des Moduls zu finden.

FHEM SVN

Das für FHEM erforderliche Modul ist in "contrib" verfügbar und kann über FHEMWEB mit dem Befehl

 { Svn_GetFile('contrib/RHASSPY/10_RHASSPY.pm', 'FHEM/10_RHASSPY.pm') }

heruntergeladen werden.

Genauere Informationen zu dieser Vorgangsweise sind unter einzelne Dateien aus dem SVN holen beschrieben.

FHEM Update und Git

Eine andere Möglichkeit ist, den update Befehl von FHEM zu nutzen, um das Modul zu installieren oder auf den neuesten Stand zu bringen. Dazu muss das GIT-Repository des Moduls in die Liste der - vom update Befehl - zu verarbeitenden Module aufgenommen werden:

 update add https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt

Danach kann das Modul mit folgendem Befehl installiert oder upgedatet werden:

 update all https://raw.githubusercontent.com/fhem/fhem-rhasspy/main/controls_fhem-rhasspy.txt

Weitere Informationen zu dieser Vorgehensweise stehen in der commandref/update oder sind für den FHEM update Befehl beschrieben.

MQTT2_CLIENT

Ein erfolgreich mit Rhasspy verbundenes MQTT2_CLIENT Device

Rhasspy kommuniziert hauptsächlich über das MQTT-Protokoll. Und zwar sowohl intern, als auch mit FHEM. Da dies auch für die übertragene Sprache gilt und es daher zu sehr viel MQTT-Verkehr kommt, sollten der Rhasspy-interne MQTT-Server aktiviert bleiben und die für FHEM relevanten Daten über einen MQTT2_CLIENT bezogen 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 Daten im obigen defmod entsprechend anzupassen. Passt 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 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.

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 eingestellt 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 (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 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 eines davon als erstes Testgerät verwendet werden. Es empfiehlt sich, eines zu wählen, dass man ein- und ausschalten kann, also dem genericDeviceType light oder switch entspricht. Ist noch kein solches im list enthalten, sollten ein oder zwei Geräte über das (jetzt) verfügbare globale Attribut genericDeviceType 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 Einträge
    • mit der de.fhem-Kennung vorhanden sind und
    • diese Geräte- und Raumnamen usw. auch in den slots enthalten sind (z.B. das gewählte Licht 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 als Übergabeelement für die Automatisierung "gekennzeichnet" werden, damit RHASSPY daraus eine sinnvolle Aktion ableiten kann. Entsprechendes gilt für Zielwerte usw. 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} )
Info blue.png
Dieses 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.


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.
Info blue.png
RHASSPY arbeitet "kontextbezogen" und unterscheidet (anhand der siteId des Spracheingabegeräts) gleich benannte Geräte u.U. einfach darüber, aus welchem Raum die Anweisung kommt. "Mach das Licht an" hat im Esszimmer gesprochen daher eine andere Auswirkung als im Wohnzimmer.


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 erwartet RHASSPY als nummerischen Wert von 0-360 , entsprechend der Hue-Dimension im 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 Farbtemperatur-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 Hellikheitswert 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, samt der Datenfelder, die benötigt werden.

Links

  1. Für die Installation über des Debian-Pakets kann es erforderlich sein, weitere Pakete zu installieren und den automatischen Start bei Systemstart selbst einzurichten.