NEUE Betreff: Text-to-Speech App

Begonnen von mediastudio, 02 November 2025, 17:59:16

Vorheriges Thema - Nächstes Thema

mediastudio

Sprachbefehle von Fhem modifizieren:

Ich habe mehrere Sprachbefehle in ein  99_myVoiceControl.pm gebracht.
Ein einzelnes Notify + eine Perl-Funktion die automatisch
erkennt, welches Licht gemeint ist (z. B. ,,Küche", ,,Schlafzimmer", ,,Wandlampen" usw.)
erkennt, ob ein oder aus gesagt wurde, den passenden Actor setzt und den
Text-to-Speech-Antworttext erzeugt. Die fhem.cfg bleibt übersichtlich und der
Einsatz von Text-to-Speech funktioniert mit der FHEMVoiceClient.app funktioniert.

99_myVoiceControl.pm 

use utf8;
use Encode qw(decode);

sub myVoiceLight {
  my ($cmd) = @_;

  # UTF-8 sicherstellen
  $cmd = decode("utf8", $cmd) unless utf8::is_utf8($cmd);
  $cmd = lc($cmd);

  # Umlaute normalisieren
  my %replacements = (
    'ä' => 'ae', 'ö' => 'oe', 'ü' => 'ue', 'ß' => 'ss'
  );
  $cmd =~ s/([äöüß])/$replacements{$1}/ge;

  Log 1, "Sprachbefehl empfangen: $cmd";

 # Räume + Gerätezuordnung
  my %devices = (
    'kueche'             => 'Deckenstrahler_Actor',
    'flur esszimmer'     => 'Flur_Esszimmer_Actor',
    'tischlampe'         => 'Tischleuchte_Licht_Actor',
    'tischleuchte'       => 'Tischleuchte_Licht_Actor',
    'schlafzimmer'       => 'Schlafzimmer_Actor',
    'schrankbeleuchtung' => 'Schrankbeleuchtung_Actor',
    'wandlampe'          => 'Wandlampen_Actor',
    'wandlampen'        => 'Wandlampen_Actor',
    'gaeste wc'         => 'Gaeste_WC_Actor',
    'badezimmer'         => 'Badezimmer_Actor',
    'hauswirtschaftsraum' => 'HWR_Licht_Actor',
    'gästezimmer'         => 'Gaestezimmer_Actor',
    'flur'                 => 'Flur_Eingang_Actor',
    'schlummerlicht'    => 'SchlummerlichtDimmer',
    'multimedia wand'  => 'Multimedia_Actor',
  );

  my $foundDevice;
  my $foundName;

  # Welcher Raum / welches Gerät?
  foreach my $name (keys %devices) {
    if ($cmd =~ /$name/) {
      $foundDevice = $devices{$name};
      $foundName = $name;
      last;
    }
  }

  if (!$foundDevice) {
    fhem("set androidTablet ttsSay Ich habe den Raum oder das Licht nicht erkannt");
    Log 1, "Kein Gerät erkannt in Sprachbefehl: $cmd";
    return;
  }

  # Ein / Aus erkennen
  if ($cmd =~ /\b(aus|ausschalten)\b/) {
    fhem("set $foundDevice off");
    fhem("set androidTablet ttsSay Licht $foundName ausgeschaltet");
    Log 1, "[$foundName] ausgeschaltet";

  } elsif ($cmd =~ /\b(an|ein|einschalten)\b/) {
    fhem("set $foundDevice on");
    fhem("set androidTablet ttsSay Licht $foundName eingeschaltet");
    Log 1, "[$foundName] eingeschaltet";

  } else {
    fhem("set androidTablet ttsSay Ich habe kein 'an' oder 'aus' verstanden");
    Log 1, "[$foundName] Kein An/Aus in Befehl erkannt: $cmd";
  }
}


In der fhem.cfg

#########################################
###  Licht Modul 99_myVoiceControl.pm ###
#########################################
define speechRecognizer_Licht notify .*voiceRecognitionLastResult.*(Licht|Lampe|Leuchte|Steckdose).* { myVoiceLight($EVENT);; }


Sprachbefehle z.B. Küche Licht an / Wandlampen Licht an / wichtig in  # Räume + Gerätezuordnung sollten die Räume in kleinschrift sein
Ich hab das getestet und meine fhem.cfg wird schlanker.


Beta-User

Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mediastudio

Ich habe mir Modul Babble mal angesehen, besonders wichtig für mein Projekt war es, die Funktionalität der Sprachbefehle
aus der fhem.cfg beizubehalten, die zuvor problemlos mit der Webview-App funktionierten. Die Herausforderung lag darin,
eine benutzerfreundliche App zu entwickeln, die es ermöglicht, Aktoren direkt anzusprechen, ohne dass zusätzliche Hardware
oder Server erforderlich sind. Diese Anforderung führte mich zur der Entscheidung, das Projekt FHEMVoiceClient zu entwickeln.
FHEMVoiceClient hat sich als besonders geeignet erwiesen, da es eine direkte Schnittstelle zu FHEM bietet und somit die
Integration von Sprachbefehlen wieder bereitstellt.
Die Entwicklung der App habe ich mit Android Studio erstellt, einem leistungsstarken Tool, das eine effiziente Programmierung
und einfache Verwaltung von Projekten ermöglicht. Ich habe es auf GitHub geladen und es wird in kürze möglich sein, die App
der breiten Öffentlichkeit zur Verfügung zu stellen. Dies fördert nicht nur die Transparenz des Projekts, sondern ermöglicht
auch anderen Entwicklern, zur Weiterentwicklung beizutragen oder eigene Anpassungen vorzunehmen.

Insgesamt zielt das Projekt darauf ab, die Benutzerfreundlichkeit von FHEM zu erhöhen und den Zugang zu Sprachsteuerungsfunktionen
zu erleichtern. Die Kombination aus bewährter Technologie und der Fähigkeit, bestehende Konfigurationen zu nutzen, stellt sicher,
dass Anwender ihre Smart-Home-Aktivitäten wie gewohnt steuern können, ohne sich mit komplizierten neuen Systemen auseinandersetzen zu müssen.

Beta-User

#33
Zitat von: mediastudio am 11 November 2025, 20:01:03auf GitHub geladen
Das klingt gut!

Habe die App (über den ersten Link, weil das Entpacken der 7z-File auf dem verwendeten Handy nicht auf die Schnelle geklappt hat) mal runtergeladen und installiert.

Folgendes ist mir aufgefallen:
- Es wird bei jedem Start nach den settings gefragt?
- die App läßt oben die normale Android-Statusleiste offen, färbt aber den Hintergrund blau ein. Meine Anregung wäre, die Leiste auszublenden, so wie z.B. fully das macht, aber jedenfalls nicht irgendeine Farbe vorzugeben.
- Es erscheint dauerhaft "Connection lost, trying a reconnect...". Die URL zeigt auf die Standard-fhem-UI, die benutzte FHEMWEB-Instanz steht auf "websocket". Die Seite wird angezeigt und auch aktualisiert.
- die beiden dummy-Devices habe ich mal angelegt, sehe aber weder Events (im Event-Monitor, mit der regexp für dein notify), noch werden Readings befüllt, wenn ich über die STT-Option der App was einspreche. Wo liegt mein Verständnisfehler?


Was die Hinweise auf weitere "text-to-fhem-action"-Optionen angeht:
Es ist super, wenn es eine Android-Fullscreen-Lösung gibt, die einen einfachen Zugang zu Sprachsteuerungsoptionen in FHEM bietet. Die gezeigte "notify"-Lösung ist eine gute Sache, um das Prinzip zu erklären und ggf. auch für einfache Anwendungsfälle (oder bestehende Alt-Konfigurationen) eine plug-and-play-Lösung anzubieten. Wer bereits andere, komplexere Lösungen kennt (oder einrichten will), sollte nur eben die Möglichkeit haben, deinen Baustein "App" so in das Gesamtsystem einzubauen, dass auch solche komplexeren Anwendungsszenarien erfüllt werden können.
In Bezug auf RHASSPY würde das bedeuten, dass man erkennen kann, von welchem (von gedachten mehreren) Android-Gerät(en) eine Sprachanweisung kam, um dann dahin auch die Antwort schicken zu können (oder Kontext-Abhängigkeiten sauber aufzulösen, Berechtigungen zu prüfen, ..., you name it).
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Prof. Dr. Peter Henning

#34
Als Entwickler und Maintainer des Moduls Babble hänge ich mich hier mal rein.

LG

pah

P.S.: Zur Eingabe in Babble nutze ich in der Regel wandhängende Tablets, die als AMAD-Device mit FHEM zusammenarbeiten.
An Babble habe ich, natürlich, einen rivescript-Chatbot angehängt, so dass das Ding immer ein Ergebnis liefert.
Schaltbefehle in Babble gehen bei mir, da ich ein verteiltes FHEM-System habe, auch an andere Maschinen. Und deren generische Devices hole ich mit einer kleinen Babble-Erweiterung immer automatisch ab.

Zur Sprachausgabe nutze ich Amazon Polly. Neben der Möglichkeit, beliebige Ausgaben über Amazon abzuholen (natürlich mit lokalem Cache), verwende ich ca. 200 vordefinierte Texte (etwa: "Die Haustür ist offen").

mediastudio

## Mit "pah" kann ich nun nichts anfangen!

Ich wollte ein wenig über meine aktuelle Situation mit dem Fully Kiosk Browser sprechen und wie ich wieder
zu einer funktionierenden WebView-Funktion zurückgekommen bin, ohne meine fhem.cfg neu aufsetzen zu müssen.
Für alle, die wie ich die Sprachfunktion auf neuen Handys nutzen möchten, habe ich die FHEMVoiceClient App vorgestellt.

Die App startet mit den bereits eingegebenen Einstellungen, sodass man nicht alles neu eingeben muss – einfach ,,Speichern und Starten".
Ich betreibe drei Raspberry Pis, jeder mit einer eigenen IP-Adresse. So kann ich beim Start problemlos auf meine Systeme zugreifen.

Da ich es nicht mag, Ports in meiner FritzBox freizugeben, nutze ich ,,WireGuard", was mir den Zugriff über IP ermöglicht. Durch dieses VPN kann ich ohne Probleme auf meine Hardware im Homeoffice zugreifen. Ich denke, dass ich die Sprachfunktion hauptsächlich zu Hause benutze.

Ich habe angekündigt, das Projekt frei zu geben. Änderungen an der FHEMVoiceClient App sind jedem selbst
überlassen, und derzeit erfüllt diese App meine Ansprüche.

Für die Benutzeroberfläche habe ich lediglich die FHEM Tablet UI V2 aufgerufen, da dort die Meldung ,,Connection lost, trying a reconnect..." nicht sichtbar ist. Mir ist jedoch aufgefallen, dass dies auch bei der Nutzung der FHEM GUI der Fall war. Ich werde das weiter untersuchen. Die Sprachbefehle und Rückmeldungen aus FHEM funktionieren aber wie erwartet. Wenn man die von mir beschriebenen Codeschnipsel in der fhem.cfg einfügt, sollte das auch ohne Änderungen an einer pm-Datei funktionieren. Die 99_myVoiceControl.pm habe ich erstellt, um die Notifications zu reduzieren; sie ist jedoch nicht zwingend erforderlich.

Ich halte euch auf dem Laufenden, sobald das Projekt auf GitHub verfügbar ist. Macht dann das Beste daraus!

Prof. Dr. Peter Henning

Zitat von: mediastudio am 12 November 2025, 13:59:48## Mit "pah" kann ich nun nichts anfangen!

Was soll das denn heißen?

pah

Beta-User

Zitat von: Prof. Dr. Peter Henning am 12 November 2025, 18:09:40
Zitat von: mediastudio am 12 November 2025, 13:59:48## Mit "pah" kann ich nun nichts anfangen!

Was soll das denn heißen?

pah
Vermutlich konnte der TE deine Paraphe nicht als solche deuten ;) .


