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