(WIP) FHEMWEB interaktiv (speziell mit RHASSPY)

Begonnen von Beta-User, 03 April 2026, 11:24:46

Vorheriges Thema - Nächstes Thema

Beta-User

(Fast) OT noch eine Frage zu der derzeit in der Entwicklung befindlichen Alternative zu RHASSPY, Gemini:
Wie klappt das da mit "speziellen" Funktionalitäten?

"Damals" habe ich in RHASSPY irgendwann "tweaks" und "specials" eingeführt, weil über "normale" Befehle keine (wirklich) zufriedenstellende Ergebnisse zu erzielen waren.
Beispiele (ich hoffe, das kann man halbwegs interpretieren, um was es bei diesen "specials" hier jeweils geht):
Jalousie_Links           venetianBlind:setter=positionSlat stopCommand="set Jalousie_Links positionSlat [Jalousie_Links:positionSlat]"
Jalousie_WZ              venetianBlind:device=ZWave_SWITCH_MULTILEVEL_8.02 stopCommand="set ZWave_SWITCH_MULTILEVEL_8.02 dim [ZWave_SWITCH_MULTILEVEL_8.02:dim]"
LS_Wohnzimmer            scenes: Rollladen_geschlossen=none Rollladen_offen=none Test=none Kino="Heimkino starten"
Licht_Stehlampe_links_alt     colorTempMap:0="command Weiss" 85="command Weiss" 100="command Weiss"
Raumfuehler_Wohnzimmer     priority:inRoom=temperature
Thermostat_EssZi_Climate     priority:inRoom=desired-temp,temperature,humidity
Yamaha_Main              scenes:scene1="Musik hören" scene2="Film ansehen" scene3=none scene4="vorderen Eingang auswählen"
                                     priority: inRoom=volume outsideRoom=volume,scene
                                     confirm: SetOnOff="wirklich $target $Value schalten?" SetScene
Yamaha_Zone2             priority:inRoom=volume
 
Server: HP-elitedesk@Debian 13, 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

schwatter

#16
Nabend,

ok, es ist ganz einfach wenn die richtige Repo benutzt wird  ;D Danke für den Link.

root@ubuntufhem:/opt# sudo mkdir -p /opt/piper
root@ubuntufhem:/opt# sudo chown fhem:dialout /opt/piper
root@ubuntufhem:/opt# cd /opt/piper
root@ubuntufhem:/opt/piper# sudo -u fhem python3 -m venv venv
root@ubuntufhem:/opt/piper# sudo -u fhem ./venv/bin/pip install https://github.com/OHF-Voice/piper1-gpl/releases/download/v1.4.2/piper_tts-1.4.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl
Collecting piper-tts==1.4.2
  Downloading https://github.com/OHF-Voice/piper1-gpl/releases/download/v1.4.2/piper_tts-1.4.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl (13.8 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 13.8/13.8 MB 10.2 MB/s eta 0:00:00
***Viele Packte die instalierte wurden***
root@ubuntufhem:/opt/piper# sudo ln -s /opt/piper/venv/bin/piper /usr/local/bin/piper
root@ubuntufhem:/opt/piper# piper --version
usage: piper [-h] -m MODEL [-c CONFIG] [-i INPUT_FILE] [-f OUTPUT_FILE] [-d OUTPUT_DIR]
             [--output-dir-naming {timestamp,text}] [--output-raw] [-s SPEAKER] [--length-scale LENGTH_SCALE]
             [--noise-scale NOISE_SCALE] [--noise-w-scale NOISE_W_SCALE] [--cuda]
             [--sentence-silence SENTENCE_SILENCE] [--volume VOLUME] [--no-normalize] [--data-dir DATA_DIR] [--debug]
piper: error: the following arguments are required: -m/--model
root@ubuntufhem:/opt/piper# sudo -u fhem piper --model /opt/fhem/piper_models/de_DE-thorsten-medium.onnx --output_file /opt/fhem/www/audio/voice.wav <<< "Version eins Punkt vier Punkt zwei ist nun aktiv."
root@ubuntufhem:/opt/piper#