Der "Missing Link" scheint https://wiki.fhem.de/wiki/WebViewControl zu sein.

Mal schauen, wann ich dazu komme, das mal zu aktivieren.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mediastudio

Hallo Herr Prof. Dr. Peter Henning,

ich hoffe, es geht Ihnen gut. Ich wollte mich kurz melden, um auf meine letzte Nachricht einzugehen.
In meiner Antwort habe ich ,,LG / pah" verwendet, wobei ,,LG" für ,,liebe Grüße" steht. Das ,,pah" war
mir in diesem Kontext nicht so geläufig, und ich verstehe, dass dies möglicherweise zu Verwirrung geführt hat.

Ich entschuldige mich, falls ich dadurch einen falschen Eindruck hinterlassen habe. Es war nicht meine
Absicht, Unklarheiten zu schaffen. Ich schätze Ihre Rückmeldung sehr und möchte sicherstellen,
dass wir uns klar verständigen können.

Vielen Dank für Ihr Verständnis!

Herzliche Grüße,
Wilfried Fröse

mediastudio

Hallo zusammen,

ich freue mich, euch mitteilen zu können, das ich einige wichtige Verbesserungen eingebracht
habe. An der Android-Statusleiste habe ich noch nichts geändert, bleibt für später. Die App
läuft jetzt stabil, ohne die vorherige Fehlermeldung ,,Connection lost, trying a reconnect...".
Das ist mir zwar etwas spät aufgefallen, aber das Testen ist ja gerade der Sinn der Sache.
Werte werden jetzt wie gewohnt aktualisiert.

