Aller au contenu
Bobobull

TTS sur Sonos

Recommended Posts

Bonjour,

 

Je ne sais pas trop ou poster cette question alors je tente ici.

J'utilise un module virtuelle maison pour automatiser des actions.

J'ai un problème avec deux action (code dans les boutons en LUA donc): Réveil et Dodo

Réveil lance la musique sur les Sonos, allume quelques lumière et envoie une annonce TTS sur la sonos de la chambre.

Dodo règle les volume des Sonos, éteint les lumières et envoie une autre annonce TTS sur la sonos de la chambre également.

 

Tout fonctionne mais assez souvent, dans la scene du réveil, j'ai l'annonce TTS de la veille et le soir avec la scene dodo, j'ai le message du matin.

 

Y a-t-il un cache à vider ou quelque chose à faire pour éviter ceci ?

 

Merci de votre aide

Partager ce message


Lien à poster
Partager sur d’autres sites

Non, pas de cache à vider... il faudrait faire une revue du code.


Envoyé de mon iPhone en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors les voici (Code des boutons du module "épuré de ce sur le TTS")

Code au réveil :

-- Create TTS params object
   local bid = 28

   local params = {
       -- TTS Message
       message = PhraseTTS,  
       duration = 'auto',    -- Duration: "auto", xx seconds
       language = "fr-FR",    -- Language: fr-FR
       volume = 15            -- Volume
   }

   -- Envoi TTS Annonce Meteo
       local _f = fibaro
       local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end}
       -- Make a request to the remote to process params object instantly
       _x:set(tostring(id["CHA_SONOS_PLAY1"]), { tts = params })
       _f:call(id["CHA_SONOS_PLAY1"], "pressButton", bid)

Code dodo

     local bid = 28
     local params = {
        -- TTS Message
        message = PhraseTTSNuit,  
        duration = 'auto',    -- Duration: "auto", xx seconds
        language = "fr-FR",    -- Language: fr-FR
        volume = 15            -- Volume
     }
     local _f = fibaro
     local _x ={root="x_sonos_object",load=function(b)local c=_f:getGlobalValue(b.root)if string.len(c)>0 then local d=json.decode(c)if d and type(d)=="table"then return d else _f:debug("Unable to process data, check variable")end else _f:debug("No data found!")end end,set=function(b,e,d)local f=b:load()if f[e]then for g,h in pairs(d)do f[e][g]=h end else f[e]=d end;_f:setGlobal(b.root,json.encode(f))end,get=function(b,e)local f=b:load()if f and type(f)=="table"then for g,h in pairs(f)do if tostring(g)==tostring(e or"")then return h end end end;return nil end}
     -- Make a request to the remote to process params object instantly
     _x:set(tostring(id["CHA_SONOS_PLAY1"]), { tts = params })
     _f:call(id["CHA_SONOS_PLAY1"], "pressButton", bid)

A savoir que le code envoie également un mail différent au réveil et au dodo et que le mail contient le bon message. 

A savoir que la Sonos qui reçoit le TTS font partie d'un groupe. Elle sort du groupe, lis le message et réintègre le groupe.

Ca fait un moment que je cherche, je ne trouve pas de logique, d'où la piste d'un cache quelque part.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je comprends que ce soit étrange que les informations reçues par mail soient correctes alors que le TTS est parfois faux.

Néanmoins, pour analyser correctement les éventualités et t’aider au maximum, il faudrait partager avec nous les codes complets des boutons.

Partager ce message


Lien à poster
Partager sur d’autres sites

Quelques questions pour tenter de comprendre davantage...

Cela fonctionne, mais lorsque cela se "dérègle", le message transmis est donc le précédent ? C'est-à-dire, qu'il est possible que tu entendes le même message deux fois d'affilée ?

Par exemple, un du matin qui a bien fonctionné et, le soir, le même qui aura été déjà dit le matin même ?

 

La construction de tes phrases TTS est complexe (enchaînement de plusieurs variables implémentées et traitées).

Il est possible de faire beaucoup plus simple et je me demande si le problème ne vient pas de la construction de la phrase.

Comme si, le message TTS était bien trop long à être construit/traité et, que par conséquent le TTS lisait dernier message construit.

As-tu essayé avec des phrases simples, sans aucun traitement ? Simplement pour cibler correctement le défaut.

Modifié par J3R3M

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est complexe.

Lorsque j'appuie sur les boutons "Réveil" ou "Dodo" manuellement depuis le portail, j'ai toujours le bon message.

 

Lorsque l'alarme "Wake-Up" sonne sur mon portable, IFTTT (sur le portable) exécute une scène qui appuie sur le bouton "Réveil" du module.

Dans ce cas, je reçois le bon mail (à chaque fois) mais pas toujours le bon TTS (Soit le bon, soit celui du soir précédent).

Le code de la scène :

--[[
%% properties
%% globals
--]]

-- Scene à jouer au réveil. Démarré par ITTT
fibaro:debug("Pressing button 1 on module Scanarios")
fibaro:call(485, "pressButton", "1")
fibaro:debug("Done.")

 

