"Wenn...dann... Sprachausgabe via Amazon AWS auf Sonos" - Verständnisfrage

Hallo zusammen,

ich bin sowohl hier im Forum als auch bei IPS komplett neu.
Was ich vermisse ist ein Handbuch für Einsteiger, z.B. auch eben mit Beispielen.
Ohne so ein Handbuich seh ich wahrscheinlich den Wald vor lauter Bäume nicht und meine Fragen sind/klingen doof.

Was ich für meinen Einstieg suche sich der Leitfaden zur Vorgehensweise für dieses Szenario (ein Beispiel):

Um 6:00 Uhr morgens das Licht einschalten (das bereits klappt einwandfrei) und zusätzlich dazu per Sprachausgabe (Polly >> Sonos) z.B. „Guten morgen“. Klasse wäre auch noch die Außentemperatur (Sensorwert ist vorhanden).

Ich habe Polly installiert, Sonos ist auch integriert. Nur zum sprechen bringe ich das Dingen nicht.
Hat vielleicht irgendjemand da draußen ein Beispielscript, anhand dessen ich u.a. auch dazulernen kann. Alle bisher angestrengte Suche hier im Forum bracht mich „eher mehr in den Wald“ als dass es mit half. Vielleicht hab ich ja Glück und mein rufen wird erhört :):).

Gruß
Rembrandt

Sorry, es gibt eine Doku mit vielen Beispielen und eine Suchfunktion.
Selbst nutze ich keine Sprachausgabenspielerei aber ich fand bei der Forensuche, die ich dann gleich mal testete, sogar ein Modul mit AWS Polly Modul (TTS).

Wenn das nicht hilft, dann einfach mal konkret fragen, was genau getestet wurde und was daran nicht funktioniert.

Gesendet von iPhone XS mit Tapatalk

Das mit der Sprachausgabe hatte ich in den letzten Tagen auch auf dem Schirm.
Hast du dich bei „Amazon AWS“ angemeldet? Ansonsten kommen dann immer Fehlermeldungen, von wegen Keys.
Vielleicht kannst du das andere TTS Modul nutzen, denn bei Amazon läuft es meines Erachtens nach einem Jahr auf monatliche Kosten hinaus. So habe ich das jedenfalls herausgelesen. Und für 20 $ (oder €) im Monat wäre mir Spass dann doch zu teuer.

Ich habe gerade gesehen, dass das andere TTS Modul nur unter Windows läuft.
https://www.symcon.de/service/dokumentation/modulreferenz/text-to-speech/

Nu pfurren Sie hier mal nicht gleich so herum, sorry wenn jemand bei etwas neu ist und Fragen hat. Entschuldigung dass es mich gibt… Herr Boui! Und Ihre persönliche Wertschätzung „Sprachausgabenspielerei“ können Sie gerne bei sich behalten. Diese ganze Hausautomation ist sogesehen Spielerei, von daher. Solche verstecktren Belehrungen müssen nicht sein. Thema damit durch.

Den Post mit AWS Polly hab ich auch gelesen, mehrfach. Wenn man IPS seit langem nutzt kommt man damit sicherlich klar, als Neuling halt eben nicht.

Es gibt 2 Funktionen:
POLLY_getMP3(InstanceID; Text);
Hier kommt der inhalt des MP3 zurück und kann nach belieben weiterverarbeitet werden.
POLLY_saveMP3(InstanceID; Text);

Schön, nur damit kann ich als Neuling halt nichts anfangen. WAS muss denn WO hin kopiert werden? Das sind eben alles Dinge die in keiner Dokumentation so beschrieben sind dass auch der Neuling „Halt“ darin findet.

Ja bei AWS habe ich ein Konto und das läuft auch, auch das Modul meckert nicht. Alle Keys sind richtig eingetragen und funktionieren. Nur den Spagat, dass ich einen Text rüber schicke der dann auf Sonos ausgegeben wird, den kriege ich leider nicht hin.

Das hat gar nix mit belehren zu rund. Es nervt ohne Ende, wenn man leider immer wieder diese Art der Beiträge liest und dann x-fach nachhaken muss, bis dann mal was handfestes kommt, um das Problem nachzuvollziehen.
Hauptsache gleich mal losheulen.

Gesendet von iPhone XS mit Tapatalk

