Questions diverses : Fonctionnement avec le cache et passer des instruction de style à la synthèse vocale (pour les Chirp3)

Bonjour,
Les nouveautés sons les bienvenues, surtout avec l’arrivée de la génération par IA :slight_smile:
J’ai néanmoins quelques questions :

Texte par IA non utilisé si le TTS message est identique mais le résultat généré différent .
Quand je génère par exemple un message « bonjour, la température extérieure est de 15°C » et que je demande à l’IA de générer des prévision supplémentaires pour la journée, OU que je fais des tests de changement d’instruction du prompt, le résultat n’est envoyé à l’enceinte que si le TTS message d’origine change, sinon à ma compréhension ca réutilise le MP3 actuel. Du coup la solution c’est de bien gérer dans les message TTS pour doser entre rafraichissement à chaque changement de contexte ou bien tu conseilles de désactiver le cache dans les paramètres ? (avec impact facturation forcément…)

Possiblité de passer des instructions de style
Je me suis amusé un peu sur la console google avec les voix Chirp3 et on peut passer des instructions de style qui m’ont l’air d’être bien différentes des instructions de Gen AI. Est-il possible de passer de telles instructions ? a priori pas avec SSML vu que tu dis que c’est incompatible avec les voix Chirp3.
cf catpure :

Bonne journée :

Bonjour,

Merci pour ces retours.

Concernant le cache :

  • Lorsque l’IA est utilisée dans une notification (que le cache soit activé ou non dans la configuration), alors le cache est ignoré (justement pour éviter qu’il ne reprenne ce qu’il a dit quelques heures avant ou la veille).

Concernant les instructions de style :

  • Très intéressant :+1: (je viens de lire en détails les chapitres correspondants dans les docs de l’API), je n’avais pas encore eu le temps de me pencher dessus :wink:

Je vais regarder pour ajouter cette possibilité dans le plugin :wink: ainsi que la fonctionnalité « markup » également (pour les voix Chirp3 également, permet d’ajouter des pauses, ou des rires, etc… dans une notification, un peu ce que permet le SSML dans les autres voix).

Bonne journée,
TiTidom.

Dans mes tests, si le message ne change pas mais que l’instruction change (le ton, les consignes) et que donc le résultat doit changer, alors le même mp3 sera utilisé (même si je désactive le cache ou si je le vide, ce que je trouve curieux). Si je change un truc au niveau du message, alors ça prendra bien en compte les nouvelles consignes. Je vais tester un peu plus pour confirmer mais c’est le comportement constaté.

Pour les instructions ca peut donner des trucs bien délire donc ca serait cool.
Par exemple : « Contexte épique, avec un ton humoristique mais ténébreux tout en restant amical et pas effrayant pour un enfant avec une fin en envolée lyrique ! », modèle Iapetus (Male)
Texte : « Attention les amis, je démarre l’équipement audiovisuel pour la session de jeux vidéo. ça va détonner je vous le garanti ! En route pour l’aventuuuure !!! »"

Résultat : Vocaroo | Online voice recorder

j’ai aussi un autre problème : apparemment la mécanique des wait ne fonctionne plus lorsque je passe en parametre l’option aitemp vide (j’avais une erreur dans mon scénarion qui s’occupe d’empiler automatiquement les dictions, avec une gestion du wait automatisée).
Ca le fait peut être pour d’autres paramétres mais je comprenais pas pquoi mes enchainements ne marchaient plus :slight_smile:

Re,

aitemp vide ??? quel intérêt de passer un paramètre vide ? car du coup la chaine n’est plus valide : Car on attend une liste de key:value :slight_smile:

Concernant le cache, j’utilise la reformulation IA tous les jours, et je n’ai jamais le même contenu, du coup je n’arrive pas à reproduire… Il faudra des logs (en mode débug) du démon pour regarder ce qu’il se passe de ton côté.

Concernant la partie TTS (style notamment), c’est beaucoup plus compliqué que prévu, car cette partie là n’utilise pas le même moteur TTS chez Google :stuck_out_tongue: , donc je vais regarder comme implémenter cette partie, mais cela va prendre plus longtemps que je n’avais prévu.

TiTidom.

Bonjour,

Voici des débuts prometteurs :+1: :

J’ai cumulé toutes les possibilités du plugin dans cette action de scénario :

  • Reformulation (texte) grâce à l’IA d’une « simple » notification :
    • Demande : « Attention, la consommation de courant vient de dépasser les 4800 Watts ! »
    • Résultat : « Quoi ? 4800 Watts, c’est ce que nous consommons actuellement ? C’est une quantité d’énergie énorme ! J’espère que rien ne va sauter ! »
  • Génération de la notification TTS (audio) avec les voix Gemini TTS (j’avoue, cela me fait sourire à chaque fois que je les entends) : Enregistrement
    • Style demandé : « parle d’une voix surprise et inquiète »
  • Diffusion sur un Google NestHub
  • Envoi du texte généré dans un message Discord

image

J’ai encore une batterie de tests à faire et relire encore une fois des bouts du code (car cette intégration a demandé pas mal de modifications dans le code) et je publierai ensuite une version BETA v1.9.0.

Bonne journée,
TiTidom.

1 « J'aime »