Zitat von: Beta-User am 15 April 2026, 07:36:35
Zitat von: schwatter am 14 April 2026, 21:52:10Bei dem JS im contrib verfolge ich mehr oder weniger auch den Weg, das es fast nichts kennen muss. Außer Wakeword und wo das Readings STT ist. Das JS für den Atom Echo muss aber irgendwo die Info herbekommen, das es das Browsermikro freischalten soll.
Mein gedanklicher Angang wäre, das auf zwei alternativen anderen Wegen zu lösen:
- Wenn man eine FULLY-Instanz hat, "kennt" man über das mit der deviceId in f18.js die aktuelle Verbindung (FW_ID), und kann darüber das Mikro aufmachen. Im Prinzip ist das der Weg, den momentan auch RHASSPY (für Dialoge und Rückfragen) verwendet, nur dass das dann direkt über die FHEMWEB-Instanz läuft und nicht über den Umweg "welche FHEMWEB-Instanz gehört derzeit zu einem bestimmten (fully-) Gerät".
- Der andere (noch nicht getestete) Weg ginge über die allowed-Info. Danach könnte allerdings ein allowed-User eben nur eine Verbindung (gleichzeitig) nutzen.
Zugegeben: für die letzte Variante braucht man ähnlich viel Hintergrundinfo, wie wenn man das direkt in den Code schreibt, auf welches wakeword zu reagieren ist...

Aber was ist wenn der User mal nicht Fully nutzt?

Und zu Gemini. Bis jetzt habe ich es nur als Backup für Fragen benutzt, die nichts mit Fhem zu tun haben.
Der @ahlermi hatte mir seinem systemPrompt geschickt.
Beispiel:
Du bist ein KI-Assistent und Teil meiner FHEM Haussteuerung. Deine Aufgaben sind:

## 1. Geräte steuern und Rückmeldung geben
- Für die Geräteidentifizierung hat der Alias priorität, danach guck über dem Comment.
- Führe Steuerbefehle für Geräte aus, wenn du dazu aufgefordert wirst.
- Gib immer eine kurze Bestätigung, was geschaltet wurde (maximal 1 Satz).
- Beispiele:
  - "Rolllade Wohnzimmer wurde auf 0% geschlossen."
  - "Heizung Bad auf 22°C gestellt."

### Gerätespezifische Regeln:
- **Rollladen:** Wenn das Gerät als Rolllade erkannt wird und den set-Parameter "pct" hat:
  - 0 = ganz schließen, 100 = ganz öffnen.
- **Heizung:** Wenn das Gerät eine Heizung ist und "desiredTemperature" unterstützt, setze die Temperatur entsprechend.
- **Andere Befehle:** Bei Befehlen wie `motion_detection`:
  - Syntax: `set <GERÄT> motion_detection true` (ohne Doppelpunkt).
Das werde ich jetzt nach und nach testen.

Gruß schwatter

Beta-User

Zitat von: schwatter am 15 April 2026, 19:10:35ok, es ist ganz einfach wenn die richtige Repo benutzt wird  ;D Danke für den Link.
Danke zurück für die bereinigte Fassung der Anleitung!
(Irgendwann sollten wir ggf. mal hergehen, und das ganze für "Nachbauer" strukturiert (im Wiki) zusammenfassen).

Zitat von: schwatter am 15 April 2026, 19:10:35Aber was ist wenn der User mal nicht Fully nutzt?
Na ja, es gibt für mich geanklich zwei völlig unterschiedliche Wege, die nicht wirklich was miteinander zu tun haben:
- Entweder es kommt fully/FULLY zum Einsatz. Dann ist es (eher*) ein gerätebezogener Kontext
- ODER die Sache läuft über FHEMWEB+allowed. Das wäre User-bezogen, so dass das ganze weder von einem bestimmten Browser noch von einem bestimmten Endgerät abhängt.