Im ModuleStore gibt es ein weiteres Polly-Modul „Text To Speech (AWS Polly)“. Mit diesem sollte es möglich sein, per TTSAWSPOLLY_GenerateFile eine Datei zu generieren und diese dann per SNS_PlayFiles an das Sonosmodul weiterzugeben. Vielleicht ist es auch mit dem anderen Polly-Modul möglich, da müsstest du die Möglichkeiten selber prüfen.

Hast du bereits irgendetwas an Skript probiert? Wenn ja, poste dies gerne hier, dann können wir uns das hier gerne anschauen und mögliche Probleme aufzeigen und lösen. Insgesamt erfordert die anvisierte Lösung ein wenig Kenntnis in PHP.

Dieses Modul aus dem Store habe ich installiert, von dort stammt auch das Sonos Modul. Beide Module erscheinen auch in der IPS-Ansicht (siehe Screenshot).

Scripte habe ich mehrere Fundstücke aus dem Forum probiert, alle negativ, mit endlos vielen Fehlermeldungen usw. Habe ich alle wieder verworfen. Im Augenblick ist das Problem, dass ich mit solchen Aussagen wie

Es gibt 2 Funktionen:
POLLY_getMP3(InstanceID; Text);
Hier kommt der inhalt des MP3 zurück und kann nach belieben weiterverarbeitet werden.
POLLY_saveMP3(InstanceID; Text);

wie aus diesem Post nichts anfangen kann, weil mir quasi der rote Faden fehlt, diese Aussage setzt schion ein Wissen voraus das ich im Moemnt so noch nicht habe weil IPS für mich neu ist. Mit anderen Worten, mir fehlt ein Anschauungsprojekt anhand dessen ich dann die Zusammenhänge besser verstehen und lernen kann. PHP ist nicht unbekannt für mich, aber ich bin kein Programmierer… ohne einen Leitfaden am Anfang tu ich mich eben schwer, sorry.

Diese getMP3 und saveMP3, wo kommen die her, wo müssen die hin? All das sind momentan meine Probleme. Auch die IDs die in den Script angegeben sind, mir ist klar wo ich diese finde, wenn aber meine Datei z.B. nicht genauso heißt wie die im Forum genannte, dann finde ich den Zusammenhang eben nicht. Und so wird das nie was…

Im Moment habe ich die Testversion laufen um eben so gucken wer wie wo was. Denn wenn Geld fällig wird für eine Sache ist das für mich nur dann ok, wenn ich auch klar komme damit…250 € sind ja nicht nichts um am Ende auf der HDD zu versauern.

sonos1.jpgsonos2.jpgsonos3.jpg

Die Erörterung, die du gepostet hast, kommen von einem anderen Polly-Modul. Daher können die Funktionen aktuell gar nicht funktionieren.

Als Codeschnipsel könntest du ja mal folgendes in einem Skript ausprobieren:


$fileName = TTSAWSPOLLY_GenerateFile(12345 /* Hier die ID der Polly Instanz einfügen */, 'Dies ist ein Test');
echo $fileName; // Dies gibt nur den Dateinamen aus. Wenn das Skript nicht funktioniert, dann kannst du mal schauen, ob du dort eine passende mp3 findest. Wenn alles klappt, kannst du die Zeile löschen
SNS_PlayFiles(23456 /* Hier die ID der Sonos Instanz eingeben */, [ $fileName ], "0");

Ich bin nicht sicher, ob die Funktionen so funktionieren, aber so würde ich es aus den entsprechenden Dokumentationen vermuten. Die Dokus zu den Modulen und damit auch die Erörterung der verwendeten Funktionen findest du hier und hier

Es scheint eine mp3 generiert zu werden, nur landet die „irgendwo“. So ganz daneben ist es ja nicht :slight_smile: . Danke

Ich habe eben dieses Polly Modul gefunden… im Store.

Fehlermeldung:

/tmp/awspolly_28116/6cddeb6a2f0582c82dee9a38e3f035d7.mp3
[b]Fatal error[/b]:  Uncaught TypeError: Argument 1 passed to  Sonos::PlayFiles() must be of the type string, array given, called in  /var/lib/symcon/scripts/__generated.inc.php on line 211 and defined in  /var/lib/symcon/modules/SymconSonos/Sonos/module.php:515 Stack trace: #0 /var/lib/symcon/scripts/__generated.inc.php(211):  Sonos->PlayFiles(Array, '0') #1 /var/lib/symcon/scripts/35936.ips.php(6): SNS_PlayFiles(46443, Array,  '0') #2 {main}   thrown in [b]/var/lib/symcon/modules/SymconSonos/Sonos/module.php[/b] on line [b]515[/b]

