Aller au contenu
fredokl

QuickApp - TTS Google

Recommended Posts

Bonjour à tous,

Voici un QuickApp pour faire parler votre Google Nest Mini ou Google Nest Hub.

Pour cela, il faut installer auparavant Node-red sur un NAS, un Raspberry ou autres choses.

Merci à @flacon030 pour son idée de départ: 

Il fonctionne parfaitement. Il est libre de modification et d'amélioration.

 

V1.1

Le code est amélioré. les messages et les liens des fichiers audios sont à mettre directement sur le QA.

Deux automates Node-Red sont maintenant requis pour fonctionner (1 pour les messages et 1 pour les fichiers audios).

 

Tuto  pour les automates:

Vu d'ensemble:

Annonce_01.png.41f421acdd90ffedc1332e0822c0aeef.png

Vous pouvez ajouter autant de Google Nest Mini ou Hub que vous le souhaitez après le node "function".

 

AUTOMATE MESSAGES

1/ Node Http In

Annonce_02.png.0031e9a694bcb6c9a87f87f71ac6613f.png

2/ Node Function

Annonce_03.png.630e136950c83595a99c9ec9c69e9835.png

3/ Node Google Notify

Annonce_04.png.2b7b8b2db4d27e9727e94f061a056dad.png

 

AUTOMATE AUDIOS

1/ Node Http In

Son_1.png.56a81d61180ff1bbab133c5739b680c1.png

2/ Node Function

Son_2.png.d57b3a71cdd8edc441dba157b4ebe11e.png

3/ Node Google Notify

Son_3.png.01b176bbf33cb3b270e3ab00f90da3a3.png

 

Code:

-- Google TTS pour Fibaro HC3
-- Merci à falcon030 pour son code qui a été ma base de départ (https://www.domotique-fibaro.fr/topic/14086-faire-dire-une-phrase-a-google-home/)
-- Je me suis également énormément adapté du QA Free (https://www.domotique-fibaro.fr/topic/14281-quickapp-freesms/)
-- Nécessite l'installation de Node-Red sur Synology, QNAP, Raspberry ou autres...(https://nodered.org)
-- De fredokl pour www.domotique-fibaro.fr
-- 06.12.2021 Version 1.0
-- 19.12.20221 Version 1.1
-- Amélioration du code
-- Les messages et liens des fichiers audios sont mis dans le code du QA
-- La partie Node-Red est grandement simplifiée
--------------------------------------------------------
-- Initialisation
--------------------------------------------------------
function QuickApp:onInit()
        __TAG = "QA_"..plugin.mainDeviceId.."GOOGLETTS"
        self:updateProperty("deviceIcon", 1155) -- ID Icône
        self:debug("onInit")
end
--------------------------------------------------------
-- Paramètrages des boutons
--------------------------------------------------------
-- Annonces
function QuickApp:user1(event) self:debug("Message user1") self:sendmsg("Bienvenue à la maison") end    -- Message
function QuickApp:user2(event) self:debug("Message user2") self:sendmsg("Au revoir") end
-- Sirènes & Carillons
function QuickApp:sirene1(event) self:debug("Message sirene1") self:sendSon("Son_Alarme_1.mp3") end     -- Nom du fichier audio
function QuickApp:sirene2(event) self:debug("Message sirene2") self:sendSon("Son_Alarme_2.mp3") end


--------------------------------------------------------
-- Connexion HTTP POST ANNONCES
--------------------------------------------------------
function QuickApp:sendmsg(message)
    local http = net.HTTPClient()
    local requestBody = {
        msg = message
    }
    http:request("http://192.168.1.xxx:1880/annonce", {     -- Mettre votre commande http ici
        
	success = function(response)
		if response.status == 200 then
			print('OK, réponse : '.. response.data)
		else
			print("Erreur : status=" .. tostring(response.status))
		end
	end,
	error = function(err)
		print("Erreur : " .. err)
	end,
	options = {
            data = json.encode(requestBody),
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json",
            }
        },
})
end

--------------------------------------------------------
-- Connexion HTTP POST CARILLONS & MP3
--------------------------------------------------------
function QuickApp:sendSon(filename)
    local http = net.HTTPClient()
    local requestBody = {
        url = "http://192.168.1.xxx/Sons/"..filename    -- Metter le lien vers votre dossier sons ici
    }
    http:request("http://192.168.1.xxx:1880/sons", {    -- Mettre votre commande http ici
        
	success = function(response)
		if response.status == 200 then
			print('OK, réponse : '.. response.data)
		else
			print("Erreur : status=" .. tostring(response.status))
		end
	end,
	error = function(err)
		print("Erreur : " .. err)
	end,
	options = {
            data = json.encode(requestBody),
            method = "POST",
            headers = {
                ["Content-Type"] = "application/json",
            }
        },
})
end

Fichier QuickApp:

TTS_Google.fqa

 

Google_Mini.png

Modifié par fredokl
Nouvelle version
  • Like 5
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

super merci je ne savais pas comment simplifier tous cela

 

Juste une question, que mettre dans nodered a l'adresse "URL"?

J'ai essayer "message",

Car dans le debug j'ai une erreur 404

Modifié par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait, j'ai suivi ton "tuto", j'ai juste simplifié le code pour éviter d'avoir "pleins" de lignes de requêtes http.

Les messages sont créés sur Node-red. Rien ne change à part ça.

Partager ce message


Lien à poster
Partager sur d’autres sites

Est-ce transposable sur une Alexa selon vous ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour à tous,

Je n'arrive pas à faire parler mon google home. J'ai ce message d'erreur dans nodered.

J'ai installer nodered sous docker sur un Syno. Je pense qu'il n'arrive pas à créer le ficher temporaire mp3.

Quelqu'un pour m'aider svp ? Merci

Capture.PNG

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

Cela fonctionne pour les fichiers MP3 et pas pour les message c'est bien cela?

dans la fonction tu as bien cela

msg.playMessage = msg.payload.msg;
return msg;

tu as bien créer le QA sur la HC3, je pense que oui si non la partie sonnerie ne fonctionnerait pas

tu as bien renseigner l'adresse ip et le port de ton node-res dans le QA a cette lignes

 http:request("http://192.168.1.231:1880/annonce", {     -- Mettre votre commande http adresse ici

Dans la console de debug du docker tu devrait voir cela

ode-red-docker@2.1.4 start /usr/src/node-red
> node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"

7 Aug 15:22:17 - [info] 

Welcome to Node-RED
===================

7 Aug 15:22:17 - [info] Node-RED version: v2.1.4
7 Aug 15:22:17 - [info] Node.js  version: v14.18.2
7 Aug 15:22:17 - [info] Linux 5.10.60-qnap x64 LE
7 Aug 15:22:17 - [info] Loading palette nodes
7 Aug 15:22:18 - [info] Settings file  : /data/settings.js
7 Aug 15:22:18 - [info] Context store  : 'default' [module=memory]
7 Aug 15:22:18 - [info] User directory : /data
7 Aug 15:22:18 - [warn] Projects disabled : editorTheme.projects.enabled=false
7 Aug 15:22:18 - [info] Flows file     : /data/flows.json
7 Aug 15:22:18 - [info] Server now running at http://127.0.0.1:1880/
7 Aug 15:22:18 - [warn] 

---------------------------------------------------------------------
Your flow credentials file is encrypted using a system-generated key.

If the system-generated key is lost for any reason, your credentials
file will not be recoverable, you will have to delete it and re-enter
your credentials.

You should set your own key using the 'credentialSecret' option in
your settings file. Node-RED will then re-encrypt your credentials
file using your chosen key the next time you deploy a change.
---------------------------------------------------------------------

7 Aug 15:22:18 - [info] Starting flows
fileServer listening on ip 192.168.1.231 and port 8098
destroying media server: <ref *1> Server {
  maxHeaderSize: undefined,
  insecureHTTPParser: undefined,
  _events: [Object: null prototype] {
    request: [Function (anonymous)],
    connection: [Function: connectionListener]
  },
  _eventsCount: 2,
  _maxListeners: undefined,
  _connections: 0,
  _handle: TCP {
    reading: false,
    onconnection: [Function: onconnection],
    [Symbol(owner_symbol)]: [Circular *1]
  },
  _usingWorkers: false,
  _workers: [],
  _unref: false,
  allowHalfOpen: true,
  pauseOnConnect: false,
  httpAllowHalfOpen: false,
  timeout: 0,
  keepAliveTimeout: 5000,
  maxHeadersCount: null,
  headersTimeout: 60000,
  requestTimeout: 0,
  _connectionKey: '6::::8098',
  [Symbol(IncomingMessage)]: [Function: IncomingMessage],
  [Symbol(ServerResponse)]: [Function: ServerResponse],
  [Symbol(kCapture)]: false,
  [Symbol(async_id_symbol)]: 286
}
destroying media server: Server {
  maxHeaderSize: undefined,
  insecureHTTPParser: undefined,
  _events: [Object: null prototype] {
    request: [Function (anonymous)],
    connection: [Function: connectionListener],
    close: [Function: bound onceWrapper] { listener: [Function (anonymous)] }
  },
  _eventsCount: 3,
  _maxListeners: undefined,
  _connections: 0,
  _handle: null,
  _usingWorkers: false,
  _workers: [],
  _unref: false,
  allowHalfOpen: true,
  pauseOnConnect: false,
  httpAllowHalfOpen: false,
  timeout: 0,
  keepAliveTimeout: 5000,
  maxHeadersCount: null,
  headersTimeout: 60000,
  requestTimeout: 0,
  _connectionKey: '6::::8098',
  [Symbol(IncomingMessage)]: [Function: IncomingMessage],
  [Symbol(ServerResponse)]: [Function: ServerResponse],
  [Symbol(kCapture)]: false,
  [Symbol(async_id_symbol)]: 286
}
7 Aug 15:22:18 - [info] Started flows
fileServer listening on ip 192.168.1.231 and port 8098
destroying media server: <ref *1> Server {
  maxHeaderSize: undefined,
  insecureHTTPParser: undefined,
  _events: [Object: null prototype] {
    request: [Function (anonymous)],
    connection: [Function: connectionListener]
  },
  _eventsCount: 2,
  _maxListeners: undefined,
  _connections: 0,
  _handle: TCP {
    reading: false,
    onconnection: [Function: onconnection],
    [Symbol(owner_symbol)]: [Circular *1]
  },
  _usingWorkers: false,
  _workers: [],
  _unref: false,
  allowHalfOpen: true,
  pauseOnConnect: false,
  httpAllowHalfOpen: false,
  timeout: 0,
  keepAliveTimeout: 5000,
  maxHeadersCount: null,
  headersTimeout: 60000,
  requestTimeout: 0,
  _connectionKey: '6::::8098',
  [Symbol(IncomingMessage)]: [Function: IncomingMessage],
  [Symbol(ServerResponse)]: [Function: ServerResponse],
  [Symbol(kCapture)]: false,
  [Symbol(async_id_symbol)]: 315
}
fileServer listening on ip 192.168.1.231 and port 8098

 

Modifié par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'arrive pas à coller ma console de debug mais j'ai une ligne différente de toi : MediaServerUrl ne correspond pas à l'IP de nodered.

Lorsque je lance le message dans le QA, google home fait "ding dong" mais pas de message.

Pourquoi 172.17.0.2 et le port 8098 ?

J'ai suivi le tuto scrupuleusement...

http:request("http://10.0.0.16:1880/annonce", {     -- Mettre votre commande http adresse ici

Merci à toi

 
 
 
 
 
 
      ip: '10.0.0.19',                                                                                                      
      playVolumeLevel: 0.2,                                                                                                 
      playMessage: 'Bienvenue à la maison',                                                                                 
      language: 'fr',                                                                                                       
      speakSlow: false,                                                                                                     
      mediaServerUrl: 'http://172.17.0.2',                                                                                  
      mediaServerPort: '8098',                                                                                              
      cacheFolder: '/tmp'                                                                                                   
    },                                                                                                                      
    callback: [Function (anonymous)]                                                                                        
  }                                                                                                                         
]                                                                                                                           
Queued messages [                                                                                                           
  {                                                                                                                         
    devicePlaySettings: {                                                                                                   
      msg: [Object],                                                                                                        
      sourceNode: [GoogleNotify],                                                                                           
      ip: '10.0.0.19',                                                                                                      
      playVolumeLevel: 0.2,                                                                                                 
      playMessage: 'Bienvenue à la maison',                                                                                 
      language: 'fr',                                                                                                       
      speakSlow: false,                                                                                                     
      mediaServerUrl: 'http://172.17.0.2',                                                                                  
      mediaServerPort: '8098',                                                                                              
      cacheFolder: '/tmp'                                                                                                   
    },                                                                                                                      
    callback: [Function (anonymous)]                                                                                        
  }                                                                                                                         
]                                                                                                                           
setting up mediaPlayUrl                                                                                                     
preparing socket for connection to device                                                                                   
connecting with device                                                                                                      
preparing player on device                                                                                                  
preparing to stop any playing media                                                                                         
inital vol level {                                                                                                          
  controlType: 'master',                                                                                                    
  level: 0.20000000298023224,                                                                                               
  muted: false,                                                                                                             
  stepInterval: 0.019999999552965164                                                                                        
} device 10.0.0.19                                                                                                          
Vol level set to  0.2 device  10.0.0.19                                                                                     
preparing to play media                                                                                                     
mediaPlayUrl: http://172.17.0.2:8098/BIENVENUE_%C3%80_LA_MAISON-fr-normal.mp3                                               
status broadcast currentPlayerState=IDLE for host 10.0.0.19                                                                 
status broadcast currentPlayerState=IDLE for host 10.0.0.19                                                                 
status broadcast currentPlayerState=BUFFERING for host 10.0.0.19                                                            
status broadcast currentPlayerState=BUFFERING for host 10.0.0.19                                                            
media http://172.17.0.2:8098/BIENVENUE_%C3%80_LA_MAISON-fr-normal.mp3 not available Error: Load failed                      
    at /data/node_modules/castv2-client/lib/controllers/media.js:75:23                                                      
    at fn.onmessage (/data/node_modules/castv2-client/lib/controllers/request-response.js:27:7)                             
    at fn.emit (node:events:539:35)                                                                                         
    at Channel.onmessage (/data/node_modules/castv2-client/lib/controllers/controller.js:16:10)                             
    at Channel.emit (node:events:527:28)                                                                                    
    at Client.onmessage (/data/node_modules/castv2/lib/channel.js:23:10)                                                    
    at Client.emit (node:events:539:35)                                                                                     
    at PacketStreamWrapper.onpacket (/data/node_modules/castv2/lib/client.js:81:10)                                         
    at PacketStreamWrapper.emit (node:events:527:28)                                                                        
    at TLSSocket.<anonymous> (/data/node_modules/castv2/lib/packet-stream-wrapper.js:28:16)                                 
status broadcast currentPlayerState=IDLE for host 10.0.0.19                                                                 
status broadcast currentPlayerState=IDLE for host 10.0.0.19                                                                 
^C7 Aug 19:26:44 - [info] Stopping flows                                                                                    
7 Aug 19:26:44 - [info] Stopped flows                                                                                       
                                                                                                                            
 

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est bon j'ai trouvé...

Il faut renseigner le média server dans le google node et renseigner le port 8098 dans le container nodered et ça marche...

en tout cas merci pour ton aide ça m'a permis de voir l'erreur...

 

image.png.ed33c6273f3c5401c7dcacac81ed18da.png

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon je me retrouve encore bêtement bloqué avec une erreur 404 dans le debug du QA

Je ne me souvient plus de se que j'avais fait pour régler le probleme

 

Erreur bête , j'ai mis méthode GET au lieu de POST

 

 

Modifié par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 07/08/2022 à 21:52, Stillwatter a dit :

C'est bon j'ai trouvé...

Il faut renseigner le média server dans le google node et renseigner le port 8098 dans le container nodered et ça marche...

en tout cas merci pour ton aide ça m'a permis de voir l'erreur...

 

image.png.ed33c6273f3c5401c7dcacac81ed18da.png

tu renseigne ou le port 8098 dans le contener nodred?

Merci

Partager ce message


Lien à poster
Partager sur d’autres sites

×