pour la valeur null, en fait j’ai fait un script « DireMaison » qui encapsule toutes les logiques que je souhaitais, avec gestion de ciblage simplifié, redirectement d’un ciblage en fonction de l’utilsation actuelle (si musique joue en cast sur les enceintes du salon, je ne joue pas de notif sur le groupe « maison » qui inclue ces enceinte sinon ca coupe le lien de cast entre, par exemple, youtube music sur le téléphone et les enceintes du salon"), avec gestion auto du volume selon l’heure de la journée etc etc.
et du coup j’appelle le scénarion avec ou sans des options … et la je ne fournissais pas de valeur au tag « aitemp » que j’utilisais dans les commande tts, et j’avais pas mis de valeur par défaut dans le script. il faut que je fasse plus propre avec une construction de la chaine d’options à passer à la commande TTS en fonction des params que je passe effectivement … :slight_smile:

Pour le pb que je décrivais, c’est avec un scénario de test dans lequel je faisais mumuse avec les options de tone, sysprompt, voice etc et je ne voyais pas de différence. Je vais refaire des tests et isoler ce qu’il faut en debug pour montrer ce qu’il se passe et t’aider à comprendre.

Magnifique ! je fais faire mumuse avec cela :wink:
Merci à toi, c’est avec des plugin comme cela qu’on peut encore dire que Jeedom à son mot à dire face à HA :wink:

Bon, j’ai un peu de mal à faire fonctionner, et surtout je dirais je n’ai plus de cast qui se fait.
Il y a peut être un mélange entre les différentes options, mais j’ai active le GeminiTTS;
Ca génère bien un wav (pas mp3 cette fois) mais ca échoue à envoyer sur mon enceinte de test.
J’ai rien changé sur mon réseau, à moins d’une mise à jour chelou sur mon UDM pro Unifi mais je pense plutôt que c’est la dernière beta.
Voici le log en débug pour le daemon (ips anonymisées) :

[2026-05-20 20:26:18] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from Tr@n$p0rt-0 to Tr@n$p0rt-0: {'type': 'PING'}
[2026-05-20 20:26:18] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PONG'}
[2026-05-20 20:26:22] DEBUG  : [DAEMON][HANDLER] Client connected to [127.0.0.1:33132]
[2026-05-20 20:26:22] DEBUG  : [DAEMON][HANDLER] Message read from socket :: b'{"cmd": "action", "cmd_action": "tts", "ttsLang": "fr-FR", "ttsEngine": "gcloudtts", "ttsSpeed": "0.9", "ttsOptions": "\\"volume\\": 20, \\"ding\\": true, \\"wait\\": 1, \\"style\\": \\"Dans un contexte \\u00e9pique de d\\u00e9marrage d\'une session de jeu video, avec un ton humoristique mais t\\u00e9n\\u00e9breux tout en restant amical et pas effrayant pour un enfant. fin en envol\\u00e9e lyrique !\\", \\"engine\\": \\"geminitts\\"", "ttsText": "test de synth\\u00e8se vocale, allons y les amis, on d\\u00e9marre la session !!", "ttsGoogleUUID": "39854d13-ba25-cfb1-be39-e0f7d047f8ee", "ttsVoiceName": "fr-FR-Studio-A", "ttsRSSVoiceName": "fr-fr-Bette", "ttsRSSSpeed": "0", "ttsGeminiVoiceName": "Iapetus", "cmdNotificationId": 0, "apikey": "***"}'
[2026-05-20 20:26:22] DEBUG  : [DAEMON][HANDLER] Client disconnected from [127.0.0.1:33132]
[2026-05-20 20:26:22] DEBUG  : [DAEMON][SOCKET] Message received in socket JEEDOM_SOCKET_MESSAGE
[2026-05-20 20:26:22] DEBUG  : [DAEMON][SOCKET] Action
[2026-05-20 20:26:22] DEBUG  : [DAEMON][SOCKET] Generate And Play TTS
[2026-05-20 20:26:22] DEBUG  : [DAEMON][SOCKET] TTS :: {'cmd': 'action', 'cmd_action': 'tts', 'ttsLang': 'fr-FR', 'ttsEngine': 'gcloudtts', 'ttsSpeed': '0.9', 'ttsOptions': '"volume": 20, "ding": true, "wait": 1, "style": "Dans un contexte épique de démarrage d\'une session de jeu video, avec un ton humoristique mais ténébreux tout en restant amical et pas effrayant pour un enfant. fin en envolée lyrique !", "engine": "geminitts"', 'ttsText': 'test de synthèse vocale, allons y les amis, on démarre la session !!', 'ttsGoogleUUID': '39854d13-ba25-cfb1-be39-e0f7d047f8ee', 'ttsVoiceName': 'fr-FR-Studio-A', 'ttsRSSVoiceName': 'fr-fr-Bette', 'ttsRSSSpeed': '0', 'ttsGeminiVoiceName': 'Iapetus', 'cmdNotificationId': 0, 'apikey': '***'}
[2026-05-20 20:26:22] DEBUG  : [DAEMON][TTS] Check des répertoires
[2026-05-20 20:26:22] DEBUG  : [DAEMON][TTS] Options :: {'volume': 20, 'ding': True, 'wait': 1, 'style': "Dans un contexte épique de démarrage d'une session de jeu video, avec un ton humoristique mais ténébreux tout en restant amical et pas effrayant pour un enfant. fin en envolée lyrique !", 'engine': 'geminitts'}
[2026-05-20 20:26:22] DEBUG  : [DAEMON][COM] Send to jeedom : {'ttsLastMessage': {'39854d13-ba25-cfb1-be39-e0f7d047f8ee': 'test de synthèse vocale, allons y les amis, on démarre la session !!'}}
[2026-05-20 20:26:22] DEBUG  : [DAEMON][TTS] ttsLastMessage envoyé :: UUID=39854d13-ba25-cfb1-be39-e0f7d047f8ee
[2026-05-20 20:26:22] DEBUG  : [DAEMON][TTS] TTSEngine = geminitts
[2026-05-20 20:26:22] DEBUG  : [DAEMON][TTS] Nom du fichier à générer :: /tmp/jeedom/ttscast_cache/bd3e25e645533ad14c87ce63786f84fa.wav
[2026-05-20 20:26:22] DEBUG  : Starting new HTTP connection (1): 127.0.0.1:80
[2026-05-20 20:26:22] DEBUG  : [DAEMON][GeminiTTS] Chargement des credentials OAuth2 :: [MON-COMPTE-SERVICE].json
[2026-05-20 20:26:22] DEBUG  : http://127.0.0.1:80 "POST /plugins/ttscast/core/php/jeettscast.php?apikey=*** HTTP/1.1" 200 0
[2026-05-20 20:26:22] DEBUG  : [DAEMON][GeminiTTS] Modèle :: gemini-3.1-flash-tts-preview | Voix :: Iapetus | Style :: Dans un contexte épique de démarrage d'une session de jeu video, avec un ton humoristique mais ténébreux tout en restant amical et pas effrayant pour un enfant. fin en envolée lyrique !
[2026-05-20 20:26:22] INFO  : AFC is enabled with max remote calls: 10.
[2026-05-20 20:26:22] DEBUG  : Starting new HTTPS connection (1): oauth2.googleapis.com:443
[2026-05-20 20:26:22] DEBUG  : https://oauth2.googleapis.com:443 "POST /token HTTP/1.1" 200 None
[2026-05-20 20:26:22] DEBUG  : connect_tcp.started host='aiplatform.googleapis.com' port=443 local_address=None timeout=None socket_options=None
[2026-05-20 20:26:23] DEBUG  : connect_tcp.complete return_value=<httpcore._backends.sync.SyncStream object at 0x726a743e90a0>
[2026-05-20 20:26:23] DEBUG  : start_tls.started ssl_context=<ssl.SSLContext object at 0x726a77d66f50> server_hostname='aiplatform.googleapis.com' timeout=None
[2026-05-20 20:26:23] DEBUG  : start_tls.complete return_value=<httpcore._backends.sync.SyncStream object at 0x726a743e8170>
[2026-05-20 20:26:23] DEBUG  : send_request_headers.started request=<Request [b'POST']>
[2026-05-20 20:26:23] DEBUG  : send_request_headers.complete
[2026-05-20 20:26:23] DEBUG  : send_request_body.started request=<Request [b'POST']>
[2026-05-20 20:26:23] DEBUG  : send_request_body.complete
[2026-05-20 20:26:23] DEBUG  : receive_response_headers.started request=<Request [b'POST']>
[2026-05-20 20:26:23] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 18}
[2026-05-20 20:26:23] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:24] DEBUG  : [Chromecast Ultra rdc([IP-CC-RDC]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:24] DEBUG  : [Chromecast Ultra rdc([IP-CC-RDC]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:25] DEBUG  : [Barre chambre([IP-BARRE-CHAMBRE]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:25] DEBUG  : [Barre chambre([IP-BARRE-CHAMBRE]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:25] DEBUG  : [Home max([IP-HOME-MAX]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:25] DEBUG  : [Home max([IP-HOME-MAX]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:25] DEBUG  : [Ampli salon([IP-AMPLI-SALON]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:25] DEBUG  : [Ampli salon([IP-AMPLI-SALON]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:25] DEBUG  : [Maison plus([IP-AMPLI-SALON]):32043] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 17}
[2026-05-20 20:26:25] DEBUG  : [Maison plus([IP-AMPLI-SALON]):32043] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:25] DEBUG  : [Rez de chaussée([IP-AMPLI-SALON]):32131] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 17}
[2026-05-20 20:26:25] DEBUG  : [Rez de chaussée([IP-AMPLI-SALON]):32131] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Maison([IP-AMPLI-SALON]):32245] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 17}
[2026-05-20 20:26:26] DEBUG  : [Maison([IP-AMPLI-SALON]):32245] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Salon([IP-AMPLI-SALON]):32107] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 17}
[2026-05-20 20:26:26] DEBUG  : [Notifications([IP-NEST-HUB]):32141] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 17}
[2026-05-20 20:26:26] DEBUG  : [Nest hub([IP-NEST-HUB]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:26] DEBUG  : [Notifications([IP-NEST-HUB]):32141] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Nest hub([IP-NEST-HUB]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Salon([IP-AMPLI-SALON]):32107] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Pc bureau([IP-PC-BUREAU]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:26] DEBUG  : [Pc bureau([IP-PC-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Réveil([IP-REVEIL]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:26] DEBUG  : [Réveil([IP-REVEIL]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Chambre Alya([IP-CHAMBRE-ALYA]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:26] DEBUG  : [Chambre Alya([IP-CHAMBRE-ALYA]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : [Garage([IP-GARAGE]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:26] DEBUG  : [Garage([IP-GARAGE]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:26] DEBUG  : receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'application/json; charset=UTF-8'), (b'Vary', b'Origin'), (b'Vary', b'X-Origin'), (b'Vary', b'Referer'), (b'Content-Encoding', b'gzip'), (b'Date', b'Wed, 20 May 2026 20:26:26 GMT'), (b'Server', b'scaffolding on HTTPServer2'), (b'X-XSS-Protection', b'0'), (b'X-Frame-Options', b'SAMEORIGIN'), (b'X-Content-Type-Options', b'nosniff'), (b'Alt-Svc', b'h3=":443"; ma=2592000,h3-29=":443"; ma=2592000'), (b'Transfer-Encoding', b'chunked')])
[2026-05-20 20:26:26] INFO  : HTTP Request: POST https://aiplatform.googleapis.com/v1beta1/projects/[MON-PROJET-GCP]/locations/global/publishers/google/models/gemini-3.1-flash-tts-preview:generateContent "HTTP/1.1 200 OK"
[2026-05-20 20:26:26] DEBUG  : receive_response_body.started request=<Request [b'POST']>
[2026-05-20 20:26:26] DEBUG  : receive_response_body.complete
[2026-05-20 20:26:26] DEBUG  : response_closed.started
[2026-05-20 20:26:26] DEBUG  : response_closed.complete
[2026-05-20 20:26:26] INFO  : [DAEMON][GeminiTTS][TOKENS] Model: gemini-3.1-flash-tts-preview | Input: 68 | Output: 162 | Total: 230
[2026-05-20 20:26:26] DEBUG  : [DAEMON][GeminiTTS] Audio généré :: 311040 bytes | mime_type :: audio/l16; rate=24000; channels=1
[2026-05-20 20:26:26] DEBUG  : [DAEMON][GeminiTTS] PCM encapsulé en WAV :: 311084 bytes | rate :: 24000 Hz | channels :: 1
[2026-05-20 20:26:26] DEBUG  : close.started
[2026-05-20 20:26:26] DEBUG  : close.complete
[2026-05-20 20:26:26] DEBUG  : [DAEMON][TTS] Fichier TTS Gemini généré :: /tmp/jeedom/ttscast_cache/bd3e25e645533ad14c87ce63786f84fa.wav
[2026-05-20 20:26:26] DEBUG  : [DAEMON][TTS] URL du fichier TTS à diffuser :: https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav
[2026-05-20 20:26:26] DEBUG  : [DAEMON][Cast] Diffusion sur le Google Home :: 39854d13-ba25-cfb1-be39-e0f7d047f8ee
[2026-05-20 20:26:26] DEBUG  : [DAEMON][Cast] Chromecast trouvé, tentative de lecture TTS
[2026-05-20 20:26:26] DEBUG  : [DAEMON][WaitQueue][Cast] Reset requested for 39854d13-ba25-cfb1-be39-e0f7d047f8ee
[2026-05-20 20:26:26] DEBUG  : [DAEMON][WaitQueue][Cast] Start Waiting 1 for 39854d13-ba25-cfb1-be39-e0f7d047f8ee (Queue: 2)
[2026-05-20 20:26:26] DEBUG  : [DAEMON][WaitQueue][Cast] End Waiting 1 for 39854d13-ba25-cfb1-be39-e0f7d047f8ee
[2026-05-20 20:26:26] DEBUG  : [DAEMON][GroupSnapshot] Start for cast: Mini bureau (39854d13-ba25-cfb1-be39-e0f7d047f8ee)
[2026-05-20 20:26:26] DEBUG  : [DAEMON][GroupSnapshot] Cast Mini bureau (39854d13-ba25-cfb1-be39-e0f7d047f8ee) not in NETCAST_GROUPS
[2026-05-20 20:26:26] DEBUG  : [DAEMON][GroupSnapshot] Final snapshot: {}
[2026-05-20 20:26:26] DEBUG  : [DAEMON][Cast] isGroup : False :: Mini bureau
[2026-05-20 20:26:26] DEBUG  : [DAEMON][Cast] Volume [avant / pendant] lecture :: [0.20000000298023224 / 20]
[2026-05-20 20:26:26] INFO  : Receiver:setting volume to 0.20
[2026-05-20 20:26:26] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Sending: Message urn:x-cast:com.google.cast.receiver from sender-0 to receiver-0: {'type': 'SET_VOLUME', 'volume': {'level': 0.2}, 'requestId': 19}
[2026-05-20 20:26:26] DEBUG  : [Salle de bain([IP-SALLE-DE-BAIN]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 16}
[2026-05-20 20:26:26] DEBUG  : [Salle de bain([IP-SALLE-DE-BAIN]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:27] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.receiver from receiver-0 to sender-0: {'requestId': 19, 'status': {'applications': [{'appId': 'CC1AD845', 'appType': 'WEB', 'displayName': 'Default Media Receiver', 'iconUrl': '', 'isIdleScreen': False, 'launchedFromCloud': False, 'namespaces': [{'name': 'urn:x-cast:com.google.cast.debugoverlay'}, {'name': 'urn:x-cast:com.google.cast.cac'}, {'name': 'urn:x-cast:com.google.cast.media'}], 'senderConnected': True, 'sessionId': '7c277d39-0223-4c6c-9ad2-2f45a017d948', 'statusText': 'Default Media Receiver', 'transportId': '7c277d39-0223-4c6c-9ad2-2f45a017d948', 'universalAppId': 'CC1AD845'}], 'userEq': {'high_shelf': {'frequency': 4500.0, 'gain_db': 0.0, 'quality': 0.707}, 'low_shelf': {'frequency': 150.0, 'gain_db': 0.0, 'quality': 0.707}, 'max_peaking_eqs': 0, 'peaking_eqs': []}, 'version': 2, 'volume': {'controlType': 'master', 'level': 0.20000000298023224, 'muted': False, 'stepInterval': 0.019999999552965164}}, 'type': 'RECEIVER_STATUS'}
[2026-05-20 20:26:27] DEBUG  : Received status: CastStatus(is_active_input=None, is_stand_by=None, volume_level=0.20000000298023224, volume_muted=False, app_id='CC1AD845', display_name='Default Media Receiver', namespaces=['urn:x-cast:com.google.cast.debugoverlay', 'urn:x-cast:com.google.cast.cac', 'urn:x-cast:com.google.cast.media'], session_id='7c277d39-0223-4c6c-9ad2-2f45a017d948', transport_id='7c277d39-0223-4c6c-9ad2-2f45a017d948', status_text='Default Media Receiver', icon_url='', volume_control_type='master')
[2026-05-20 20:26:27] DEBUG  : [DAEMON][NETCAST][New_Cast_Status] Mini bureau :: STATUS Chromecast change :: CastStatus(is_active_input=None, is_stand_by=None, volume_level=0.20000000298023224, volume_muted=False, app_id='CC1AD845', display_name='Default Media Receiver', namespaces=['urn:x-cast:com.google.cast.debugoverlay', 'urn:x-cast:com.google.cast.cac', 'urn:x-cast:com.google.cast.media'], session_id='7c277d39-0223-4c6c-9ad2-2f45a017d948', transport_id='7c277d39-0223-4c6c-9ad2-2f45a017d948', status_text='Default Media Receiver', icon_url='', volume_control_type='master')
[2026-05-20 20:26:27] DEBUG  : [DAEMON][Cast] Thumb path :: https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png
[2026-05-20 20:26:27] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Sending: Message urn:x-cast:com.google.cast.media from sender-0 to 7c277d39-0223-4c6c-9ad2-2f45a017d948: {'media': {'contentId': 'https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav', 'streamType': 'BUFFERED', 'contentType': 'audio/wav', 'metadata': {'title': 'TTSCast', 'subtitle': 'Jeedom', 'images': [{'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}, {'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}], 'thumb': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', 'metadataType': 0}}, 'type': 'LOAD', 'autoplay': True, 'customData': {}, 'requestId': 20, 'sessionId': '7c277d39-0223-4c6c-9ad2-2f45a017d948'}
[2026-05-20 20:26:27] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.media from 7c277d39-0223-4c6c-9ad2-2f45a017d948 to *: {'type': 'MEDIA_STATUS', 'status': [{'mediaSessionId': 4, 'playbackRate': 1, 'playerState': 'IDLE', 'currentTime': 0, 'supportedMediaCommands': 274447, 'volume': {'level': 1, 'muted': False}, 'media': {'contentId': 'https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav', 'streamType': 'BUFFERED', 'contentType': 'audio/wav', 'metadata': {'title': 'TTSCast', 'subtitle': 'Jeedom', 'images': [{'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}, {'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}], 'thumb': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', 'metadataType': 0}, 'mediaCategory': 'AUDIO'}, 'currentItemId': 1, 'extendedStatus': {'playerState': 'LOADING', 'media': {'contentId': 'https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav', 'streamType': 'BUFFERED', 'contentType': 'audio/wav', 'metadata': {'title': 'TTSCast', 'subtitle': 'Jeedom', 'images': [{'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}, {'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}], 'thumb': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', 'metadataType': 0}, 'mediaCategory': 'AUDIO'}, 'mediaSessionId': 4}, 'repeatMode': 'REPEAT_OFF'}], 'requestId': 20}
[2026-05-20 20:26:27] DEBUG  : Media:Updated status <MediaStatus {'metadata_type': 0, 'title': 'TTSCast', 'series_title': None, 'season': None, 'episode': None, 'artist': None, 'album_name': None, 'album_artist': None, 'track': None, 'subtitle_tracks': {}, 'images': [MediaImage(url='https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', height=None, width=None), MediaImage(url='https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', height=None, width=None)], 'supports_pause': True, 'supports_seek': True, 'supports_stream_volume': True, 'supports_stream_mute': True, 'supports_skip_forward': False, 'supports_skip_backward': False, 'current_time': 0, 'content_id': 'https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav', 'content_type': 'audio/wav', 'duration': None, 'stream_type': 'BUFFERED', 'idle_reason': None, 'media_session_id': 4, 'playback_rate': 1, 'player_state': 'IDLE', 'supported_media_commands': 274447, 'volume_level': 1, 'volume_muted': False, 'media_custom_data': {}, 'media_metadata': {'title': 'TTSCast', 'subtitle': 'Jeedom', 'images': [{'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}, {'url': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png'}], 'thumb': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', 'metadataType': 0}, 'current_subtitle_tracks': [], 'last_updated': datetime.datetime(2026, 5, 20, 20, 26, 27, 862550, tzinfo=datetime.timezone.utc)}>
[2026-05-20 20:26:27] DEBUG  : [DAEMON][NETCAST][New_Media_Status] Mini bureau :: STATUS Media change :: <MediaStatus {'metadata_type': 0, 'title': 'TTSCast', ... 'content_id': 'https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav', 'content_type': 'audio/wav', 'duration': None, 'stream_type': 'BUFFERED', 'idle_reason': None, 'media_session_id': 4, 'playback_rate': 1, 'player_state': 'IDLE', ...}>
[2026-05-20 20:26:27] DEBUG  : [DAEMON][Cast] Diffusion lancée :: <MediaStatus player_state='IDLE' idle_reason=None content_id='https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav' content_type='audio/wav'>
[2026-05-20 20:26:27] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.receiver from receiver-0 to *: {'requestId': 0, 'status': {'applications': [{'appId': 'CC1AD845', ..., 'statusText': 'Casting: TTSCast', ...}], 'volume': {'level': 0.20000000298023224, ...}}, 'type': 'RECEIVER_STATUS'}
[2026-05-20 20:26:27] DEBUG  : [DAEMON][COM] Send to jeedom : {'castsRT': {'39854d13-ba25-cfb1-be39-e0f7d047f8ee': {'uuid': '39854d13-ba25-cfb1-be39-e0f7d047f8ee', 'is_stand_by': '0', 'volume_level': 20, 'volume_muted': False, 'display_name': 'Default Media Receiver', 'app_id': 'CC1AD845', 'session_id': '7c277d39-0223-4c6c-9ad2-2f45a017d948', 'status_text': 'Casting: TTSCast', 'realtime': 1, 'status_type': 'cast', 'player_state': 'IDLE', 'is_idle': '1', 'is_busy': '0', 'title': 'TTSCast', 'artist': 'N/A', 'duration': None, 'current_time': 0, 'image': 'https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png', 'album_name': 'N/A', 'content_type': 'audio/wav', 'stream_type': 'BUFFERED', 'last_updated': '20/05/2026 - 20:26:27'}}}
[2026-05-20 20:26:27] DEBUG  : Starting new HTTP connection (1): 127.0.0.1:80
[2026-05-20 20:26:27] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.media from 7c277d39-0223-4c6c-9ad2-2f45a017d948 to sender-0: {'type': 'LOAD_FAILED', 'requestId': 20, 'itemId': 1}
[2026-05-20 20:26:27] DEBUG  : Media:Load failed with code None(unknown code) for queue item id 1
[2026-05-20 20:26:27] DEBUG  : Media:Not firing load failed
[2026-05-20 20:26:27] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.media from 7c277d39-0223-4c6c-9ad2-2f45a017d948 to *: {'type': 'MEDIA_STATUS', 'status': [{'mediaSessionId': 4, 'playbackRate': 1, 'playerState': 'IDLE', 'currentTime': 0, 'supportedMediaCommands': 274447, 'volume': {'level': 1, 'muted': False}, 'currentItemId': 1, 'idleReason': 'ERROR'}], 'requestId': 0}
[2026-05-20 20:26:27] DEBUG  : Media:Updated status <MediaStatus {'metadata_type': 0, 'title': 'TTSCast', ... 'content_id': 'https://jeedom.mondomaine.tld/plugins/ttscast/core/php/ttscast.audio.proxy.php?type=tts&file=bd3e25e645533ad14c87ce63786f84fa.wav', 'content_type': 'audio/wav', 'idle_reason': 'ERROR', 'player_state': 'IDLE', ...}>
[2026-05-20 20:26:27] DEBUG  : [DAEMON][NETCAST][New_Media_Status] Mini bureau :: STATUS Media change :: <MediaStatus ... 'idle_reason': 'ERROR', 'player_state': 'IDLE' ...>
[2026-05-20 20:26:28] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.receiver from receiver-0 to *: {'requestId': 0, 'status': {'applications': [{'appId': 'CC1AD845', ..., 'statusText': 'Default Media Receiver', ...}], 'volume': {'level': 0.20000000298023224, ...}}, 'type': 'RECEIVER_STATUS'}
[2026-05-20 20:26:28] DEBUG  : http://127.0.0.1:80 "POST /plugins/ttscast/core/php/jeettscast.php?apikey=*** HTTP/1.1" 200 0
[2026-05-20 20:26:28] DEBUG  : [DAEMON][COM] Send to jeedom: {'castsRT': {'39854d13-ba25-cfb1-be39-e0f7d047f8ee': { ... 'player_state': 'IDLE', 'is_idle': '1', 'is_busy': '0', 'content_type': 'audio/wav', 'stream_type': 'BUFFERED', 'last_updated': '20/05/2026 - 20:26:27', ... 'status_text': 'Default Media Receiver'}}}
[2026-05-20 20:26:32] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from Tr@n$p0rt-0 to Tr@n$p0rt-0: {'type': 'PING'}
[2026-05-20 20:26:32] DEBUG  : [Mini bureau([IP-MINI-BUREAU]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PONG'}
[2026-05-20 20:26:34] DEBUG  : Resolved service HostServiceInfo(host='[IP-HOME-MAX]', port=8009) to [IP-HOME-MAX]
[2026-05-20 20:26:34] DEBUG  : Resolved service HostServiceInfo(host='[IP-HOME-MAX]', port=8009) to [IP-HOME-MAX]
[2026-05-20 20:26:34] DEBUG  : [Chromecast Ultra rdc([IP-CC-RDC]):8009] Sending: Message urn:x-cast:com.google.cast.tp.heartbeat from sender-0 to receiver-0: {'type': 'PING', 'requestId': 17}
[2026-05-20 20:26:34] DEBUG  : [Chromecast Ultra rdc([IP-CC-RDC]):8009] Received: Message urn:x-cast:com.google.cast.tp.heartbeat from receiver-0 to sender-0: {'type': 'PONG'}
[2026-05-20 20:26:34] DEBUG  : Resolved service HostServiceInfo(host='[IP-AMPLI-SALON]', port=8009) to [IP-AMPLI-SALON]

et côté log TTS CAST:

[2026-05-20 22:26:22] DEBUG  [CMD] LogicalId :: tts
[2026-05-20 22:26:22] DEBUG  [CMD] tts :: {"background":"0","title":"\"volume\": 20, \"ding\": true, \"wait\": 1, \"style\": \"Dans un contexte \u00e9pique de d\u00e9marrage d'une session de jeu video, avec un ton humoristique mais t\u00e9n\u00e9breux tout en restant amical et pas effrayant pour un enfant. fin en envol\u00e9e lyrique !\", \"engine\": \"geminitts\"","message":"test de synth\u00e8se vocale, allons y les amis, on d\u00e9marre la session !!","cmdNotification":""}
[2026-05-20 22:26:22] DEBUG  [CMD] tts (Message / GoogleUUID / CmdNotification) :: test de synthèse vocale, allons y les amis, on démarre la session !! / 39854d13-ba25-cfb1-be39-e0f7d047f8ee / 0
[2026-05-20 22:26:22] DEBUG  [PlayTTS] ttsOptions After Array :: "volume": 20, "ding": true, "wait": 1, "style": "Dans un contexte épique de démarrage d'une session de jeu video, avec un ton humoristique mais ténébreux tout en restant amical et pas effrayant pour un enfant. fin en envolée lyrique !", "engine": "geminitts"
[2026-05-20 22:26:22] DEBUG  [CALLBACK] TTSCast TTS Last Message
[2026-05-20 22:26:22] DEBUG  [CALLBACK] TTS Last Message [Mini bureau] :: "test de synthèse vocale, allons y les amis, on démarre la session !!" (UUID=39854d13-ba25-cfb1-be39-e0f7d047f8ee)
[2026-05-20 22:26:27] DEBUG  [CALLBACK] TTSCast RealTime
[2026-05-20 22:26:27] DEBUG  [CALLBACK] TTSCast RealTime :: 39854d13-ba25-cfb1-be39-e0f7d047f8ee
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Status Type :: cast
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: online
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: is_idle = 1
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: is_busy = 0
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_level = 20
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_muted =
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedule
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedulets
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: player_state = IDLE
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: display_name = Default Media Receiver
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: app_id = CC1AD845
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: session_id = 7c277d39-0223-4c6c-9ad2-2f45a017d948
[2026-05-20 22:26:27] DEBUG  [REALTIME][CAST] Cast cmd event :: status_text = Casting: TTSCast
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: tts_last_message
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: title = TTSCast
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: artist = N/A
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: album_name = N/A
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: duration =
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: current_time = 0
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: content_type = audio/wav
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: stream_type = BUFFERED
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: last_updated = 20/05/2026 - 20:26:27
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: image = https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png
[2026-05-20 22:26:28] DEBUG  [CALLBACK] TTSCast RealTime
[2026-05-20 22:26:28] DEBUG  [CALLBACK] TTSCast RealTime :: 39854d13-ba25-cfb1-be39-e0f7d047f8ee
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Status Type :: cast
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: online
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: is_idle = 1
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: is_busy = 0
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_level = 20
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_muted =
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedule
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedulets
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: player_state = IDLE
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: display_name = Default Media Receiver
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: app_id = CC1AD845
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: session_id = 7c277d39-0223-4c6c-9ad2-2f45a017d948
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: status_text = Default Media Receiver
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: tts_last_message
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: title = TTSCast
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: artist = N/A
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: album_name = N/A
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: duration =
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: current_time = 0
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: content_type = audio/wav
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: stream_type = BUFFERED
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: last_updated = 20/05/2026 - 20:26:27
[2026-05-20 22:26:28] DEBUG  [REALTIME][CAST] Cast cmd event :: image = https://jeedom.mondomaine.tld/plugins/ttscast/data/images/tts.png

Bonsoir,

En regardant les logs, je pense comprendre d’où cela vient : dans le plugin, tu as du cocher la case utiliser mon adresse externe sur la page de configuration du plugin : pourquoi ce choix ?

Si c’est bien le cas, peux tu essayer en décochant cette case, sauvegarder, redémarrer le démon, et refaire un essai ?

TiTidom.

j’ai ca depuis 2/3 ans, sinon ca passait pas. je me suis dit de creuser ce sujet justement ! je dois avoir un blocage firewall chelou et je suis justement en train de revoir les règles entre mes VLAN donc ca serait l’occasion.
Mais donc pas de changement récent non plus.

Je vais creuser ce we :slight_smile: j’ai cru voir passer des nouveautés unifi qd même donc j’ai un petit doute.

Salut,

J’ai oublié de préciser : du côté du plugin, j’ai effectué des changements pour permettre la diffusion de fichiers .wav, et donc maintenant toutes les diffusions TTS vers un équipement Google passent par un « proxy » que j’ai codé en php. Et il y a une sécurité dans ce proxy qui dit que la diffusion n’est possible que sur une IP « locale » = donc réseau local exclusivement (alors qu’avant pour la diffusion d’un fichier mp3 de diffusion ou sound ou customsound , l’accès était direct - sans proxy php donc - et sans filtrage « réseau local »)

Bref, c’est très technique, mais au départ c’était pour augmenter la sécurité de ce proxy, mais comme toute mesure de sécurité, il peut y avoir des effets de bords, et j’avais « oublié » dans la bataille que l’on pouvait utiliser les URL externes de Jeedom, et si ton serveur DNS (ubiquiti ou de ton provider) renvoie une IP de type publique pour cet enregistrement DNS = alors le proxy jette la requête (c’est probablement ce qui se passe ici).

Après cela dépend de ton archi réseau chez toi, de ta résolution dns etc…

PS : et je dis pas que cela vient forcément de cela, mais c’est la première chose qui me vient à l’esprit quand tu dis que tu n’as plus de diffusion du tout :wink:

Je regarderai en détails le code ce week-end pour voir comment améliorer ce comportement et à minima ajouter des logs, et en // je te laisse continuer tes tests et me faire un retour :+1: (en tout cas, dans l’absolu, même en inter vlan, pas besoin de cocher cette case pour que la communication soit possible :wink: )

Bonne journée,
TiTidom.

Re,

J’ai pris un peu de temps sur l’heure du déjeuner pour revoir le code, et réfléchir à son évolution.

Plusieurs points :

  • J’ai supprimé le filtrage « adresse ip locale », il y a déjà assez de check fait sans ajouter cette couche qui va générer dans tous les cas des effets de bords :+1:
  • J’ai ajouté des logs dans le « proxy audio » pour que ce soit plus lisible si jamais cela plante

Comme le moteur Gemini TTS est par définition « lent et lourd », il prend du temps pour générer le fichier « son » (TTS) donc :

  • Je suis en train d’implémenter (il faut que je termine les tests) un mode « streaming » pour Gemini TTS pour démarrer la diffusion AVANT la fin de la génération du texte, cela permet de démarrer en 1 seconde en moyenne, au lieu de 4 à 10 sec :open_mouth: (j’ai mis des points de mesure dans le code, je gagne environ 72% de temps avant diffusion)

Si j’ai le temps de finaliser ce soir, je sortirai une nouvelle version BETA la nuit prochaine avec ces changements :wink:

EDIT : la version v1.9.2 BETA sera disponible la nuit prochaine :+1:

Bonne fin de journée,
TiTidom.

wouhou, ca va mériter du test tout cela :wink: update en cours :slight_smile:
je refais des tests et je te dis.

Pour info ca marche nickel ! merci ! et j’ai décoché l’option « url externe » sans impact.
Je viens juste de me prendre un rate limit a force d’essayer par contre, je sais pas encore où est ce réglage sur la console google :wink:

[2026-05-25 06:58:45] ERROR  : [DAEMON][GeminiTTS] Exception :: 429 RESOURCE_EXHAUSTED. {'error': {'code': 429, 'message': 'Resource exhausted. Please try again later. Please refer to https://cloud.google.com/vertex-ai/generative-ai/docs/error-code-429 for more details.', 'status': 'RESOURCE_EXHAUSTED'}}
[2026-05-25 06:58:45] DEBUG  : Traceback (most recent call last):
File "/var/www/html/plugins/ttscast/resources/ttscastd/ttscastd.py", line 1749, in geminiTTS
for chunk in streamIterator:
^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/models.py", line 6583, in generate_content_stream
for chunk in response:
^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/models.py", line 4949, in _generate_content_stream
for response in self._api_client.request_streamed(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/_api_client.py", line 1628, in request_streamed
session_response = self._request(http_request, http_options, stream=True)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/_api_client.py", line 1404, in _request
return self._retry(self._request_once, http_request, stream)  # type: ignore[no-any-return]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/tenacity/__init__.py", line 477, in __call__
do = self.iter(retry_state=retry_state)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/tenacity/__init__.py", line 378, in iter
result = action(retry_state)
^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/tenacity/__init__.py", line 420, in exc_check
raise retry_exc.reraise()
^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/tenacity/__init__.py", line 187, in reraise
raise self.last_attempt.result()
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/pyenv/versions/3.12.12/lib/python3.12/concurrent/futures/_base.py", line 449, in result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File "/opt/pyenv/versions/3.12.12/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/tenacity/__init__.py", line 480, in __call__
result = fn(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/_api_client.py", line 1381, in _request_once
errors.APIError.raise_for_response(response)
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/errors.py", line 155, in raise_for_response
cls.raise_error(response.status_code, response_json, response)
File "/var/www/html/plugins/ttscast/resources/venv/lib/python3.12/site-packages/google/genai/errors.py", line 184, in raise_error
raise ClientError(status_code, response_json, response)
google.genai.errors.ClientError: 429 RESOURCE_EXHAUSTED. {'error': {'code': 429, 'message': 'Resource exhausted. Please try again later. Please refer to https://cloud.google.com/vertex-ai/generative-ai/docs/error-code-429 for more details.', 'status': 'RESOURCE_EXHAUSTED'}}
[2026-05-25 06:58:45] ERROR  : [DAEMON][TTS] GeminiTTS streaming :: échec de la pré-lecture
1 « J'aime »