GoogleHomeにしゃべらせるまでにやったこと

はじめに

Google Homeを手に入れてから、アプリ開発そっちのけで、がちゃがちゃ遊んでます。
今日は、そんなGoogleHomeで遊んだ際の記事と、ハマった所を備忘録がてらに書きました。

簡単に実行結果から、以下の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が行ってくれることになるので、生活が一層楽になりそうですね。

written by ゆう@あんのうん