[Modul] Text to Speech (AWS Polly)

Du kannst einfach die TTSAWSPOLLY_GenerateFile Funktion nutzen. Die generiert alles auf /tmp, welches nach einem Neustart zwar wieder weg ist, aber zumindest bis dahin alles gecached hält.

paresy

Lautet dann der Verzeichnispfad für die Symbox so?:

http://192.168.1.50:3777/user/tmp/

Also beispielhaft dann im Skript:
SNS_PlayFiles(55511, ‚[„http://192.168.1.50:3777/user/tmp/polly_test.mp3“]‘, ‚0‘);

Ich bekomme aktuell noch die Meldung, das der Pfad falsch ist und er nichts findet.

Danke im Voraus.

Ich muss erneut in die Runde fragen und um Hilfe bitten:

Ich möchte die Sprachfunktion mit Polly auf der Symbox nutzen. Die Module und Instanzen sind erfolgreich installiert. Aktuell nutze ich die Instanz Durchsage um z. B. ein Klingeln zu kommunizieren. Nun würde ich aber gerne mehr Dynamik reinbekommen und das ganze per Skript lösen, so wie es hier diverse Male umgesetzt wurde. Ich kann die mp3 Datei erstellen, habe aber Probleme beim Ablegen und Abspielen durch Sonos. Ich hoffe nun hier auf Hilfe.

Aktuell ist mein Stand wie folgt:

$Text = "Dies ist ein Test!";

echo $Text;

$file = TTSAWSPOLLY_GenerateFile(13156, $Text);

echo $file;

//copy ($file, "http://192.168.1.50:3777/user/tmp/mp3_file.mp3");

SNS_PlayFiles(55511, json_encode(Array($file)), 35);

Das Echo des $file gibt folgendes zurück:

/tmp/awspolly_13156/Marlene__00ed2aa822db3687d931286781c51e9d.mp3

daher denke ich, ist die mp3 korrekt erzeugt wurde. Am Rest scheitere ich aktuell!

Rückmeldung von Ip-Symcon:
Fatal error: Uncaught Exception: Instance does not implement this function in /mnt/data/symcon/scripts/__generated.inc.php:250
Stack trace:
#0 /mnt/data/symcon/scripts/29327.ips.php(48): SNS_PlayFiles(55511, ‚["\/tmp\/awspol…‘, 35)
#1 {main}
thrown in /mnt/data/symcon/scripts/__generated.inc.php on line 250

Für Hilfe wäre ich sehr dankbar.

Kennt sich denn keiner mit den Pfaden der Symbox aus? Oder kann mir weiter helfen?

Die Pfade der Symbox helfen dir nicht.
Weil Sonos kann ja nicht auf das interne Dateisystem der Symbox zugreifen. Die Player müssen die Datei über das Netzwerk laden können, und dazu darf die Datei nicht im temp liegen.

Wie es mit dem Polly Modul von @Kugelberg (und nicht dem Polly Modul von Symcon) funktioniert ist übrigens im Sonos Thread beschrieben.
Michael

Du könntest es theoretisch in den WebFront User Ordner kopieren. Dieser ist dann entsprechend erreichbar. Coole wäre es auch das Polly Modul über einen WebHook zu erweitern, womit man z.B. on-the-fly Texte generieren kann und an das Sonos Modul weiterleiten könnte. Da habe ich nur aktuell keine Zeit für.

paresy

Bei dem Thema Polly, Sprachdurchsage, mp3, … schwirren bei mir immer noch viele Fragezeichen bei mir rum. Das Thema ist durchaus Interessant aber hängt für mich leider immer noch in einer grauen Wolke. :confused:
Ich befürchte das du mit deinen Schlagwörtern den User @michelsaarn , der sich dieses Jahr hier angemeldet hat, überforderst und weitere Fragezeichen erzeugst. Bei mir hast du zumindestens mit WebHook ein weiteres erzeugt.

Vielen Dank für die Hinweise und das Verständnis. Ich werde dann mal versuchen im Sonos-Thread die Lösung zu finden. Der ist mittlerweile auch sehr umfangreich geworden.

@Brainpurge Dein Skript läuft aber auf einem WIN-Server oder? Nicht auf einer Symbox?

Danke im Voraus.

Docker aus einem SynNas

Hallo,
habe nach langer Zeit mal wieder versucht Polly zum laufen zu bringen. Ich wollte einen neuen Benutzer bei Amazon IAEM anlegen bekomme aber keinen Secret Key!! Mit den im Forum abgebildeten Hardkopien komme ich nicht weiter da sich wohl einiges geändert hat. Kann / mag mir einer mal behilflich sein und mir unter die Arme greifen??

Kannst du mal ein Bild machen wo du genau was erstellt hat? Beim Erstellen des Nutzers kannst du eigentlich direkt den SecretKey abgreifen.

paresy

Hallo Michael,
beim erstellen der Bilder bin ich über Seiten gestolpert die bisher nicht veröffentlicht waren. Ich habe einfach mal geraten und wohl die richtigen Antworten angeklickt. Es hat laut beigefügtem Ausdruck nun geklappt.
Vielen Dank für die Nachfrage.

Wenn ihr wollt, könnt ihr den Ausdruck auch veröffenlichen.

Alfred

Michael Maroszek via IP-Symcon Community office@symcon.de hat am 12.03.2023 21:49 CET geschrieben:

paresy (Profil - paresy - IP-Symcon Community) Administrator
12. März
Kannst du mal ein Bild machen wo du genau was erstellt hat? Beim Erstellen des Nutzers kannst du eigentlich direkt den SecretKey abgreifen.
paresy

Rufe das Thema auf ([Modul] Text to Speech (AWS Polly) - #52 von paresy) oder antworte auf diese E-Mail, um zu antworten.
Um diese E-Mails abzubestellen, klicke hier (IP-Symcon Community).

… Adresse gekürzt …

WRA0058.pdf (641 KB)

Hallo zusammen, ich habe soeben das „Text to speech (AWS Polly)“ Modul aus dem Store installiert. Wenn ich nun auf die erstellte Instanz zugreifen möchte bekomme ich sofort eine Fehlermeldung in rot die wie folgt aussieht:

Konnte Konfigurationsform nicht laden
Fatal error: Uncaught TypeError: method_exists(): Argument #1 ($object_or_class) must be of type object|string, array given in /mnt/data/symcon/modules/.store/de.symcon.ttsawspolly/libs/vendor/guzzlehttp/promises/src/RejectedPromise.php:16
Stack trace:
#0 /mnt/data/symcon/modules/.store/de.symcon.ttsawspolly/libs/vendor/guzzlehttp/promises/src/RejectedPromise.php(16): method_exists(Array, ‚then‘)
#1 /mnt/data/symcon/modules/.store/de.symcon.ttsawspolly/libs/vendor/aws/aws-sdk-php/src/Handler/GuzzleV6/GuzzleHandler.php(56): GuzzleHttp\Promise\RejectedPromise->__construct(Array)
#2 /mnt/data/symcon/modules/.store/de.symcon.ttsawspolly/libs/vendor/guzzlehttp/promises/src/Promise.php(203): Aws\Handler\GuzzleV6\GuzzleHandler::Aws\Handler\GuzzleV6{closure}(Object(GuzzleHttp\Exception\ClientException))
#3 /mnt/data/symcon/modules/.store/de.symcon.ttsawspolly/libs/vendor/guzzlehttp/promises/src/Promise.php(156): GuzzleHttp\Promise\Promise::callHandler(2, Object(GuzzleHttp\Exception\ClientException), Array)
#4 /mnt/data/symcon/modules/.store/de.symcon.ttsawspolly/libs/vendor/guzzlehttp/promises/src/TaskQueue.php(47): …

Die Meldung ist noch um einiges länger…
Kann mir jemand sagen woran das liegen könnte oder was ich falsch mache ?

Scheint ein 7.0 Problem zu sein. Schaue ich mir an.

paresy

ok super, besten Dank :blush:

Hallo Paresy,

kurz zur Info. Hab beim Benachrichtigungsmodul genau das selbe Problem.

beim installieren der Module hat sich die jeweilige Instanz noch geöffnet. Beim speichern kam dann die Fehlermeldung. Möchte ich sie jetzt über den Objektbaum öffnen bekomme ich gleich die Fehlermeldung.

Im Store gibt es jetzt die Beta 1.3. Damit sollte es wieder gehen.

paresy

Alles klar, besten Dank :slightly_smiling_face:

Hallo,

hat sich mit IPS 7.0 irgendetwas am Pfad gewechselt?

Das Modul erstellt mit meine wav-Datei nicht mehr mit dem Zitat des Tages aus em Almanach-Modul.

Warning: rename(/tmp/awspolly_10007/Marlene__29ac6d3ec6f062b4aa608d9c33249bce.wav,/var/lib/symcon/webfront/user/polly/bdquospielen_ist_eine_tatigkeit_die_man_gar_nicht_ernst_genug_nehmen_kannldquo_-_jacques-yves_cousteau.wav): Datei oder Verzeichnis nicht gefunden in /var/lib/symcon/scripts/58304.ips.php on line 15

Weißt da jemand etwas? Geändert habe ich bis auf das Update auf IPS 7 nichts.

<?php

declare(strict_types=1);
$text = getValue(57090);  
$mp3Filename = replace_chars($text) . '.wav';

$URL1 = 'http://192.168.178.140:3777/user/polly/';
$URLVariable = $URL1 . $mp3Filename ;
RequestAction(12492, $URL1 . $mp3Filename);

$file     = TTSAWSPOLLY_GenerateFile(10007, $text);
$filename = IPS_GetKernelDir() . 'webfront' . DIRECTORY_SEPARATOR . 'user' . DIRECTORY_SEPARATOR . 'polly' . DIRECTORY_SEPARATOR . $mp3Filename;

rename($file, $filename);

//echo sprintf('File: %s, FileName: %s', $file, 'http://192.168.178.140:3777/user/polly/' . $mp3Filename);

//-----------------------------------------------

// siehe hier: https://stackoverflow.com/questions/10444885/php-replace-foreign-characters-in-a-string
function replace_chars($fileSyntax)
{
    return strtolower(
        preg_replace(
            [
                '/&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);/i',
                "/[^a-zA-Z0-9\s-]/i",
                "/\s+/"
            ],
            [
                '$1', // remove foreign character accents
                '', // remove anything that's not alphanumeric, hyphen or a space
                '_' // replace space with underscore 
            ],
            htmlentities($fileSyntax, ENT_QUOTES, 'UTF-8')
        )
    );
}