Sprachausgabe (z.B Müllabfuhrtermine) per TTS auf Google Home oder Sonos ?

Vielleicht helfen dir meine Hilfsfunktionen, die auf Polly und Sonos ausgelegt sind etwas weiter.

<?php
declare(strict_types=1);

define('IPS_SERVER_NAME', '192.168.178.86');
define('ID_POLLY_INSTANCE', 27789);
define('SOUND_DIR', IPS_GetKernelDir() . 'webfront' . DIRECTORY_SEPARATOR . 'user' . DIRECTORY_SEPARATOR . 'sounds');
define('SOUND_URL', 'http://' . IPS_SERVER_NAME . ':3777/user/sounds');


// ---- ab hier nichts mehr ändern ----

// Hilfsfunktionen zum Erzeugen von TTS Dateien und zum Abspielen der Dateien auf Sonos
// 
// Version: 1.0 16.4.2020
// Autor:   bumaas
//
// Die Datei wird in ein Skript eingebunden mit
//  require_once IPS_GetScriptFile(12345);

//-------------------------------------------------------------------------------------
// Funktion zum Erzeugen beliebig vieler Sounddateien
// Beispiel:
//      $FilesToPlay = createTTSFiles(['Dies ist ein Test', 'Der Test hat gut geklappt']);
//-------------------------------------------------------------------------------------

function createTTSFiles(array $arrText): array
{
    $arrFilesToPlay = [];

    if (!@mkdir(SOUND_DIR) && !is_dir(SOUND_DIR)) {
        return [];
    }

    foreach ($arrText as $Text) {
        //Dateinamen erzeugen
        $Filename_base = replace_chars($Text);

        //Symcon Polly Instance erzeugt mp3 Dateien
        $Filename = $Filename_base . '.mp3';

        if (!file_exists($Filename)) {
            try {
                $tmpfile = TTSAWSPOLLY_GenerateFile(ID_POLLY_INSTANCE, $Text);
                if (@rename($tmpfile, SOUND_DIR . '/' . $Filename)) {
                    $arrFilesToPlay[] = SOUND_URL . '/' . $Filename;
                } else {
                    trigger_error(sprintf('Die Sprachdatei "%s" konnte nicht nach "%s" verschoben werden.', $tmpfile, SOUND_DIR . '/' . $Filename));
                }
            } catch (Exception $e) {
                trigger_error(
                    sprintf('Die Erzeugung der Sprachdatei %s klappte nicht (%s)', SOUND_DIR . DIRECTORY_SEPARATOR . $Filename, $e->getMessage())
                );
            }
        } else {
            $arrFilesToPlay[] = SOUND_URL . '/' . $Filename;
        }
    }
    return $arrFilesToPlay;
}


//-------------------------------------------------------------------------------------
// Funktion zum Abspielen beliebig vieler Sounddateien auf beliebig vielen Sonos Geräten
// Beispiel:
//      playOnSonos([['Id' => 47111, 'Volume' => 10],
//                   ['Id' => 47888, 'Volume' => '+5']],
//                   $FilesToPlay);
//-------------------------------------------------------------------------------------

function playOnSonos(array $SonosDevices, $arrFiles)
{
    if (count($arrFiles) === 0) {
        trigger_error(sprintf('Devices: : %s. Es fehlen die Files...', json_encode($SonosDevices)));
        return;
    }

    if (IPS_SemaphoreEnter(__FUNCTION__, 20 * 1000)) {

        $idMaster     = $SonosDevices[0]['Id'];
        $volumeMaster = $SonosDevices[0]['Volume'];
        unset($SonosDevices[0]);

        $Clients = [];
        foreach ($SonosDevices as $SonosDevice) {
            $idClient           = $SonosDevice['Id'];
            $volumeClient       = $SonosDevice['Volume'];
            $Clients[$idClient] = ['volume' => $volumeClient];
        }

        set_time_limit(60);

        try {
            if (count($Clients) > 0) {
                SNS_PlayFilesGrouping($idMaster, json_encode($Clients), json_encode($arrFiles), $volumeMaster);
            } else {
                SNS_PlayFiles($idMaster, json_encode($arrFiles), $volumeMaster);
            }
        } catch (Exception $e) {
            trigger_error(
                sprintf(
                    'Das Abspielen der Dateien %s auf Master %s und Clients %s klappte nicht (%s)',
                    json_encode($arrFiles),
                    $idMaster,
                    json_encode($Clients),
                    $e->getMessage()
                )
            );
        }

        //Semaphore wieder freigeben
        IPS_SemaphoreLeave(__FUNCTION__);
    }
}


