google-home-notifierを使ってGoogleHomeに喋らせる


GoogleHomeは基本的にこちらから「OK!Google」と話しかけることをトリガーに何かしらの処理を行ってくれますが、こちらからの指示がなければただの置物です。
今回は「google-home-notifier」というnpmパッケージを使って、Slackで投稿した内容をGoogleHomeが発言してくれるようにします。

google-home-notifier

インストール

npm install google-home-notifier

実装

「google-home-notifier」READMEのサンプルを参考に、通知用のjsを作成
とりあえず喋る言葉を固定にする

const googlehome = require('google-home-notifier');
const language = 'ja';

googlehome.device('Google Homeの名前', language);

googlehome.notify('しゃべったあああああああ', function(res) {
  console.log(res);
});
node notice.js

GoogleHomeと実行環境が同じネットワークに繋がっていれば、GoogleHomeから喋るようになります。

※現在node_modules/google-home-notifier/package.jsonの「google-tts-api」を「0.0.4」に指定して、npm updateかけないとエラーで止まります。

nodeでwebサーバーを作成する

http://localhost:3000/ にリクエストするとGoogleHomeが喋るようにします。

const http = require('http');

const googlehome = require('google-home-notifier');
googlehome.device('Google Homeの名前', 'ja');
googlehome.ip('Google HomeのIP');

http.createServer(function (req, res) {
    req.on("end", function() {
        googlehome.notify('しゃべったあああああああ', function(res) {
            console.log(res);
        });
    });

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end();

}).listen(3000, '127.0.0.1');

localhostを外部公開

ngrokを使って外部公開してSlackから叩けるようにします

$ngrok http 3000

Session Status                online
Session Expires               7 hours, 58 minutes 
Version                       2.3.35
Region                        United States (us) 
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://c4c72050.ngrok.io -> http://localhost:3000
Forwarding                    https://c4c72050.ngrok.io -> http://localhost:3000  

Slackとの連携

SlackAPIのOutgoing Webhookを使って、「https://c4c72050.ngrok.io」 をエンドポイントに指定

SlackからPOSTされてきたテキストを喋らせるように変更

const http = require('http');

const googlehome = require('google-home-notifier');
googlehome.device('Google Homeの名前', 'ja');
googlehome.ip('Google HomeのIP');

http.createServer(function (req, res) {
    let data = '';
    req.on('data', function(chunk){
        data += chunk;
    });

    req.on("end", function() {
        const qs = require('querystring');
        const post = qs.parse(data);

        const text = post['user_name'] + post['text'];
        googlehome.notify(text, function(res) {
            console.log(res);
        });
    });

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end();

}).listen(3000, '127.0.0.1');

今回は動くところまでを目標にしているのでやってませんが、tokenも送られてくるのでチェックすることもできます

これでSlackの投稿をトリガーに、GoogleHomeに喋らせることができます。

参考文献