*Als "Krone" stelle ich mir eine Mischung von beidem vor. z.B. ein wakeword-ESP, der zwei unterschiedliche wakewords erkennt, eines für "rr_Frau", eines für "rr_Mann". Das wakeword-notify könnte dann via FULLY auf dem Endgerät entweder "fhem:8090" (user:"rr_Frau") oder "fhem:8091" (für den user "rr_Mann") laden und das Mikro öffnen. Das ganze dann noch mit passender Spracheinstellung, wenn rr_Frau z.B. gerne spanisch reden möchte?
Das neue Attribut sttProcessor für FULLY könnte man dann aufbohren, so dass für rr_Mann eine bestimmte RHASSPY-Instanz angesprochen wird, und für rr_Frau eine andere (oder Babble...)?

Zitat von: schwatter am 15 April 2026, 19:10:35@ahlermi hatte mir seinem systemPrompt geschickt.
Vermutlich sollte ich ihn mal per pm anpingen. Nach meinem Eindruck hat das ganze Potential, und es wäre schade, wenn man den Aufwand treibt, das Rad an manchen Stellen neu zu erfinden...
Einfaches Beispiel: Das mit "comment" finde ich sehr schwierig, weil ein allgemeines Attribut "mißbraucht" wird. Da ist es m.E. mittelfristig einfacher, spezielle Attribute einzuführen.
RHASSPY enthält ("geklaut" aus MQTT_GENERIC_BRIDGE) eine Grundstruktur, die man dafür m.E. mit ziemlich wenig Aufwand "recyclen" könnte.
Btw: es ist gepackaged, man muss also eigentlich nur an einigen wenigen Stellen (würde ohne commandref auf unter 20 Zeilen tippen!) was anpassen, um z.B: "gemini2" daraus zu machen ;) .
Server: HP-elitedesk@Debian 13, 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

schwatter

Nabend,

ich habe Piper in Text2Speech mit meinem Bluetooth-Lautsprecher funktionsfähig.

1. Lame
sudo apt-get install lame
2. Die angehängte 98_Text2Speech.pm nach Fhem
Folgende Attribute funktionieren oder wurden hinzugefügt.
attr TTS TTS_MplayerCall /usr/bin/mplayer -ao alsa:device=bluealsa -af resample=44100
attr TTS TTS_PiperModel /opt/piper/models/de_DE-thorsten-high.onnx
attr TTS TTS_Ressource Piper
attr TTS TTS_Speed -5


Schau mal rein. Für die Sprachausgabe ist Piper in der sub Text2Speech_Download($$$).
Damit nicht für jedes Wort eine MP3 erstellt wird, musste in der sub Text2Speech_PrepareSpeech($$)
der Text am Anfang noch vorbereitet werden. Bzw es werden Unterstriche hinzugefügt.

Gruß schwatter

Beta-User

Zitat von: schwatter am 16 April 2026, 22:12:44ich habe Piper in Text2Speech mit meinem Bluetooth-Lautsprecher funktionsfähig.
:) Cool!

Den Code schaue ich mir bei Gelegenheit an. Was mir nicht so richtig gefallen will: Man braucht nochmal eine Ladung Attribute...

Hat den Vorteil, dass man explizit erklären kann, wie es geht, im Prinzip sollten aber auch kleinere Änderungen bei https://svn.fhem.de/trac/changeset/29035/trunk/fhem/FHEM/98_Text2Speech.pm ausreichen. Man muss halt den piper-http-server spezifischen Call anpassen, das ist (leider) anders als bei maryTTS bzw. mimic3.
Hier der betreffende Änderungssatz:
https://svn.fhem.de/trac/changeset/29035/trunk/fhem/FHEM/98_Text2Speech.pm

Server: HP-elitedesk@Debian 13, 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

schwatter

Moin,

bei den Attributen habe ich nur TTS_PiperModel neu eingeführt. Das Model direkt per
Folder zu setzen finde ich sehr smart. Wenn man sich da aber auf kurz oder lang
festlegt, welches das Standardfolder ist, dann kann eine automatische Liste erzeugt
werden.
Die anderen Attribute sind schon im Modul vorhanden.

Gruß schwatter

Beta-User

