Salut @Mips
Peux-tu ajouter dans ton plugin un paramètre dynamique pour la durée de la phrase devant être lue ?
La solution actuelle basée sur une durée fixe et commune à toutes les phrases est difficile à gérer dans la réalité :
Si je prends par exemple la lecture du dernier rapport météo je vais avoir une durée 10x plus grande que si je signale que du courrier est dans la boite !
J’ai testé chez moi (en local) en modifiant ton plugin, et j’arrive bien à gérer les durées des messages automatiquement à partir d’une simple petite fonction et cela avec tous mes périphériques Alexa…
Je me suis préparé cette fonction qui calcule le temps de lecture d’un texte en fonction du nombre de syllabes. Sans être précis à la seconde près, j’arrive avec mes quelques tests à obtenir une précision inférieure à 3 secondes d’écart environ, de plus j’ai intégré dans cette fonction deux paramètres pour ajuster selon les caractéristiques de chacun…
Donc au final on à 3 arguments :
$phrase : contient le texte à lire
$marge : durée (en seconde) de marge de sécurité qui sera ajoutée en fin de calcul pour ajuster le temps le temps de traitement TTS …
$vitesse : ajustement de la vitesse moyenne de lecture d’une syllabe (en fonction du périphérique TTS).
Voici mon bout de code que j’ai ajouté dans ma version modifiée de ton plugin :
au début de ton extends eqLogic(...)
class notificationqueue extends eqLogic {
private static function tempsParole($phrase, $marge = 3, $vitesse = 0.2) {
/*
$phrase : contient le texte à lire
$marge : durée (en seconde) de marge de sécurité qui sera ajoutée pour ajuster le temps le temps de traitement TTS ...
$vitesse : ajustement de la durée moyenne de lecture d'une syllabe (en fonction du périphérique TTS)
*/
$mot = strtok($phrase,"");
$voyelles = array ("a","à","e","é","è","ê","ë","i","o","u","ù","û","y");
$cvcv = "";
for ($i=0;$i<strlen ($mot)-1;$i++) {
if (in_array($mot[$i],$voyelles)) {$cvcv .="v";} else {$cvcv .="c";}
}
$cvcv .=" ";
$cvcv = str_replace ("vv","v",$cvcv);
$cvcv = str_replace ("vv","v",$cvcv);
$cvcv = str_replace ("vv","v",$cvcv);
$cvcv = str_replace ("cc","c",$cvcv);
$cvcv = str_replace ("cc","c",$cvcv);
$cvcv = str_replace ("cc","c",$cvcv);
$cvcv = str_replace ("c ","",$cvcv);
$cvcv = str_replace (" ","",$cvcv);
$nbsyllabes1 = count (explode ("cv",$cvcv));
$nbsyllabes2 = count (explode ("vc",$cvcv));
$nbsyllabes = min ($nbsyllabes1,$nbsyllabes2);
$duree = $marge + round($vitesse * $nbsyllabes,0,PHP_ROUND_HALF_UP); // temporisation minimum (en secondes) avant de lire un nouveau message
return $duree; // durée de lecture de la phrase
}
et à la fin de ta fonction public function sendAllMessages(), j’ai inséré l’execution de ma fonction :
log::add('notificationqueue', 'info', "start sending message from queue {$this->getName()}");
while (!$queue->isEmpty()) {
$options = $queue->dequeue();
if (!$this->sendMessage($options)) {
log::add('notificationqueue', 'warning', "Error during send, put back in queue");
$this->addMessageToQueue($options);
};
$sleep = notificationqueue::tempsParole($options['message'], $marge = 3, $vitesse = 0.2);
notificationqueue::wait($condition, $sleep);
}
Bien sur, il faut ensuite faire quelques ajustements notamment sur tes fonctions wait(), ou j’ai passé (temporairement) ta limite à 60 au lieu de 30 dans tes « if ($occurence > 60) », et dans preUpdate : (!is_numeric($sleep) || $sleep<1 || $sleep>60)
Car le temps devenant dynamique, imposer une limite (à 30sec), n’a plus vraiment lieu d’être dans cette version …
Bref, si tu es okay pour intégrer ces modifs dans ta prochaine version, ce serait bien cool !
Je reste à ta disposition si tu as besoin d’autre infos…