GoogleHome の喋らせ方 - 勝手に喋らせる方法

はじめに

Google HomeはIFTTT連携で声で命令して色んなことをさせることが出来ますが、まだ何かのトリガーをきっかけに自動で喋ってくれるという機能までは提供されていません。

今日は、GoogleHomeを自動的に喋らせる事が出来たので、そのやり方とハマった所の備忘録を紹介します。

最終的には、この記事の様に雨が振りそうになったら自動的に教えてくれるような事ができるようになります。

www.project-unknown.jp

今回は、その前準備として、Raspberry pi上でイベントを実行したらGoogle Homeが喋ってくれるようになる所をまでをご紹介します。

実行結果

まず、簡単に実行結果から、以下のTwitterにあるように好きなコトバを喋らせています。

他のサイトでも取り上げられている、google-home-notifierを用いて実現しております。

環境

以前買ったraspberry pi3をローカル環境でWebサーバとして、nodejsを突っ込んでます。

以下は簡単な全体構成 (nodejsでコマンドを受け付けて喋らせるだけなので、非常にシンプル)

f:id:project-unknown:20171221024930p:plain

Node.jsとnpmのinstall

$ sudo apt-get update
$ sudo apt-get install -y nodejs npm
$ sudo npm cache clean
$ sudo npm install npm n -g
$ sudo n stable

バージョン確認

$ node -v
v7.3.0
$ npm -v 
4.0.5

google-home-notifierのinstall

まずは下準備

curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -

nodejsを突っ込む

sudo apt-get install nodejs

git, libnss-mdns, libavahi-compat-libdnssd-devを突っ込む

sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev

libavahi-compat-libdnssd-devがinstallできない

私がハマったのですが、libavahi-compat-libdnssd-devを入れようとすると、以下な感じになってハマりました

$sudo apt-get install libavahi-compat-libdnssd-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 libavahi-compat-libdnssd-dev : 依存: libavahi-client-dev しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

う〜ん、絶妙な日本語。

どうやら、依存パッケージのlibavahi-client-devが入らないからinstall出来ないっぽいです。

では、実際にlibavahi-client-devが何故入らないのか、直接installを試みて確認してみます。

$ sudo apt-get install libavahi-client-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 libavahi-client-dev : 依存: libavahi-client3 (= 0.6.31-5) しかし、0.6.32-2 はインストールされようとしています
                       依存: libavahi-common-dev しかし、インストールされようとしていません
                       依存: libdbus-1-dev (>= 0.60) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

どうやら、更に依存パッケージを入れようとして失敗しているぽいですね。
この依存パッケージは既に最新のverが入っており、ダウングレードになるので依存関係で勝手にダウングレードにならないようにエラーで止めてるみたいです。

今手元のrasspberry piは他に利用用途も無いので、ダウングレードで対応します。
(apt-getのダウングレードは、バージョン直指定で下げれます)

他何回か躓いたのですが、基本同様の判断で適切なパッケージをアテてます

$ sudo apt-get install libavahi-client3=0.6.31-5
$ sudo apt-get install libavahi-common3=0.6.31-5
$ sudo apt-get install libavahi-common-dev
$ sudo apt-get install libdbus-1-3=1.8.22-0+deb8u1
$ sudo apt-get install libdbus-1-dev=1.8.22-0+deb8u1
$ sudo apt-get install libavahi-client-dev

これで依存関係の悪さがなくなったはずなので、以下のコマンドを進めます。

$ sudo apt-get install libavahi-compat-libdnssd-dev

上記でしれっと、バージョンを書いていますが、警告が出ていれば警告通りのバージョン番号を、よく分からなければ、以下のコマンドで最新のバージョンを見て突っ込んでます。

$ apt-cache policy libdbus-1-dev

gitからgoogle-home-notifierを取得

$ git clone https://github.com/noelportugal/google-home-notifier

npm install

$ cd google-home-notifier
$ npm install

これで必要なパッケージが全て入ったはずです。

Google Home に喋らせて見る

コード準備

google-home-notifierには、Gitからcloneしたタイミングで、example.jsが入っており、必要な設定さえすればいきなり喋らせる事が出来ます。

以下を修正してみてください。(以下はexample.jsの中身

(以下に出て来るGoogleHomeのIPは、GoogleHomeアプリのデバイスから調べることが出来ます

...省略...
var app = express();
const serverPort = 8091; // ポート番号、好きな番号で後でGoogle Homeに命令を送る特に指定
...省略...

...省略...
var deviceName = 'Google Home Room'; <- google homeの名前
var ip = '192.168.1.10'; // <- google homeのIPを記載
....省略...

...省略...
  var language = 'ja'; // <- jaに変更
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language) // <-ここを追加
...省略...

...省略...
if (req.query.ip) {
     ip = req.query.ip;
  }

  var language = 'ja'; // <-ここをjaに
  if (req.query.language) {
    language;
  }

  googlehome.ip(ip, language);
  googlehome.device(deviceName,language) // <- ここを追加
...省略...

google-home-notifierの起動

ここまで出来たら、以下のコマンドで立ち上げます。

node example.js

以下の様に出てくると思いますので、

$ node example.js
Endpoints:
    http://〜〜〜/google-home-notifier
    https://〜〜〜/google-home-notifier
GET example:
curl -X GET https://〜〜〜/google-home-notifier?text=Hello+Google+Home
POST example:
curl -X POST -d "text=〜〜〜" https://〜〜〜/google-home-notifier

別途ターミナルを立ち上げて、以下のように入力します。

curl -X POST -d "text=明日会社行きたくない" http://Raspberry PiのIP:コードで指定したポート番号/google-home-notifier

これで以下のような結果になります。

Twitterにも書きましたが、これでGoogleHomeでできなかった、自動で喋らせると言う所が可能になりました。
(一番はIFTTTのThat部分を早くGoogle Assistantが対応してくれることですが)
指定時間になったらのリマインダや、雨雲が近づいている時に洗濯物大丈夫?の注意喚起をGoogle Homeが行ってくれることになるので、生活が一層楽になりそうですね。