TTS Cast via API : Ne supporte pas les espaces dans le message

Bonjour,

J’ai un script qui envoi un message à mon enceinte Nest via TTS mais qui ne lit que le premier mot et s’arrête au premier espace. Je ne vois pas ce qui cloche (problème d’encodage ? ).
J’utilise le moteur Jeedom TTS (Local)

Le message passe bien via un scenario.

Voici l’url envoyé à JEEDOM :
https://192.168.0.xx/core/api/jeeApi.php?apikey=xxxxxx&type=scenario&id=217&action=start&tags=level%3DINFO%20title%3D[INFORMATION%20JEEDOM]%20message=« Dernier%20avertissement:La%20fenêtre%20de%20la%20Chambre%20de%20Mathis%20est%20restée%20ouverte »

Une idée ?


Informations Jeedom

Core : 4.5.2 (master)
DNS Jeedom : non

Plugin : TTS Cast
Version : 2026-01-07 01:17:43 (stable)
Statut Démon : Démarré - (2026-01-30 18:10:26)

Salut,

tu peux montrer ton scénario et le log de ce dernier ?

Met ton url en texte préformaté pour que le forum ne remplace pas les quotes par exemple

OK.

Url : https://192.168.0.15/core/api/jeeApi.php?apikey=95qEJUXQw0iYkTmAx01GVieabqG7QuwB&type=scenario&id=217&action=start&tags=level%3DINFO%20title%3D%5BINFORMATION%20JEEDOM%5D%20message%3D%22Dernier%20avertissement%3ALa%20fen%C3%AAtre%20de%20la%20Chambre%20de%20Mathis%20est%20rest%C3%A9e%20ouverte%22

Le scénario :

Le Log:
------------------------------------ [2026-01-30 18:28:41][SCENARIO] **-- Début :** "Dernier avertissement:La fenêtre de la Chambre de Mathis est restée ouverte". Tags : {"#level#":"INFO","#title#":"[INFORMATION","#message#":"\"Dernier avertissement:La fenêtre de la Chambre de Mathis est restée ouverte\"","#trigger#":"api","#trigger_message#":"Scénario exécuté sur appel API"} [2026-01-30 18:28:41][SCENARIO] - Exécution du sous-élément de type [action] : action [2026-01-30 18:28:41][SCENARIO] Exécution de la commande [SALON][Nest][TTS] avec comme option(s) : {"background":"0","title":"","message":"\"Dernier avertissement:La fen\u00eatre de la Chambre de Mathis est rest\u00e9e ouverte\""} [2026-01-30 18:28:41][SCENARIO] Fin correcte du scénario

Merci.

De ce qu’on voit ici, le scénario semble bien récupérer l’info correctement et la transmettre à la commande TTS.

Du coup si tu n’a pas le résultat escompté, je pense qu’il faudrait mettre les logs du plugin en debug (en redémarrant le daemon pour que ce soit pris en compte) et refaire les essais sur toute la chaine.

Ca devrait permettre de voir où ça dysfonctionne.

Penser à remettre les logs en info à l’issue.

LOG TTSCast