Soweit ich das verstanden habe, sollte man Piper nicht - wie jetzt in deiner Modulfassung vorgesehen - per Kommandozeile aufrufen, sondern für schnelle Antworten als http-server laufen lassen.

(OT: der Weg über Text2speech kommt mir trotzdem wie ein unnötiger und komplizierter Umweg vor).
Server: HP-elitedesk@Debian 13, 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

schwatter

Ok,

jetzt verstehe ich, auf was du hinaus willst.

Gruß schwatter

Beta-User

Zitat von: schwatter am 17 April 2026, 12:52:59jetzt verstehe ich, auf was du hinaus willst.
:)

So langsam ist auch mir klar, wie die Teile in etwa zusammenspielen sollten, sorry, wenn das hier noch nicht so deutlich rüberkam:
Zitat von: Beta-User am 14 April 2026, 07:42:32Via https://curlconverter.com/javascript/ bin ich dann auf diesen Testcode gekommen:
Es geht also letztlich darum, auf der FHEM-Seite js-Code zu generieren, den man dann in einer bestimmten Instanz (derzeit) einer FHEMWEB-Verbindung browserseitig ausführen läßt. Der Code an sich soll sich
- selbständig bei einem (mehr oder weniger beliebigen) Server die Audio-File "on the fly" generieren lassen,
- diese dann abspielen, und
- am Ende ein "bin fertig mit deiner TTS-Anweisung" an FHEM zurückmelden... 

Der Testcode war erst mal dazu gedacht rauszufinden, wie der Code überhaupt grundsätzlich aussehen muss :) .

piper-tts (imo: vorrangig als http-Aufruf) in Text2Speech.pm einzubauen ist trotzdem kein Fehler. Ich würde das eben nur als "generischen" http-request coden wollen, um künftig einfacher Variablen ändern zu können, falls jemand wieder einen neuen (nicht maryTTS-kompatiblen) Servertyp ins Spiel bringt... (Mal sehen, das scheint ja doch grundsätzlich schon einigermaßen flexibel gewesen zu sein, was ich mir damals ausgedacht hatte).
Server: HP-elitedesk@Debian 13, 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

schwatter

#24
Moin,

nachdem ich erst bei der alten Project gelandet war und du mir dann den Link zur
neuen Repo gezeigt hättest, muss ich nochmal von vorne anfangen.  ::)
Problem, ich hatte einfach die Wheeldatei installiert. Auf dieser Basis dann die
Text2Speech angepasst. Aber in der Wheeldatei war nur die Bin. Kein Httpserver
auf Basis von Python. Männer halt, wenn sie ohne Bedienungsanleitung arbeiten.
;D

edit:
Und schon wieder liege ich halb falsch. Daher ignoriere mich einfach... Wenn ich per Wheel installiere
ist der HTTP_server da. Aber z.B flask fehlt. Daher gilt auch wieterhin. Um alle Pakete zu bekommen,
installieren wie in der Repo beschrieben.

root@ubuntufhem:/opt/piper/venv# find /opt/piper/venv -name "http_server.py"
/opt/piper/venv/lib/python3.12/site-packages/piper/http_server.py
root@ubuntufhem:/opt/piper/venv#

edit2:
Neuer sauberer Weg
# --- PIPER INSTALLATION ---

# 1. Verzeichnis vorbereiten
mkdir -p /opt/piper
chown fhem:dialout /opt/piper

# 2. Venv erstellen und installieren (als user fhem)
sudo -u fhem python3 -m venv /opt/piper/venv
sudo -u fhem /opt/piper/venv/bin/pip install --upgrade pip
sudo -u fhem /opt/piper/venv/bin/pip install piper-tts
sudo -u fhem /opt/piper/venv/bin/python3 -m piper.download_voices -m de_DE-pavoque-low

# 3. Service Datei erstellen (als root)
cat <<EOF > /etc/systemd/system/piper.service
[Unit]
Description=Piper TTS Server
After=network.target

