Aymkdn / assistant-plugins

Des plugins pour les Assistant (comme Google Home, Cortana, Alexa)
https://aymkdn.github.io/assistant-plugins/
MIT License
92 stars 21 forks source link

Appel de Notifier par Prog C# #195

Closed Ludwig151 closed 5 years ago

Ludwig151 commented 5 years ago

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

Aymkdn commented 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"
Ludwig151 commented 5 years ago

C'est fabuleux !!! Réponse super rapide et super efficace Longue Vie à Toi !!