[2026-01-30 18:51:20] DEBUG  [CMD] LogicalId :: tts
[2026-01-30 18:51:20] DEBUG  [CMD] tts :: {"background":"0","title":"","message":"\"Dernier avertissement:La fen\u00eatre de la Chambre de Mathis est rest\u00e9e ouverte\""}
[2026-01-30 18:51:20] DEBUG  [CMD] tts (Message / GoogleUUID) :: "Dernier avertissement:La fenêtre de la Chambre de Mathis est restée ouverte" / dxxxx8ceb-7061-d041-942e-ca396388e763
[2026-01-30 18:51:20] DEBUG  [PlayTTS] ttsOptions After Array ::
[2026-01-30 18:51:21] DEBUG  [CALLBACK] TTSCast RealTime
[2026-01-30 18:51:21] DEBUG  [CALLBACK] TTSCast RealTime :: dxxx38ceb-7061-d041-942e-ca396388e763
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Status Type :: cast
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: online
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: is_idle
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: is_busy
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_level = 0
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_muted =
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedule
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedulets
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: player_state
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd event :: display_name = N/A
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd event :: app_id = N/A
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd event :: session_id = N/A
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd event :: status_text =
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: title
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: artist
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: album_name
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: duration
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: current_time
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: content_type
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: stream_type
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: last_updated
[2026-01-30 18:51:21] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: image
[2026-01-30 18:51:22] DEBUG  [CALLBACK] TTSCast RealTime
[2026-01-30 18:51:22] DEBUG  [CALLBACK] TTSCast RealTime :: dxxxxceb-7061-d041-942e-ca396388e763
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Status Type :: media
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: online
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: is_idle = 0
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: is_busy = 1
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_level = 60
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_muted =
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedule
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedulets
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: player_state = PLAYING
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: display_name = Default Media Receiver
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: app_id = CC1AD845
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: session_id = 8b2b6c15-4829-4b52-88e5-c68272b32b39
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: status_text = Diffusion: TTSCast
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: title = TTSCast
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: artist = N/A
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: album_name = N/A
[2026-01-30 18:51:22] DEBUG  [REALTIME][CAST] Cast cmd event :: duration = 1.17551
[2026-01-30 18:51:23] DEBUG  [REALTIME][CAST] Cast cmd event :: current_time = 0
[2026-01-30 18:51:23] DEBUG  [REALTIME][CAST] Cast cmd event :: content_type = audio/mp3
[2026-01-30 18:51:23] DEBUG  [REALTIME][CAST] Cast cmd event :: stream_type = BUFFERED
[2026-01-30 18:51:23] DEBUG  [REALTIME][CAST] Cast cmd event :: last_updated = 30/01/2026 - 18:51:22
[2026-01-30 18:51:23] DEBUG  [REALTIME][CAST] Cast cmd event :: image = http://192.168.0.15/plugins/ttscast/data/images/tts.png
[2026-01-30 18:51:24] DEBUG  [CALLBACK] TTSCast RealTime
[2026-01-30 18:51:24] DEBUG  [CALLBACK] TTSCast RealTime :: dxxxxb-7061-d041-942e-ca396388e763
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Status Type :: cast
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: online
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: is_idle = 1
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: is_busy = 0
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_level = 60
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: volume_muted =
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedule
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd NON EXIST :: lastschedulets
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: player_state = UNKNOWN
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: display_name = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: app_id = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: session_id = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: status_text =
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: title = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: artist = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: album_name = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: duration =
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: current_time = 0
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: content_type = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: stream_type = UNKNOWN
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: last_updated = N/A
[2026-01-30 18:51:24] DEBUG  [REALTIME][CAST] Cast cmd event :: image =

Log TTSCastDaemon

[2026-01-30 18:51:20] DEBUG  : [DAEMON][HANDLER] Message read from socket :: b'{"cmd": "action", "cmd_action": "tts", "ttsLang": "fr-FR", "ttsEngine": "jeedomtts", "ttsSpeed": "1.0", "ttsOptions": "", "ttsText": "\\"Dernier avertissement:La fen\\u00eatre de la Chambre de Mathis est rest\\u00e9e ouverte\\"", "ttsGoogleUUID": "dxxxxxeb-7061-d041-942e-ca396388e763", "ttsVoiceName": "fr-FR-Chirp3-HD-Erinome", "ttsRSSVoiceName": "fr-fr-Iva", "ttsRSSSpeed": "0", "apikey": "***"}'
[2026-01-30 18:51:20] DEBUG  : [DAEMON][HANDLER] Client disconnected from [127.0.0.1:52488]
[2026-01-30 18:51:20] DEBUG  : [DAEMON][SOCKET] Message received in socket JEEDOM_SOCKET_MESSAGE
[2026-01-30 18:51:20] DEBUG  : [DAEMON][SOCKET] Action
[2026-01-30 18:51:20] DEBUG  : [DAEMON][SOCKET] Generate And Play TTS
[2026-01-30 18:51:20] DEBUG  : [DAEMON][SOCKET] TTS :: {'cmd': 'action', 'cmd_action': 'tts', 'ttsLang': 'fr-FR', 'ttsEngine': 'jeedomtts', 'ttsSpeed': '1.0', 'ttsOptions': '', 'ttsText': '"Dernier avertissement:La fenêtre de la Chambre de Mathis est restée ouverte"', 'ttsGoogleUUID': 'dxxxxxceb-7061-d041-942e-ca396388e763', 'ttsVoiceName': 'fr-FR-Chirp3-HD-Erinome', 'ttsRSSVoiceName': 'fr-fr-Iva', 'ttsRSSSpeed': '0', 'apikey': 'xxxxxxxxx'}
[2026-01-30 18:51:20] DEBUG  : [DAEMON][TTS] Check des répertoires
[2026-01-30 18:51:20] DEBUG  : [DAEMON][TTS] TTSEngine = jeedomtts
[2026-01-30 18:51:20] DEBUG  : [DAEMON][TTS] Nom du fichier à générer :: /tmp/jeedom/ttscast_cache/0eb40eaef82ea450bb33b9cb2d8a0066.mp3
[2026-01-30 18:51:20] DEBUG  : [DAEMON][TTS] Le fichier TTS existe déjà dans le cache :: /tmp/jeedom/ttscast_cache/0eb40eaef82ea450bb33b9cb2d8a0066.mp3
[2026-01-30 18:51:20] DEBUG  : [DAEMON][TTS] URL du fichier TTS à diffuser :: http://192.168.0.xx/plugins/ttscast/data/cache/0eb40eaef82ea450bb33b9cb2d8a0066.mp3
[2026-01-30 18:51:20] DEBUG  : [DAEMON][Cast] Diffusion sur le Google Home :: dxxxxxx-7061-d041-942e-ca396388e763
[2026-01-30 18:51:20] DEBUG  : [DAEMON][Cast] Chromecast trouvé, tentative de lecture TTS