[Service]
Type=simple
User=fhem
WorkingDirectory=/opt/piper
ExecStart=/opt/piper/venv/bin/python3 -m piper.http_server -m de_DE-pavoque-low --port 5000
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# 4. Service aktivieren und starten
systemctl daemon-reload
systemctl enable piper
systemctl start piper
systemctl status piper


Gruß schwatter

Beta-User

Zitat von: schwatter am 18 April 2026, 07:15:12Daher ignoriere mich einfach...
Ungern ;D .

Brauchst du denn jetzt noch eine Anleitung oder nicht? Ich hatte neulich auf Basis meiner hier geposteten Notizen auf einem Testsystem die Installation nochmal gemacht, und das hat da ohne größere Umstände funktioniert. Dabei habe ich die Installation erst mit meinem Standarduser gemacht, und dann danach die Rechte auf /opt/piper auf fhem:dialout geändert und in der systemd-unit-file fhem als User angegeben.


Zwischenzeitlich habe ich etwas mit dem Code von Text2Speech gespielt, leider nur mit Teilerfolgen:

define t2s Text2Speech none
attr t2s TTS_Ressource maryTTS
attr t2s TTS_User host='http://127.0.0.1:5000/' method=POST header='{ "Content-Type" => "application/json" }' body='{ "text": "$text" }'
attr t2s verbose 5

Der Code-Abschnitt im Modul (komplette Fassung anbei):
} elsif ( $TTS_Ressource eq 'maryTTS' ) {
    my $mTTSurl  = $TTS_User;
    my($unnamed, $named) = parseParams($mTTSurl);
    $named->{host}     //= shift @{$unnamed} // '127.0.0.1';
    $named->{port}     //= shift @{$unnamed} // '59125';
    $named->{lang}     //= shift @{$unnamed} // !$TTS_Language || $TTS_Language eq 'Deutsch' ? 'de_DE' : $TTS_Language;
    $named->{voice}    //= shift @{$unnamed} // 'de_DE/thorsten_low';
    $named->{endpoint} //= shift @{$unnamed} // 'process';
    #$named->{method}   //= shift @{$unnamed} // 'GET';

    if (defined $named->{method} && $named->{method} eq 'POST') {
        $mTTSurl = $named->{host};
    } else {
        $mTTSurl = "http://$named->{host}:$named->{port}/$named->{endpoint}?INPUT_TYPE=TEXT&OUTPUT_TYPE=AUDIO&AUDIO=WAVE_FILE&LOCALE=$named->{lang}&VOICE=$named->{voice}&INPUT_TEXT="; # https://github.com/marytts/marytts-txt2wav/blob/python/txt2wav.py#L21
        $mTTSurl .= uri_escape($text);
    }

    Log3( $hash->{NAME}, 4, "$hash->{NAME}: Hole URL: $mTTSurl" );
    my $param = {     url         => $mTTSurl,
                      timeout     => 5,
                      hash        => $hash,                # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
                      method      => $named->{method} // 'GET'     # POST can be found in https://github.com/marytts/marytts-txt2wav/blob/python/txt2wav.py#L33
                  };

    $param->{header} = $named->{header} if defined $named->{header};
    if (defined $named->{body}) {
        $named->{body} =~ s{(\$\w+)}{$1}eegx;
        $param->{body} = $named->{body};
       
      Log3($hash->{NAME}, 3, "$hash->{NAME} body: $param->{body}, header: $param->{header}");

    }

    my ($maryTTSResponseErr, $maryTTSResponse) = HttpUtils_BlockingGet($param);

    if(length($maryTTSResponseErr) > 0) {
      Log3($hash->{NAME}, 3, "$hash->{NAME}: Fehler beim Abrufen der Daten von $TTS_Ressource: $maryTTSResponseErr");
      return;
    }

    my $FileWav2 = $file . '.wav';
    my $fh2 = new IO::File ">$FileWav2";
    if ( !defined $FileWav2 ) {
      Log3($hash->{NAME}, 2, "$hash->{NAME}: wav Datei <$FileWav2> konnte nicht angelegt werden.");
      return;
    }

    $fh2->print($maryTTSResponse);
    Log3($hash->{NAME}, 4, "$hash->{NAME}: Schreibe wav in die Datei $FileWav2, Bytes: ".length $maryTTSResponse);
    close $fh2;
    $cmd = qq(lame "$FileWav2" "$file");
    Log3($hash, 4, "$hash->{NAME}:$cmd");
    system $cmd;
    return unlink $FileWav2;
  }