Die Dokumentation zum Sonos Modul ist nicht aktuell. Es wird seit Version 1.7 kein Array mehr erwartet sondern ein String.

Richtig lauten muss es also:


SNS_PlayFiles(46443 /* Hier die ID der Sonos Instanz eingeben */, json_encode([ $fileName ]), "0"); 

Werte kann man auslesen wenn man nur den Wert haben will mit GetValue. Wenn man sich das vorlesen lassen will und nicht damit rechnen, macht es Sinn den Wert so auszulesen wie es das Variablenprofil vorgibt, d.h. bei Temperatur eben mit Einheit °C ebenso wie bei der Luftfeuchtigkeit dann mit Einheit Prozent, dazu nutzt man GetValueFormatted.

Wenn man die Werte ausgelesen hat kann man diese zu einem Text zusammen setzten der dann vorgelesen werden soll, dazu nutzt man z.B. die Funktion sprintf.


<?php
$temperature = GetValueFormatted(28294);
var_dump($temp);
$humidity = GetValueFormatted(39676);
var_dump($humidity);

$text = sprintf('Es sind im Wohnzimmer %s bei einer Luftfeuchtigkeit von %s', $temperature, $humidity);
var_dump($text);

Dazu ist dann zusätzlich in dem Skript, das den Text generiert, auch das Gerät zu schalten mit RequestAction
Das zyklische Ereignis sieht dann z.B. so aus:

Ich habe es jetzt mit Deiner Variante versucht, dies führt zu folgender Fehlermeldung:

/tmp/awspolly_28116/6cddeb6a2f0582c82dee9a38e3f035d7.mp3
Fatal error:  Uncaught Exception: File (/tmp/awspolly_28116/6cddeb6a2f0582c82dee9a38e3f035d7.mp3) has to be located on a Samba share (e.g. //ipsymcon.fritz.box/tts/text.mp3) or a HTTP server (e.g. http://ipsymcon.fritz.box/tts/text.mp3) in /var/lib/symcon/modules/SymconSonos/Sonos/module.php:570
Stack trace:
#0 /var/lib/symcon/scripts/__generated.inc.php(211): Sonos->PlayFiles('["\\/tmp\\/awspol...', '0')
#1 /var/lib/symcon/scripts/35936.ips.php(8): SNS_PlayFiles(46443, '["\\/tmp\\/awspol...', '0')
#2 {main}
  thrown in /var/lib/symcon/modules/SymconSonos/Sonos/module.php on line 570

Mir ist klar dass irgendwo auf den falschen Pfad verwiesen wird, nur wo wird der „richtige“ Pfad eingetragen?
Hat das ggf. etwas damit zu tun, dass Du hier von einer Version 1.7 sprichst, ich hier aber nur eine Version 1.07 habe?


Auf der Jagd nach dem Fehler bedanke ich mich jedenfalls vielmals für Deine ganzen Ausführungen, auch die hier jetzt nicht genannten. Denen widme ich mich in jedem Fall später… wenn denn Sonos mal sprechen gelernt hat :cool:

Ich wandele mir den Text mittels Polly so:


$fileName = TTSAWSPOLLY_GenerateFile($id_tts, GetValue($id_text));

oder

$fileName = TTSAWSPOLLY_GenerateFile($id_tts, "Dies ist ein Test.");

und dann deine Weiterleitung an Sonos:

SNS_PlayFiles(46443 /* Hier die ID der Sonos Instanz eingeben */, json_encode([ $fileName ]), "0");

Dann sollte auch dein Sonos mit zurechtkommen.

Nein das geht nicht!
Die Fehlermeldung von sonos sagt auch warum.
Die Datei muss auf einem Samba Share liegen.
Cool wäre es, die ganzen TTS Module über einen Webhook anzusprechen.
Dann könnte man direkt eine URL mit Text an z.b. Sonos oder auch die SqueezeBox übergeben.
Michael

Du musst aufpassen das Du nicht Sachen vermischt, denn hier ist im Thread ist teilweise von unterschiedlichen Polly Modulen die Rede.
Wenn Du wie ursprünglich POLLY_getMP3 benutzten willst funktioniert das so:

MP3 File generieren:


$temp_office = GetValueFormatted(28294);
$hour = date("H", time());
$minute = date("i", time());
$seconds = date("s", time());

$string_time = $hour.":".$minute;
$text = "Es ist ".$string_time.". Im Büro ist die Temperatur bei ".$temp_office;
$mp3 = POLLY_getMP3(20041, $text);

Jetzt kannst Du Dir überlegen ob Du das MP3 direkt weiter nutzt oder aber es auf einer Festplatte ablegst. Für Sonos speicherst Du das MP3 File jetzt an einem Ort auf den Du per HTTP zugreifen kannst.


$filename = IPS_GetKernelDir()."webfront".DIRECTORY_SEPARATOR."user".DIRECTORY_SEPARATOR."polly".DIRECTORY_SEPARATOR."polly_test.mp3";
file_put_contents($filename, $mp3);

Hiermit wird das vorher generierte MP3 File im User Ordner von IP-Symcon abgelegt.

Jetzt kannst Du das MP3 File abspielen z.B. mit Sonos


SNS_PlayFiles(28191, '["http://192.168.55.10:3777/user/polly/polly_test.mp3"]', '0');

Die IP Adresse ist die Adresse von dem Rechner auf dem IP-Symcon läuft, den Filenamen haben wir oben (s.o.) festgelegt.

Alles zusammen sieht das also so aus zum ausprobieren, die IP Adresse von IP-Symcon und die Objekt ID der Variable und der Polly Instanz und Sonos Instanz sind anzupassen.


<?php
$temp_office = GetValueFormatted(28294);
$hour = date("H", time());
$minute = date("i", time());
$seconds = date("s", time());

$string_time = $hour.":".$minute;
$text = "Es ist ".$string_time.". Im Büro ist die Temperatur bei ".$temp_office;
$mp3 = POLLY_getMP3(20041, $text);

$filename = IPS_GetKernelDir()."webfront".DIRECTORY_SEPARATOR."user".DIRECTORY_SEPARATOR."polly".DIRECTORY_SEPARATOR."polly_test.mp3";
file_put_contents($filename, $mp3);
SNS_PlayFiles(28191, '["http://192.168.55.10:3777/user/polly/polly_test.mp3"]', '0');  

Und mit dem Symcon Polly-Modul geht das auch :slight_smile:


<?php
$temp_office = GetValueFormatted(28294);
$hour = date("H", time());
$minute = date("i", time());
$seconds = date("s", time());

$string_time = $hour.":".$minute;
$text = "Es ist ".$string_time.". Im Büro ist die Temperatur bei ".$temp_office;
$mp3= base64_decode(TTSAWSPOLLY_GenerateData(20041, $text));
$filename = IPS_GetKernelDir()."webfront".DIRECTORY_SEPARATOR."user".DIRECTORY_SEPARATOR."polly".DIRECTORY_SEPARATOR."polly_test.mp3";
file_put_contents($filename, $mp3);
SNS_PlayFiles(28191, '["http://192.168.55.10:3777/user/polly/polly_test.mp3"]', '0');  

Ungetestet, aber eigentlich ist nur der Befehl etwas anders:


$mp3= base64_decode(TTSAWSPOLLY_GenerateData(20041, $text));

Michael

Da ist wahrscheinlich auch ein Haken zu suchen warum es nicht funzt… als Anfänger unterwegs und dazu dann nicht mehr gültige Beschreibungen, Dateien die es doppelt gibt usw… da ist er wieder der Wald und die vielen Bäume.:confused::slight_smile:


Bringt auch die Fehlermeldung mit dem Pfad…
Meine größte Frage diesbezüglich ist… wo kann ich den einstellen, festlegen oder was auch immer…?


Das mit dem $temp_office = GetValueFormatted(28294); bzw. der 28294 ist mir klar, da gehört mein Temp-Sensor rein. Das mit der http:// Adresse ist klar, IP anpassen… nur das eben mit dem Pfad ist bisher schleierhaft. Ein großes Fragezeichen steht auch hinter dem hier

$mp3= base64_decode(TTSAWSPOLLY_GenerateData(20041, $text));

Wo kommt die 20041 her bzw. wo finde ich heraus welche Nummer das bei mir sein soll. Das macht es mir im Augenblick so schwer diese Codezeilen die quer verteilt sind zu verstehen. Klar, ein „alter Hase“ geht da nicht näher darauf ein… aber als Jungfuchs ist das ein großer Stolperstein