En regardant dans le dernier log (TTSCast Daemon). Je vois que le fichier mp3 générer est incomplet.
Il ne prend que le premier mot.

Il y a aussi une triple quote qui entoure le message…
‹ ttsText ›: ‹ « Dernier avertissement:La fenêtre de la Chambre de Mathis est restée ouverte » ›

Bonsoir,

On voit ici que ton URL est encodée pour envoyer un tag entre " (guillemet), c’est le %22 qu’on voit dedans :slight_smile: , donc dans ton scénario, le champ TTS est construit avec une chaine qui démarre avec des guillemets (ce que l’on voit également dans les logs du plugin, et que que tu évoques dans un de tes messages :

Ce « triple quote » n’est que le résultat qu’envoie ta commande et le tag(message).

Et enfin, si tu utilises le moteur TTS de Jeedom par défaut (pico ou espeak), il est probablement appelé par jeedom via une ligne de commande (je ne suis pas allé vérifier, c’est une supposition), et comme la ligne de commande par sécurité doit « entourer » la chaine à générer par des guillemets elle aussi, ca donne une ligne de commande bash où il doit y avoir un truc du genre pico -monoption -monautreoption ""Dernier avertissement...

Donc, il voir un double quote "" (qui s’annule donc) + un mot Dernier qu’il prend pour la phrase à générer, voit un espace et se dit que la suite ce sont des paramètres erronés ou à ignorer… (l’espace en linux est un séparateur de paramètre)

… Et il te génère juste le « premier mot » :slight_smile:

Il faudrait voir lorsque tu définis ton tag, pour ne pas ajouter les " autour de sa valeur.

Et/Ou ne plus utiliser le moteur TTS pico ou espeak qui sont à éviter si on tient à ses oreilles :rofl: :rofl: :rofl: :stuck_out_tongue:

TiTidom.

@gdseb hum par contre si je peux me permettre, personnellement je n’aurais pas fait comme ça pour lancer l’action via l’api http.

Plutôt que d’appeler un scénario via l’api et de passer le message à diffuser dans un tag, perso je ferais plutôt une commande dans un virtuel contenant le message (ou une variable) et je mettrai à jour cette dernière via l’api http.

De ce type : http://url/core/api/jeeApi.php?apikey=xxxx&type=cmd&id=5299&value=toto

Et je mets la commande en question (ou la variable) comme déclencheur de ton scénario.
Donc dès que la commande contenant le message est mise à jour, le scénario se déclenche et diffuse le message.

Je pense que ça à plusieurs avantages :

  • Ca simplifie l’appel avec beaucoup moins de paramètres
  • Tu n’a pas à gérer les quotes spécifiques au passage du tag
  • Ca permet plus de souplesse par exemple si tu veux avoir un scénario de test, ou faire une V2 de ton scénario, tu peux gérer directement le changement de déclencheur coté jeedom sans que l’url appelée par l’api ne change.
1 « J'aime »

a man giving a thumbs up in front of a sign that says ca me semble asssez evident oui|833x458.15000000000003

OK.
Merci pour tes conseils, je vais essayer d’adapter tout ça.

1 « J'aime »