Irgendeine Kleinigkeit paßt noch nicht, vermutlich im Header (ich habe einige Versionen durch, muss jetzt aber auch mal was anderes machen)? Jedenfalls will HttpUtils_BlockingGet() eigentlich einen Endpunkt haben, und via curl bekomme ich auch mit dem ersten slash eine wav:
curl -X POST -H 'Content-Type: application/json' -d '{ "text": "thorsten sagt jetzt mal wieder etwas an" }' -o test.wav localhost:5000/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 84577  100 84524  100    53   228k    146 --:--:-- --:--:-- --:--:--  228k
oder
curl -X POST -H 'Content-Type: application/json' -d '{ "text": "thorsten sagt wieder etwas an" }' -o test.wav http://localhost:5000/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 69719  100 69676  100    43   317k    200 --:--:-- --:--:-- --:--:--  318k
Server: HP-elitedesk@Debian 13, 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

Jetzt habt Ihr mich irgendwo abgehängt.

Was ist denn jetzt das Ziel - STT oder TTS?

Für STT benutze ich immer noch meine Android-Tablets mit Automagic - das kann ich dank Google Backup auch auf neuen Geräten installieren. Auf den Tablets läuft aber auch überall Fully.

Für TTS baue ich entweder in FHEM mit Hilfe von Amazon Polly neue MP3s zusammen, sende diese per Automagic an die Tablets (oder andere Geräte) und spiele sie ab. Oder nutze die TTS-Fähigkeit der Tablets selbst, weil ich mir auch hier die inzwischen > 10 Jahre alte Sprachbibliothek gesichert habe, die Amazon Polly verwendet. Also sprechen alle meine Devices mit derselben Stimme, das hat sich als wichtig herausgestellt.

Einzig unzufrieden bin ich mit der Wakeword detection, die über RHASSPY  läuft.

Vielleicht könnte einer von Euch mal (gerne auf Papier) eine Skizze produzieren, welche Komponenten und Abläufe jetzt hier diskutiert werden.

LG

pah

Beta-User

#27
Zitat von: Prof. Dr. Peter Henning am 18 April 2026, 11:57:17Was ist denn jetzt das Ziel - STT oder TTS?
Ich komme von:
Zitat von: Beta-User am 03 April 2026, 11:24:46Mein Ausgangspunkt war eigentlich, das FULLY-Modul so zu erweitern, das es mit RHASSPY in Punkto Sprachein- und -ausgabe so zusammenarbeitet, wie das vorher mit AMAD möglich gewesen war, insbesondere also interaktive Dialoge möglich sind. Wie es im Moment aussieht, braucht es dafür aber auch einiges an javascript, so dass es letztlich (fast) völlig egal ist, welchen Browser man verwendet...
Stand JETZT funktioniert das insoweit, dass die TTS- und STT-Fähigkeiten des Handys wie beschrieben genutzt werden können, wenn man als Browser Chrome verwendet.

Letztlich ist meine Vision, (aus User-Sicht betrachtet) funktional (im Moment: bis auf die "lokale" STT-Fähigkeit) einen vollwertigen Rhasspy-Satelliten zu basteln, wobei technisch am Ende* vom Rhasspy-Framework letztlich nur die intent-Erkennung und Teile des session-Managements weiter genutzt werden, den Rest erledigt RHASSPY.

Was ich letztlich loswerden will: Sämtliche Abhängigkeiten von veralteten "Bauteilen" (wie automagic oder Polly-TTS-Engine), bei denen man nie weiß, wie lange es funktioniert. Ganz am Ende* ist auch das Rhasspy-Framework in diesem Setup ohne weiteres gegen eine andere Intent-Erkennung austauschbar, mir schwebt was auf rivescript-Basis vor, ohne dass das irgendwie schon konkretere Formen angenommen hätte.