//-----------------------------------------------
// siehe hier: https://stackoverflow.com/questions/10444885/php-replace-foreign-characters-in-a-string
function replace_chars(string $fileSyntax): string
{
    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')
        )
    );
}

Hallo Zusammen,
hat jemand vielleicht eine kleine „Anleitung“ wie ich alles entsprechend einstellen muss?
Sorry für die doofe (Laien) Frage!

Sprachausgabe über HomeMini sicherlich nicht möglich oder?

Habe Text to Speech AWS Polly installiert und eingerichtet, scheitere am Punkt 8:

8. PHP-Befehlsreferenz
string TTSAWSPOLLY_GenerateData(integer $InstanzID, String $Text); Fragt über AWS den Text an und liefert die Sprachdaten Base64-kodiert in der Rückgabe zurück. `echo TTSAWSPOLLY_GenerateData(12345, "Dies ist ein Test");``

string TTSAWSPOLLY_GenerateFile(integer $InstanzID, String $Text); Fragt über AWS den Text an und liefert den Dateinamen zu den Sprachdaten zurück. `echo TTSAWSPOLLY_GenerateFile(12345, "Dies ist ein Test");``

Bin leider nur leider. Wie bekomme ich eine Sprachausgabe hin?

Hallo,

ich hatte ein ähnliches Anliegen.
Ich wollte einen Text in eine Wav-Datei schreiben und mit VOIP an mein Telefon senden lassen.
Ich wollte aber keinen Online-Service verwenden (AWS etc.), obwohl die bestimmt wesentlich besser klingen.

Ich habe auf meinem alten Laptop (wo IP-Symcon läuft) folgende zwei Programme installiert:

Mit espeak wird der Text per Synthesizer erzeugt. Klingt ein bisschen metallisch, ist aber zu verstehen.
Mit ffmpeg wird die erzeugte Wav-Datei in das passende Format für VOIP (16 bit, 8000 Hz) umgewandelt.

Dafür, dass man hiermit von keinem Online-Dienst abhängig ist, klingt es recht gut.

Folgendes Script verwende ich hierfür:

<?php

    $result_code = null;
    $text = "Eine erste Zeile. Eine zweite Zeile. Eine dritte Zeile.";

    $tempWav = IPS_GetKernelDir() . "media\AlarmText_temp.wav";
    $newWav = IPS_GetKernelDir() . "media\AlarmText.wav";


    $espeak = "\"c:/Program Files (x86)/eSpeak/command_line/espeak.exe\"" . " -s100 -vde";      // speed=100, language=german  // Source code: http://espeak.sourceforge.net/samples.html
    $ffmpeg = "\"c:/Tools/ffmpeg.exe\"";


    if($tempWav)
    {
     $espeak = $espeak . " -w" . $tempWav;
    }
    $espeak = $espeak . " \"" . $text . "\"";
    
    $ret = system($espeak,  $result_code);
//    echo $result_code . "\n";


    if( $result_code == "0")
    {
        $ffmpeg = $ffmpeg . " -i " . $tempWav . " -ar 8000 -y " . $newWav;  // new sample rate=8000 Hz  // Source code: https://github.com/BtbN/FFmpeg-Builds/releases
        $ret = system($ffmpeg,  $result_code);
//        echo $result_code . "\n";

        unlink( $tempWav );
    }
    else
    {
        unlink( $newWav );
    }

?>

Die erzeugte Wav-Datei verwende ich dann für VOIP.

VoIP_PlayWave($voip, $id, $newWav);

Frohes neues Jahr Ralf