これであなたも話し上手? 言いにくいことはわずか10行で話し出すGoogle Homeにお任せ!
こんにちは。
開発チームのワイルド担当、まんだいです。
去年末、社内の納会でGoogle Homeをいただいたのですが、家でホコリをかぶっている状態だったので会社に持ってきて好き放題喋らせてみました。
用意するもの
今回使う備品は、Google Home(miniでも可)とPCだけです。
PCはRaspberry PIでなくても構いません。
とりあえず喋らせるだけなら、google-home-notifierが動けばなんでもいいです。
Windowsの場合、node-gypのリビルドが鬼門のようです。
このへんの記事が参考になるのではないかと。
私の場合、やろうと思っていたタイミングでCentOSのVMが起動していたので、VMでササッと作れてしまいました。
なお、nodeのcronモジュールがあると、定時連絡もできます。
下準備
- Google HomeのローカルIPを調べておく
- node.jsのインストール
- PCとGoogle Homeの通信に必要なライブラリのインストール
- npmで必要なモジュールをインストール
- npm install google-home-notifier
- npm install cron (オプション)
Google HomeのローカルIPを調べておく
Androidの場合、Google Homeアプリから、調べられます。
左上の三本線からメニューを表示し、デバイスを選択します。
Google Homeと連携できていれば、「設定」を選んで一番下にIPアドレスが表示されているはずです。
node.jsのインストール
yumでもいいですが、なるべく新し目のものがいいです。
今回はnode.js v8.9.4を使っています。
PCとGoogle Homeの通信に必要なライブラリのインストール
nodeを用意した時点でnpmでgoogle-home-notifierをインストールしようとすると、次のような感じになることがあります。
npm install google-home-notifier > [email protected] install /home/vagrant/Documents/googlehome/node_modules/mdns > node-gyp rebuild make: Entering directory `/home/vagrant/Documents/googlehome/node_modules/mdns/build' CXX(target) Release/obj.target/dns_sd_bindings/src/dns_sd.o In file included from ../src/dns_sd.cpp:1:0: ../src/mdns.hpp:32:20: fatal error: dns_sd.h: No such file or directory #include <dns_sd.h> ^ compilation terminated. make: *** [Release/obj.target/dns_sd_bindings/src/dns_sd.o] Error 1 make: Leaving directory `/home/vagrant/Documents/googlehome/node_modules/mdns/build' gyp ERR! build error gyp ERR! stack Error: `make` failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/build.js:258:23) gyp ERR! stack at emitTwo (events.js:126:13) gyp ERR! stack at ChildProcess.emit (events.js:214:7) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12) gyp ERR! System Linux 3.10.0-693.17.1.el7.x86_64 gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild" gyp ERR! cwd /home/vagrant/Documents/googlehome/node_modules/mdns gyp ERR! node -v v8.9.4 gyp ERR! node-gyp -v v3.6.2 gyp ERR! not ok npm WARN [email protected] No description npm WARN [email protected] No repository field. npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! [email protected] install: `node-gyp rebuild` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the [email protected] install script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /home/vagrant/.npm/_logs/2018-03-17T06_56_20_006Z-debug.log
インクルードするdns_sd.hというヘッダファイルが存在しないというエラーですが、以下のコマンドを流せばヘッダファイルもインストールされます。
sudo yum install avahi-compat-libdns_sd-devel
node-gyp絡みでnpmを使ったインストールでエラーが出ることがありますが、node-gypは単にnode.jsで今回のようにC++で書かれたソースのコンパイルなどを自動化するツールなので、大抵ビルドに必要なファイルの不足が問題です。
nvmで導入すると、後片付けも楽かも知れませんね!
npmで必要なモジュールをインストール
あとはnpmから、必要なモジュールをインストールするだけです。
最低限必要なのは、google-home-notifierで、これがないとGoogle Homeとの連携はできません。
オプションでnode-cronを入れておくと、定期的にお喋りしてくれるようになるので、賑やかしに最適です。
# 作業環境の構築 mkdir path/to/project cd path/to/project npm init # google-home-notifierのインストール npm install google-home-notifier # 定期実行(cron)用モジュールのインストール npm install cron
簡単なソース
こちらで用意するコードはすこぶる簡単なので先にさらします。
// sample1.js const googlehome = require('google-home-notifier'); const googlehome_name = 'Your Google Home Name'; // Google Homeの名前(なんでもいい) const googlehome_ip = 'xxx.xxx.xxx.xxx'; // Google HomeのIPアドレス const language = 'ja'; // Google Homeに喋らせたい言語(usで英語です) const message = 'おしゃべりするでー'; // 喋らせたい内容 googlehome.device(googlehome_name, language); googlehome.ip(googlehome_ip); googlehome.notify(message, (res) => { console.log(res); });
上記のソースをsample1.jsとして保存します。
実行は以下のコマンド。
node sample.js
ほぼ説明はいらないレベルですが、変更箇所は3つで、環境に合わせて入力してください。
- googlehome_name
- googlehome_ip
- language
注意点としては、8行目、9行目あたり。
割とハマる人はハマるようで、本来なら、8行目だけでGoogle Homeに付けた名前で名前解決(DNS lookup)できるようですが、上手くいかないことが多いので、9行目でIPアドレスを指定しています。
IPアドレスを指定するなら、8行目はいらないじゃないかということですが、言語設定がdevice()メソッドからしかできなさそうなので、敢えて両方記述しています。
定期実行できるよう、発展させる
google-home-notifierモジュールが非常に良く出来ているせいで、こちらはほとんどすることがなかったため、もう少し発展させて、定期的に何かをしゃべる、できればcronで、ということで、そんな感じにしてみます。
Linuxのcronは使わず、npmモジュールのcronを使って実装してみたいと思います。
// sample2.js const googlehome = require('google-home-notifier'); const CronJob = require('cron').CronJob; const messages = require('./messages'); // 実行間隔と話す内容を書いてあるファイル const googlehome_name = 'Your Google Home Name'; // Google Homeの名前(なんでもいい) const googlehome_ip = 'xxx.xxx.xxx.xxx'; // Google HomeのIPアドレス const language = 'ja'; // Google Homeに喋らせたい言語(usで英語です) googlehome.device(googlehome_name, language); googlehome.ip(googlehome_ip); messages.forEach((m) => { new CronJob({ cronTime: m.schedule, onTick: () => { googlehome.notify(m.message, (res) => { console.log(res); }); }, start : true, timeZone: 'Asia/Tokyo', }); });
下が話す文章とスケジュールが書かれた定義ファイルです。
// messages.js module.exports = [ // 書き味はほとんどLinuxのcronと同じ { schedule: '0 0 10,13,16,19,22 * * *', message: 'ほげほげ' }, // 秒という概念が先頭についていることに注意 { schedule: '0 0 22 * * *', message: 'てすと' }, // 数字、アスタリスク、カンマ、ハイフン、スラッシュで記述します { schedule: '0 */5 9-18 1,2,3 * *', message: '1月、2月、3月の9時~18時は5分おきにしゃべります' }, ];
messages.jsを太らせれば色々話してくれてしばらくは楽しめそうです。
まとめ
喋れるデバイスがあるだけで、色々楽しめました。
何より今回は、google-home-notifierの抽象度がすごすぎて、こちらで何もする必要がないレベルといっていいほどですが、喋らせたい文字列を引数に与えるだけというのはすごいですね。もっと一般的になってもいいんじゃないかと思います。
ここまでがGoogle Homeのパッケージとして備わっていたら、もっと売れるんじゃないかなぁと思ったんですが、そうなると色々揃えすぎでしょうか?
以上です。