Was dazu als nächstes ansteht, wäre die Option, einen mehr oder weniger beliebigen (eigenen und lokal laufenden) TTS-Server mit der Generierung der Audios zu beaufschlagen, das ganze möglichst per direktem js-Aufruf. Da mir das aber im Moment zu viele Zwischenschritte sind, versuche ich das mit piper+Text2Speech (notgedrungen halt incl. dem Umweg über lame, damit es "modulkonform" ist).

Ist das Bild jetzt auch ohne Zeichnung klarer?

OT:
Zitat von: Prof. Dr. Peter Henning am 18 April 2026, 11:57:17Einzig unzufrieden bin ich mit der Wakeword detection, die über RHASSPY  läuft.
RHASSPY ist bzgl. Wakeword nur ein "Makler-Device", die Unzufriendenheit müßte sich demnach auf einen Rhasspy-Satelliten beziehen?
Was das Thema angeht, bin ich nach wie vor eher Nutzer klassischer Buttons am Handy, von daher habe ich eher noch Wünsche in Richtung der Bedienbarkeit/Konfigurierbarkeit der neuen f18.js-Funktionen.
Server: HP-elitedesk@Debian 13, 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

Zitat von: Beta-User am 18 April 2026, 12:19:12Ist das Bild jetzt auch ohne Zeichnung klarer?
So halb. Meine Rivescript-Dateien steuere ich gerne bei, Rivescript ist bei mir ja dem Babble-Modul nachgeschaltet.

Natürlich wird das Wakeword nicht von Rhasspy selbst erkannt, sondern ich nutze darauf MycroftAI Precise, selbst trainiert. Das ist allerdings jetzt auch schon ein paar Jahre alt und wird nicht weiter entwickelt. Darum habe ich ja auch nach dem Atom Echo gefragt.

Ich habe gerade ein Buchmanuskript fertig, und darum hoffentlich etwas mehr Zeit, damit kann ich dann also mal spielen.


LG

pah

Beta-User

Zitat von: Prof. Dr. Peter Henning am 18 April 2026, 14:06:22hoffentlich etwas mehr Zeit
Dann mal willkommen an Bord!

ZitatSo halb.
Nun ja, das hier ist "work in progress", bei mir ist es auch so, dass da auch zunächst eine eher vage Vorstellung davon da war, dass das mit dem "voicebutton" als Erbe von "FHEM-WebViewControl" (wie im Wiki noch dargestellt) doch heutzutage keine große Sache sein sollte und man damit einen einfachen RHASSPY-Satelliten generieren kann.

Alles andere kristiallisiert sich erst mir der Zeit raus, leider teils mit Irrwegen und Missverständnissen. Jetzt ist vieles zum Glück schon funktional, aber vermutlich wird es weiter so sein, dass sich die Vorgehensweise an die Kenntnis dessen anpassen wird, was denn möglich ist...
ZitatMeine Rivescript-Dateien steuere ich gerne bei, Rivescript ist bei mir ja dem Babble-Modul nachgeschaltet.
Habe vor einiger Zeit mal ein paar der Threads zu rivescript durchgesehen, aber im Moment nicht viel mehr wie die vage Vorstellung, dass man RHASSPY damit eigentlich relativ leicht dahin umbauen können sollte, dass es mit einer "sentences.ini" (mehr oder weniger mit der von Rhasspy her bekannten Syntax) rivescript aufrufen kann, um den "intent-json" zu generieren, dabei intents zu (de-) aktivieren, "slots" füllen usw..

Babble habe ich mir auch kurz angeschaut, aber irgendwie kam mir das nicht wie ein adäquater Ersatz für RHASSPY vor. Mag sein, dass ich mich da täusche. Jedenfalls: FULLY kann man ohne großes Aufhebens so konfigurieren, dass es Babble_DoIt() mit dem erkannten Text aufruft (wenn fully als Browser verwendet wird). Um den Rückweg für die response muss man sich dann natürlich selber kümmern :) .
Server: HP-elitedesk@Debian 13, 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