Node.js
RaspberryPi
GoogleHome

人の発話以外のきっかけでGoogleHomeをしゃべらせたい その1

GoogleHomeを買いました。
豆知識を教えてくれたり、ピカチュウと話せたりと、純粋に楽しい!
IFTTTを使えばGoogleHome→Lineと連携させてしゃべった内容をLineに送ることもできます。

でも、IFTTTではLine→GoogleHomeのように他のサービスをトリガーにしてGoogleHomeをしゃべらせることはどうやらできないようです。急にしゃべりはじめると怖いから?

でも、自分では気づかないことをしゃべって教えて欲しい!

Raspberry Piとgoogle-home-notifierでしゃべらせる

調べてみたところ、Raspberry PiとNode.jsのライブラリを使う方法がありました。
GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
LINEに送信したメッセージを、Google Homeで読み上げ、家族に通知

これだ!と思ったもののそもそもRaspberry Piを触ったこともないのでそのセットアップからやってみます。

1. Raspberry Pi3を購入する

Amazonでこちらを購入
何がよいのかわからなかったので、適当にいろいろ入ってそうなセットにしましたhttps://www.amazon.co.jp/dp/B01MR4SQV5/ref=psdc_2151902051_t1_B076X2H479

  • Raspberry Pi3 Model B
  • Raspbianプリインストールmicro SDカードが付属
  • 電源ON,OFFができる電源ケーブルが付属
  • その他電源ケーブル、LANケーブル、HDMIケーブル等が付属

2. Raspberry Pi3の起動とPCからコマンド操作

PCはMacBook Air OSX Yosemite(10.10.5) です。

ラズパイが到着してから気づいたのですが、ラズパイはマウスとキーボードを有線接続しないと初期設定できないらしい。残念ながらちょうどいいのが手元にない、わざわざ買うのももったいない。

で、調べたらMacからssh接続してコマンド操作することができるそうな。
そのためにはまずラズパイのSSH設定を有効にする必要があるとのこと。
raspberry pi 3でSSH接続できない?

SDカードに直接sshディレクトリを作ればイケるとのことなので
RaspbianOSが入ったSDカードをMacにセットし、以下を実行する。
touch /Volumes/boot/ssh

ディレクトリができていることを確認(sshがあればOK)
ls -l /Volumes/boot/

その後、

  • SDカードをMacから抜きラズパイ本体にセット
  • 付属のLANケーブルでラズパイとルーターを接続
  • 付属のHDMIケーブルでラズパイとモニターを接続
  • スイッチがOFFになっていることを確認して電源ケーブルをラズパイにつなぐ
  • 電源ケーブルのスイッチをON
    • モニターでラズパイが立ち上がることを確認
  • macのターミナルを立ち上げssh接続コマンドを実行
    • ssh -X pi@raspberrypi.local
    • パスワードを入力する(デフォルトはraspberry)
    • ターミナルに「pi@raspberrypi:~ $」が表示されたらssh接続OK

ちゃんと起動した!(ただしキーボードもマウスもないので画面上は操作できない)

3. Raspberry Pi3の初期設定と画面操作

ssh接続したターミナルで初期設定します。
初期パスワードは全てのラズパイで共通なので早めに変更する。
VNCを設定すると画面操作がPCからできるらしい。
VNCは以下を参考にRealVNCにしてみました。
http://izmiz.hateblo.jp/entry/2017/09/22/230146
https://www.8yazaki.jp/raspi/14_realvncserver_install/

  • 最新化(30分くらいかかる)
    • sudo apt-get update
    • sudo apt-get upgrade
  • パスワード変更
    • 設定画面を表示 sudo raspi-config
    • メニューの「1 Change User Password」を選択してEnter
    • 画面がターミナルにもどる。指示の通り新しいパスワードを2回入力する
    • 「passwd: password updated successfully」と表示されたらOK
  • VNC設定(ラズパイ側)
    • RealVNC をインストール sudo apt-get install realvnc-vnc-server
    • 設定画面を表示 sudo raspi-config
    • 「5 Interfacing Options」を選択してEnter
    • 「P3 VNC」を選択してEnter
    • 質問にYESを選択してEnter
  • VNC設定(Mac側)
    • Real VNCからアプリをダウンロード
    • アプリを起動し、アドレスを入力するraspberrypi.local:5900
    • ユーザー名(pi)と先程設定したパスワードを入力する