Das ZIP-Paket habe ich auf meinem Server geladen. Ihr könnt es ab sofort wie gewohnt herunterladen.
Der letzte QR-Code enthält zudem die neueste Version der flex.js. Ich habe diese Datei ebenfalls
unter FHEM-flex getestet, und sie funktioniert einwandfrei bei mir.

Vielen Dank für eure Unterstützung und viel Spaß beim Testen der neuen Version!

Beste Grüße!
Wilfried Fröse

https://pgsys.de
Https://wf-consulting.eu


Beta-User

Könntest du eventuell die aktuelle App gesondert zum Download anbieten?

Das auf dem Handy aus einem ZIP zu holen ist für mich ziemlich umständlich.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Prof. Dr. Peter Henning

Ich würde es auch vorziehen, die App "einzeln" zu bekommen. Es ist mir noch nicht ganz klar, welche Funktionen anderer Anwendungen dadurch ersetzt werden sollen. AMAD und Fully funktionieren zusammen doch ganz brauchbar - das alte WebView habe ich schon lange aussortiert.

Beim Thema TTS ist noch zu sagen, dass ich dafür auf den Tablets immer noch ein wirklich uraltes Sprachmodell verwende - bevor Amazon das aufgekauft und in "Polly" umbenannt hat. Mit anderen Worten: Es ist immer dieselbe Stimme, egal ob ich Amazon verwende oder die TTS-Funktion eines meiner Tablets benutze.

LG

pah

Zitat von: mediastudio am 12 November 2025, 20:38:17Das ,,pah"
sind einfach meine Initialen

Beta-User

AMAD benötigt afaik die App Automagic. Die gibt es aber nicht mehr im Play Store, und schon auf meinem vor-vor-Handy war die damals noch anderswo zu bekommende App nur noch eingeschränkt lauffähig.
Ist m.E. ein Auslaufmodell...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

mediastudio

Hallo,
die App liegt auf dem Server als FHEMVoiceClient.apk.
Wenn die datei runtergeladen wird kann sie so als zip erscheinen FHEMVoiceClient.apk.zip.
Einfach die Datei umbenennen und .zip entfernen.
Hier ist ein QR-Code für die App FHEMVoiceClient.apk