GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます

  • 61
    いいね
  • 0
    コメント

GoogleHomeスピーカから自発的話してもらうためにいろいろ細工をします。具体的にはraspberryPiからGoogleHomeスピーカーに話してほしいことを送ってしゃべってもらいます。
これができると、ある条件の時に好きなことをGoogleHomeからしゃべってもらえます。(例えば明日雨の場合に教えてくれたり、IFTTTを利用すると、ツイッターとかでリプライが来たら教えてくれます。)

ざっくりな流れ

①Raspberry PiにGoogleHomeを操作するためのソフト(google-home-notifier.js)を導入
②自宅のGoogleHomeにリクエストを送るための設定を実施
③リスナーを実行して、RaspberryPi上にgoogle-home-notifierを常駐させる
④RaspberryPiにGoogleHomeにしゃべらせたいことをPOSTすることでGoogleHomeがしゃべる

必要な環境

・RaspberryPi(Node.jsとnpmを使います)
・GoogleHome

RaspberryPiに必要なものを導入

Node.jsとmpm

RaspberryPiにNode.jsとnpmを使うためにあらかじめインストールしておきます。以下のページを参照していただけばと思います。

https://qiita.com/mascii/items/77c685df65c4cbca9315

google-home-notifier

続いて、GoogleHomeを操作するための必要なプログラム「google-home-notifier」をGitHubから導入します。サイトは以下です。

https://github.com/noelportugal/google-home-notifier

上記プログラムは、前からあったChromecast Client向けのプロトコルを利用して、GoogleHomeにしゃべらせるという代物です。プロトコルの詳細はここを参照してください。

上記プログラムを導入します。リスナーを利用して実現するため、以下の通りのコマンドを実行してインストールします。

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install nodejs
sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev
git clone https://github.com/noelportugal/google-home-notifier
cd google-home-notifier
npm install

上記コマンドを実行することで、必要なパッケージ含めてインストールされます。

google-home-notifierの設定

本章では、自宅にあるGoogleHomeに接続するための設定を実行します。
設定を実施するにあたり、以下の条件および情報が必要です。
・GoogleHomeのIPアドレス(固定されている必要があります。)
  →今回は仮に192.168.1.10とします。

まず最初に「example.js」を編集します。今回はあらかじめ用意されているものを利用します。
以下の項目を編集します。
・serverPort
  →リスナーが利用するポートです。変更する場合は変更してください。
・deviceName
  →GoogleHomeのデバイス名を記載します。ただし、このデバイス名は任意で結構です。
  →今回は'リビング'とつけてます。

example.js
var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8080;

var deviceName = 'リビング';
googlehome.device(deviceName);
//googlehome.accent('uk'); // uncomment for british voice

var urlencodedParser = bodyParser.urlencoded({ extended: false });

app.post('/google-home-notifier', urlencodedParser, function (req, res) {
  if (!req.body) return res.sendStatus(400)
  console.log(req.body);
  var text = req.body.text;
  if (text){
    res.send(deviceName + ' will say: ' + text + '\n');
    googlehome.notify(text, function(res) {
      console.log(res);
    });
  }else{
    res.send('Please POST "text=Hello Google Home"');
  }

})

app.listen(serverPort, function () {
  ngrok.connect(serverPort, function (err, url) {
    console.log('POST "text=Hello Google Home" to:');
    console.log('    http://localhost:' + serverPort + '/google-home-notifier');
    console.log('    ' +url + '/google-home-notifier');
    console.log('example:');
    console.log('curl -X POST -d "text=Hello Google Home" ' + url + '/google-home-notifier');
  });
})

続いて、同ディレクトにある「google-home-notifier.js」を編集します。本ファイルには、GoogleHomeの接続先並びに言語設定を実施します。

・lang
  →言語を日本語に設定するため、「ja」に変更する

・googlettsaccent
  →言語を日本語に設定するため、「ja」に変更する

・deviceAddressを追記
  →GoogleHomeのIPアドレスを記載します。

google-home-notifier.js
var Client = require('castv2-client').Client;
var DefaultMediaReceiver = require('castv2-client').DefaultMediaReceiver;
var mdns = require('mdns');
var browser = mdns.createBrowser(mdns.tcp('googlecast'));
var deviceAddress;
var language;

var device = function(name, lang = 'ja') {    //ここをjaに変更
    device = name;
    language = lang;
    return this;
};

var googletts = require('google-tts-api');
var googlettsaccent = 'ja';            //ここをjaに変更
var accent = function(accent) {
  googlettsaccent = accent;
  return this;
}

deviceAddress = '192.168.1.10';          //ここにIPアドレスを追記

var notify = function(message, callback) {
  if (!deviceAddress){
    browser.start();
    browser.on('serviceUp', function(service) {
      console.log('Device "%s" at %s:%d', service.name, service.addresses[0], service.port);

後略

google-home-notifierの起動

設定完了したら、RaspberryPi上で起動します。

node example.js

起動すると、POSTする際の例文が表示されるはずです。

GoogleHomeにしゃべらせる

google-home-notifierの起動が完了したら、RaspberryPiにGoogleHomeにしゃべってほしい内容を送ります。送り方は、例文に倣って以下の通りです。試しに「明日は雨になります」としゃべらせてみます。

curl -X POST -d "text=明日は雨になります" http://(RaspberryPiのIP):8080/google-home-notifier

上記コマンドを実行すると、GoogleHomeから「明日は雨になります」と突然話だすはずです。

最後に

今回のやり方で実行すると、声がいつものGoogleHomeの声とは異なる声でしゃべりだします。これはおそらく「iSpeech API」の声を利用しているためです。詳細はここを参照いただけるといいと思います。

また、この方法は外部からPOSTでしゃべらせることができるため、IFTTTの「webhooks」を利用することで、様々なトリガーでしゃべらせることができます。IFTTTを利用する場合は、セキュリティ上今のままだと、誰でも実行できてしまうため、認証等をさらに付け加えたほうがいいかもしれません。

ともあれ、Googleが公式にPUSH型のサービスを提供してくれるまでのつなぎとしては利用できるかもしれません。

どなたかjsに明るい方がいたら、認証回りを強化したプログラムを公開していただけるとより多くの方が利用できるようになるので、なにとぞお願いします。