Lorsque je dis à "Ok Google" que je vais dormir, IFTTT exécute une autre scène qui appuie sur le bouton "Dodo" du module.

Dans ce cas aussi, je reçois le bon mail à chaque fois mais pas toujours le bon TTS (cas idem, soit le bon, soit celui du matin précédent).

Le code de la scène :
 

--[[
%% properties
%% events
%% globals
--]]

-- Scene à jouer avant de dormir
fibaro:debug("Pressing button 2 on module Scanarios")
fibaro:call(485, "pressButton", "2")
fibaro:debug("Done.")

J'imagine qu'il est possible de faire plus simple mais je ne maîtrise pas trop, si tu as des pistes, je suis preneur :)

Partager ce message


Lien à poster
Partager sur d’autres sites

À n'importe quel moment de la journée, quand tu appuies manuellement sur un des deux boutons du VD, cela fonctionne systématiquement?

Cela confirmerait que le problème serait donc externe... Cela fait un peu usine à gaz tous ces appels pour simplement appuyer sur un bouton.

Pourquoi ne pas gagner quelques étapes en copiant simplement le code des boutons dans les scènes directement lancées par IFTT?

 

Si le code est fonctionnel et que tu t'y retrouves, c'est le principal.

C'est important que tu puisses le modifier toi-même simplement :)

Modifié par J3R3M

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait, j'aime bien l'idée d'avoir un seul code pour une même tâche, c'est plus simple à gérer. Si je copie le code je vais l'avoir à double et pour chaque modification il faudra maintenir les deux.

 

Sur le fond ce n'est pas très grave mais je vois pas trop ou peut être ce problème puis que le mail envoyé et correcte dans tous les cas, cela signifie bien que "l'assemblage" effectue la bonne action.

C'est vraiment étrange tout ça.

 

Je copie le code dans les scene IFTTT pour voir si ça change, mais j'y crois pas trop ;)

Merci de ton aide en tout cas

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a une heure, Bobobull a dit :

En fait, j'aime bien l'idée d'avoir un seul code pour une même tâche, c'est plus simple à gérer. Si je copie le code je vais l'avoir à double et pour chaque modification il faudra maintenir les deux. 

Je n'évoquais pas de doubler les codes, mais bien de gagner une étape de manière pérenne, ne serait-ce que pour constater le résultat.

Actuellement, ton cheminement est celui-ci:

  1. Alarme du téléphone
  2. IFTT
  3. Scène pour appui sur un bouton
  4. Appui sur un bouton
  5. Résultat

Il est très facilement possible de gagner une étape comme ceci :

  1. Alarme du téléphone
  2. IFTT
  3. Scène avec actions
  4. Résultat

Cela fera exactement la même chose, en supprimant l'étape d'appui sur un bouton, puisque les actions seront directement exécutées depuis la scène démarrée par IFTT.

Si tu souhaites tester les actions, il te suffira de lancer manuellement les scènes. Ou alors, si tu souhaites conserver le lancement depuis le VD, de remplacer le code de tes boutons par un simple fibaro:startScene(); :)

 

Je te suggère également de tester temporairement avec une simple ligne à prononcer dans chaque scène.

Par exemple : Bonjour, ceci est la scène matinale et Bonjour, ceci est la scène de soirée

Ainsi, on va voir si cela ne vient vraiment pas de la construction de ton message :)

Modifié par J3R3M

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon alors c'est pas très concluant, parfois les messages sont juste parfois faux.

J'ai insisté un peu avec le boutons du module et même via les boutons, j'ai parfois le mauvais message TTS.

 

Il n'y aurait pas moyen de vider la variable que les modules SONOS utilise ? ça serait pas une solution "propre" et simple ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour @Bobobull,

Qu'as-tu essayé finalement?

Car s'il s'agit simplement du gain d'une étape en ne passant plus par le VD, il n'y a aucune raison que cela change autant la situation.

Si les messages sont parfois faux, il n'y a aucun doute sur l'origine du problème : construction de la phrase.

Et je suis certain que si tu essayais ce que je te proposais juste avant, soit une phrase simple, en une seule variable et sans construction, les phrases seraient toujours bonnes et prononcées au moment désiré.

 

Il n'y a pas de variable SONOS à vider. Les variables utilisées servent à l'envoi de ce que tu souhaites avec les paramètres que tu as défini, ni plus, ni moins.

Si un problème de retranscription de phrase était inhérent au VD, ça se saurait depuis le temps, crois-moi :D

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour, est-ce que quelqu'un pourrait me redonner le sujet qui traite de la mise en place d'un système TTS pour SONOS tel que celui décrit ici?

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour j’ai le même souci que @Bobobule, mes messages écoutés sont parfois ceux précédemment demandes et non celui que je viens d’envoyer.

 

Il semblerait que l’enceinte Sonos bufferise parfois un message TTS sans l’énoncer. Puis lors de l’envoi d’un nouveau message, ce n’est pas le nouveau message qui est énoncé mais l’ancien.

 

Quelqu’un aurait trouvé une solution pour régler ce problème. Comme par exemple une commande API qui purgerait le buffer du Sonos.

 

 

Envoyé de mon iPhone en utilisant Tapatalk Pro

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×