[Modul] Text to Speech (AWS Polly)

Habe leider festgestellt, dass die Polly SSML-Tags im Standardmodul nicht funktionieren.
Damit SSML-Tags funktionieren, muss man in der Datei C:\ProgramData\Symcon\modules.store\de.symcon.ttsawspolly\TTSAWSPolly\module.php eine kleine Ergänzung vornehmen. Hierzu einfach die Zeile mit

'TextType' => 'ssml',
hinzufügen. Das sieht dann so aus:

private function SynthesizeSpeech($Text)
    {
        $data = [
		    'TextType' => 'ssml',
            'Text'         => $Text,
            'OutputFormat' => $this->ReadPropertyString('OutputFormat'),
            'VoiceId'      => $this->ReadPropertyString('VoiceId'),
        ];

        if ($this->ReadPropertyString('SampleRate') != '') {
            $data['SampleRate'] = $this->ReadPropertyString('SampleRate');
        }

        return $this->GetClient()->synthesizeSpeech($data)->get('AudioStream')->getContents();
    }

Nachtrag: Danach müssen die SSML Attribute <speak>Text</speak> verwendet werden, damit die Sprachausgabe funktioniert.

Hast du mal ein Beispiel wofür das cool ist? Ich könnte ja eine neue SynthesizeSpeechSSML Funktion anbieten, die diesen Parameter übermittelt?

paresy

SSML ermöglicht es Texte mit verschiedenen Emotionen oder geflüstert auszugeben (z.B. abends).
Ein Beispiel wäre
<speak><amazon:effect name="whispered">Ich flüstere jetzt mit Dir</amazon:effect></speak>
oder mit aufgeregter Stimme:
<speak><amazon:emotion name="excited" intensity="high">Guten Morgen! Wie geht es Dir?</amazon:emotion></speak>
Den kompletten SSML Umfang kann man hier finden:
https://docs.aws.amazon.com/de_de/polly/latest/dg/supportedtags.html#whispered-tag
P.S. Alexa im EchoRemote-Modul kann diese Tags von Haus aus…
Gruß
Daniel

Ich habe soeben eine neue Version als Beta im Store hochgeladen, bei der du den TextType konfigurieren kannst.

paresy

läuft prima, danke
Gruß Jan Peter

1 „Gefällt mir“

Hallo,

bin ein wenig am Verzweifeln. Irgendwie will mein AWS Polly Modul seit dem Update nicht mehr.

Bekomme immer selbe Fehlermeldung:

Deutet auf ein Anmeldeproblem hin! Habe sogar neuen Benutzer eingerichtet - ohne Erfolg

Woran könnte es noch liegen?

danke+lg
hagi

EDIT: GELÖST! Mit dem Update hat sich die Systemzeit des Tinkerboards um eine Stunde verstellt, somit auch die Zeit in IP Symcon. Das war der Fehler!

1 „Gefällt mir“

Hallo, ich nutze das Script aktuell so:

<?php

declare(strict_types=1);
$text = getValue(#VariablenID);   //Text in einer Variable, welcher als Wav generiert werden soll
$mp3Filename = replace_chars($text) . '.wav';

$URL1 = 'http://192.168.178.###:3777/user/polly/';
$URLVariable = $URL1 . $mp3Filename ;
RequestAction(VariablenID2, $URL1 . $mp3Filename); //URL der Wav in einer Variable, welche angesagt werden soll 

$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.###:3777/user/polly/' . $mp3Filename);

//SNS_PlayFiles(13088, json_encode(['http://192.168.178.###: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')
        )
    );
}



In nehme den Text aus einer Variable und generiere daraus eine neue Variable, welche die komplette URL der Wav-Datei enthält. Diese rufe ich dann auf.

Die generierten Files werden aktuell nicht gelöscht, dies müsste man noch ändern.

Jemand eine Idee wie?

Hallo Gemeinde,
ich versuche mich seit Wochen an der Problematik, leider ohne Erfolg.
Alle Ratschläge aus den Beiträgen habe ich umgesetzt.
Systemdienst als Benutzer, Wav im 8K-Mono.

Beim Ausführen des nachfolgenden Codes erscheint keine Fehlermeldung, Die Datei wird auf der Share erzeugt, die laufende Musik wird unterbrochen, dann herrscht Ruhe, danach spielt die Musik mit der voreingestellten Lautstärke weiter.

Die gleiche Datei lässt sich aber mit VoIP_PlayWave ohne Probleme auf einem Telefon abspielen.

<?php

$Text = ('Hallo Welt, hier bin ich');

$fileName = TTSAWSPOLLY_GenerateFile(42351, $Text);

copy ($fileName, '//192.168.2.100/hs/Hello.wav');


SNS_PlayFiles(16556,/*Sonos Küche */ json_encode( Array( "//192.168.2.100/hs/Hello.wav") ), 20);


?>

Ich habe keine Ahnung .

Kann mir jemand helfen ?

Lieben Dank im voraus.

honsirot

Ich vermute stark, dass SONOS nicht auf die Datei/das Share zugreifen kann.

Hast du mal in der Sonos App beobachtet, was passiert, wenn du das Skript ausführst?

Das ist es :frowning:

Kriege aber von Sonos keinen Zugriff auf die Share ( Windows Freigabe ).

Jetzt weis ich aber wo ich suchen muss.

Vielen Dank

Hallo
Ich speichere die Datei nicht auf eine Windows Freigabe sondern
in ein Webfront-User Ordner.
http://… funktioniert auch als $files Variable.
Laut Doku:

Alle Dateien, die in dem (als JSON encodierten) Array $filesangegeben wurden werden abgespielt.
Entweder von einem Samba Share (CIFS) (z.B. „//server.local.domain/share/file.mp3“) oder von einem HTTP Server (z.B.: „http://ipsymcon.fritz.box:3777/user/ansage/hallo.mp3“)

Auf den in Symcon integrierten Webserver zuzugreifen ist auch meiner Meinung nach die eleganteste Lösung. Da brauchst du dich um Shares und Zugriffsrechte nicht zu kümmern.

Lediglich auf die korrekten Pfade musst du dich dabei konzentrieren :slight_smile:

Vielleicht hilft dir mein Testbeispiel weiter:

<?php

declare(strict_types=1);

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

$file     = TTSAWSPOLLY_GenerateFile(27789, $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://nuc:3777/user/polly/' . $mp3Filename);

SNS_PlayFiles(13088, json_encode(['http://nuc: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 danke Euch. Jetzt klappt es !!!

So geht es eindeutig besser.

Vielen, vielen Dank.

Hallo Thorsten, hallo Paresy

ich nutze in einem System das Modul über den Modulstore installiert und einmal direkt auf dem Github von Thorsten installiert.
Modul Store= > $mp3_file = TTSAWSPOLLY_GenerateFile(50341, $notification);
github = > $mp3_file = POLLY_saveMP3(13135, $notification );

Bei dem System installiert über github wird SSML korrekt interpretiert. Beim dem System aus Modulstore wird jedes Zeichen vorgelesen ohne interpretation von SSML.

Hier mein Text (aus AWS Doku):
$notification = ‚Ich muss Ihnen ein Geheimnis erzählen, ich werde es Ihnen zuflüstern.<amazon:effect name=„whispered“> Ich bin kein Mensch.</amazon:effect>Können Sie das glauben?‘;

Ist das Absicht oder einfach ein versehen?

Gruß Jan Peter

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.