[Modul] Text to Speech (AWS Polly)

Schau mal hier: [Modul] Text to Speech (AWS Polly) - #24 von paresy

Ich habe gerade eine Beta hochgeladen, welche Unterstützung für SSML hinzufügt.

paresy

Danke, hatte ich nicht gesehen.
Werde ich testen

Hallo,

kann jemand einem Laien wie mir erklären, was ich mit AWS Polly anstelle?

Eingerichtet habe ich es, allerdings wie erzeuge ich jetzt damit die Files. IPS läuft per Docker auf einem Synology-Nas.

<?php

declare(strict_types=1);

$text        = 'Dies ist ein Test. Nicht schlecht Herr Specht.';
$mp3Filename = replace_chars($text) . '.mp3';

$file     = TTSAWSPOLLY_GenerateFile(54904, $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);

//SNS_PlayFiles(13088, json_encode(['http://192.168.178.140:3777/user/polly/' . $mp3Filename]), '0');

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

// 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')
        )
    );
}

Ich habe im Ordner /docker/Symcon/Data/webfront/user/ den Ordner polly angelegt, damit wird die Datei erzeugt.

Die Frage ist doch eher, was möchtest du erreichen? Polly erstellt schöne WAV/MP3 Dateien, welche du dann z.B. über Sonos, Alexa oder VoIP ansagen lassen kannst. Oder du sendest dir diese per E-Mail wie eine Art AB Antwort.

paresy

Am liebsten per IPS und GoogleHome Mini ausgeben, wenn zum Beispiel Variable XY = true oder false.

Aktuell hab ich es mit Node-Red lösen können, aber die Voice ist im Vergleich zu Polly grauenhaft.

Guten Morgen,
ich suche hier bereits eine Weile, finde aber den Thread nicht mehr… Ich hatte gelesen, dass der Polly und Sonos bei einer Symbox einen anderen Workarround haben soll als bei Serverinstallationen. Das hatte etwas damit zu tun, dass bei der Symbox ein Verfahren ohne Zwischenspeichern (Haltbarkeit des Flash) genutzt werden sollte.
Kann mir jemand den Workarround für die Sprachausgabe via polly und Sonos für eine Symbox beschreiben?
Kann ich von POLLY_getMP3 über eine variable direkt an Sonos (ohne Zwischenspeichern) übergeben? Ich hatte mal was über die http-Speicher-Variante gelesen, bin mir aber nicht sicher, ob die hier der richtige Ansatz ist.
Ich glaube eine Code-Beispiel würde mir sehr helfen. Die Module sind installiert und die Sprachausgabe geht ebenfalls über die Testfunktion im Modul

Mir fehlt allerdings der Ansatz für ein Skript für die Symbox.

Danke im Voraus.

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