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").