VNC越しにラズパイの画面が見れました!
これで有線のマウスとキーボードをラズパイに繋がなくてもPCのマウスとキーボードで画面操作できます。

4. Node.jsをインストール

画面が見れるようになりましたが、コマンド操作が続きます。
次はNode.jsのインストールです。すでにNode.jsはインストール済みですが、v4.8.2なので相当古いです。そしてnpmは入っていません。Node.jsもあまり詳しくはありませんが、どうやらNode.jsとそのバージョンを管理するモジュールとをセットで導入するようです。

  • https://nodejs.org/ja/ でLTSバージョンを確認する(作業時は8.11.1でした)
  • 上で確認したLTSである8系をインストールできるように設定 curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
  • インストールする sudo apt-get install -y nodejs
    • node -v でLTSバージョンが表示されたらOK
    • npm -v で何らかのバージョンが表示されたらOK(作業時は5.6.0でした)

おそらくこのままでも動くのですが、今後Node.jsをバージョンアップしやすくするためにバージョン管理モジュール「n」を入れます。

  • sudo npm cache clean
  • sudo npm install npm n -g
  • sudo n lts
    • node -v でLTSバージョンが表示されたらOK
    • npm -v で何らかのバージョンが表示されたらOK(作業時は5.6.0でした)

以下を参考にしました。
https://qiita.com/setouchi/items/437e4b62e4210871496f
https://qiita.com/seibe/items/36cef7df85fe2cefa3ea
https://github.com/tj/n

sudo n ltsでインストールしたNode.jsはこの手順の最初にインストールしたNode.jsとは別もののはずなのですが、この手順の最初にインストールしたnodeとnpmを削除するべきなのかがわからず...
詳しい方がいたら教えてください。

5. google-home-notifierをインストール

まだまだコマンド操作が続きます。
google-home-notifierのインストールにはgit cloneする方法と単純にnpmする方法があるみたいでしたが、簡単そうなnpm方式にしました。

  • 必要なパッケージを追加 sudo apt-get install git-core libnss-mdns libavahi-compat-libdnssd-dev
    • 本当にインストールするか聞かれるのでYで進める
  • ラズパイに任意のディレクトリを作り、作業ディレクトリとする。
  • 作業ディレクトリ内でNode.jsの設定ファイルを作成する npm init
    • いろいろ聞かれるが適当にEnter連打でとりあえずOK
  • 作業ディレクトリ内でgoogle-home-notifierをインストールする npm install google-home-notifier

これで初期設定が整ったはず...
以下を参考にしました。
https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac
https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09
google-home-notifier

※備忘
google-home-notifierにはラズパイなら以下のコマンドを実行しろ、と買いてありましたが、すでに前の手順でNode.jsの8系を入れているので今回は実行していません。

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

6. 簡単に一言喋らせてみる

まず、Google HomeのIPを調べます。
https://qiita.com/shun91/items/aba1a554d829126945f6
https://www.gesource.jp/weblog/?p=8082

次にRaspberry PiからGoogle Homeを喋らせるで使われていたソースをそのまんま作業ディレクトリにコピーしました。

main.js
const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.xxx.xxx"); // 上で調べたGoogle HomeのIPに書き換える
googlehome.notify('こんにちは。私はグーグルホームです。', function(res) {
  console.log(res);
});

作業ディレクトリ内で以下を実行

$ node main.js

しゃべったーーー!日本語がぎこちない!笑

長くなったので一旦区切ります。
続きはこちら
人の発話以外のきっかけでGoogleHomeをしゃべらせたい その2(LINEのメッセージを読み上げる)