Closed Ludwig151 closed 5 years ago
Crée un fichier notifier.js
au même niveau que le fichier configuration.json
), avec le contenu suivant (qui est une adaptation du plugin) :
var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
var GoogleTTS = require('google-tts-api');
var request = require('request-promise-native');
var configuration = require('./configuration');
const host = configuration.plugins.notifier.host;
const voice = configuration.plugins.notifier.voice;
var AssistantNotifier = function() {}
/**
* Fonction appelée par le système central
*
* @param {String} text Le texte à lire (par exemple: "bonjour et bienvenue")
*/
function action (text) {
return new Promise(function(prom_res) {
// si 'text' commence par '{' alors ça veut dire qu'on veut envoyer à un Google Home bien précis
text = text.trim();
var gh=[], names = "tous les Google Home";
if (text.startsWith('{')) {
// on envoie à quelques Google Home
names = text.split('}')[0].slice(1);
gh = names.split(',').map(function(name) { // on peut en spécifier plusieurs en les séparant par une virgule
return host[name.trim()]
});
text = text.split('}')[1].trim();
} else {
// on envoie à tous les Google Hom
if (typeof host === 'string') gh = [ host ];
else { // si pas un 'string', alors c'est un objet
names = [];
for (var h in host) {
names.push(h);
gh.push(host[h]);
}
names = names.join(',');
}
}
console.log("[assistant-notifier] ("+names+") Lecture du message : "+text);
// on génère le texte
generateTTS(text)
.then(function(url) {
// pour chaque Google Home
gh.forEach(function(host) {
var client = new Client();
client.connect(host, function() {
client.launch(DefaultMediaReceiver, function(err, player) {
var media = {
contentId: url,
contentType: 'audio/mp3',
streamType: 'BUFFERED'
};
player.load(media, {
autoplay: true
}, function(err, status) {
player.on('status', function(status) {
if (status.playerState == "IDLE") {
player.stop();
client.close();
prom_res();
}
});
});
})
})
})
})
})
};
/**
* Génére un son à partir de texte, selon le service souhaité
*
* @param {String} text
* @return {Promise} Retourne l'URL vers le son qui sera lu par le Google Home
*/
function generateTTS(text) {
// si le texte commence par "http" alors on le retourne car on considère que c'est déjà une URL
if (text.toLowerCase().startsWith("http")) return Promise.resolve(text);
if (!voice) {
// si pas de voix, on utilise Google TTS
return GoogleTTS(text, "fr-FR", 1);
} else {
// si une voix, on utilise le service associé
return request({
method:"POST",
url: "https://assistant.kodono.info/notifier.php",
body:JSON.stringify({
d:{
voice:voice,
texte:text
}
})
})
.then(function(url) {
return url;
})
}
}
action(process.argv[2])
Ensuite installe les modules nécessaires :
npm install google-tts-api@latest castv2-client
Et enfin, tu peux utiliser la commande :
node notifier.js "bonjour je suis Ludwig"
C'est fabuleux !!! Réponse super rapide et super efficace Longue Vie à Toi !!
Bonjour, Tout d'abord je dois te dire que j'adore Assistant-Plugins, je m'en sers tous les jours et développe quelques applis perso en c# pour accompagner ton appli. Je n'arrive pas à faire parler le Google Home directement à partir de C# et je voudrais me servir de Notifier pour le faire. Seulement, la seule manière que j'ai trouvé pour le moment c'est que mon programme envoi un WebHook à IFTTT qui envoi la commande à Pushbullet puis à Notifier, je peux voir à utiliser les API de Pushbullet pour Push une note directement sans passer par IFTTT. Mais je trouve ça dommage d'être obligé de passer par l'extérieur pour faire fonctionner Notifier qui se trouve sur le même ordinateur que mon appli C#. Je voudrais savoir s'il est possible d'appeler directement le plugin Notifier en le lançant par un commande du style "Node Notifier.js MessageALireSurGoogleHome" (qui ne fonctionne pas) ? ou peut-être peux-tu me donner une méthode alternative... Merci beaucoup