Google Homeに喋らせるのって意外と大変
Google Homeにメッセージを喋らせる方法としてはgoogle-home-notifierを使った方法が有名だと思います。
ただ、google-home-notifierを使うには結構面倒な点が多いです。
- npmで入れただけだと動かない(google-tts-apiのバージョンを上げたりしなければいけない)
- 外部からのメッセージをトリガーに喋らせたい(例えばSlackで投稿した内容を喋らせる)場合はGoogle Apps Script等で中継させなきゃいけない
- Node-RED自体もngrok等を使って外部に公開させなきゃいけない
- 更に再起動の度にngrokの公開URLが変わるので、それをどこかに保管しておかなければいけない
等々。
もちろん「それくらい調べれば対応できるだろ」と言われればそうなのですが、もっと簡単にできるならその方がいいですよね。
そこでNode-REDを使って、簡単にGoogle Homeを喋らせてみましょう。
Node-REDとは
Node-REDはフローベースドプログラミングツールと呼ばれ、「ノード」と呼ばれるブラックボックス化されたアプリケーションを線で繋いで「フロー」と呼ばれるプログラムを構築していきます。
基本的なI/O(Http, UDP/TCP, Websocket, MQTT等)のノードは一通りそろっているほか、各種サードパーティによって様々なノードが作られているため、それらを繋いでいくだけで簡単にアプリ同士を連携させていくことができます。
感覚的にはIFTTTとかに近いですが、フロー内ではJavaScriptの関数も使用できたりと結構高度なこともできます。
手順
ざっくり以下の手順です。
- Node-REDをインストール
- Castノードを追加
- ノードを繋ぐ
ラズパイで環境構築
Node-REDはNode.jsが動作する環境であればどこでも動作しますが、Raspberry Pi(ラズパイ)なら簡単に環境構築ができて、常時起動も気軽にできます。しかもインストールが簡単なので今回はラズパイを使った方法を紹介します。
ラズパイのOSはインストールされている状態からスタートします。
ラズパイにNode-REDをインストール
ラズパイのターミナルで以下を実行します。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
基本これだけでOKです。
公式で上記のインストールスクリプトが用意されていて、以下のことをやってくれます1。
- すでにインストールされているNode-REDおよびNode.jsをアンインストール
- 現行のNode.js LTSリリースをインストール
- npmを利用して最新版のNode-REDをインストール
- ラズパイの固有ノード(GPIO等)をインストール
- サービスとしてNode-REDを実行するように設定し、 サービスとして動作するためのコマンド一覧を提供
Node-RED起動
node-red-start
コマンドを実行することでNode-REDを起動できます。サービスとして起動しているため、Ctrl+C
を押してもバックグランドで実行を続けます。
終了するにはnode-red-stop
コマンドを実行します。
また、ラズパイ起動時に自動で起動させるにはsudo systemctl enable nodered.service
を実行すればOKです。
http://[ラズパイのIPアドレス]:1880
にアクセスすると以下のようなフローエディタ画面が表示されます。
ここでフローを編集していきます。
Castノードを追加
Google Homeに喋らせるには、Chromecast機能のノードを使用します。
右上のハンバーガーメニューからパレットの管理
を開き、ノードを追加
タブを開きます。
検索欄にnode-red-contrib-cast
と入れて、出てきたnode-red-contrib-cast
ノードの「ノードを追加」ボタンを押します。
node-red-contrib-castv2
というノードもあるのですが、Google Homeに喋らせるにはnode-red-contrib-cast
ノードの方が楽なのでこちらを採用します。
追加されると、左のノード一覧の中に以下のCast
ノードが追加されていると思います。
これを真ん中のボードにドラッグ&ドロップして持ってきます。
Castノードの設定
真ん中に持ってきたノードをダブルクリックするとプロパティの編集画面が開きます。
以下の項目を埋めて「完了」を押します。
-
IP
:Google HomeのIPアドレス -
language
:「ja」 -
Message
:「こんにちは」
他の項目は空欄でOKです。Volume
欄に数値(0~100)を入れると喋るときの音量を調整してくれます。
injectノードを繋いでデプロイ
左上のinject
ノードを同じように持ってきて、以下のように繋ぎましょう。
これでフローが作成されました。
その後、右上の「デプロイ」ボタンを押すとフローが実際にデプロイされます。
これで準備完了です。
実行
injectノードの左についているタグのようなものが実行ボタンになっています。これを押してみましょう。
そうするとあなたのおうちのGoogle Homeが「こんにちは」と喋ってくれたはずです。
非常に簡単にGoogle Homeに喋らせることができました。
任意の言葉を喋らせたい
今はCastノードに「こんにちは」というメッセージを固定で入力していましたが、任意のメッセージを入力させることができます。
フロー間はJavaScriptの文字列やオブジェクト形式のデータがmsg
変数に入って流れています。Castノードはmsg.message
またはmsg.payload.message
に文字列を入力すると、それを喋らせることができます。
なので、この形式で文字列を入力させるだけで、任意のメッセージを喋らせることができます。
例えば、以下のようにchange
ノードを間にはさみ、msg.message
に「おはようございます」と代入すると、Google Homeは「おはようございます」と喋ります(Castノードの設定よりmsg
の入力の方が優先される)。
Node-REDはほかの外部システムやアプリケーションとも簡単に連携できますので、これを使えば「〇〇したらGoogle Homeに喋らせる」というシステムをNode-RED上で簡単に実現できます。
例:Slackと連携
試しにSlackと連携して、Slackに投稿したメッセージをNode-REDに喋らせてみましょう。
Slackとの連携ノードもNode-REDにあるので、これを使えば簡単に実現できます。
Node-REDでSlack bot
SlackのメッセージをNode-REDに送るにはnode-red-contrib-slackという拡張ノードを使用します。
ここでは詳細は書きませんが、SlackアプリとSlack botを作成し、生成されたアクセストークンをノードの設定に入れるだけでSlackのメッセージ等を取得できます。
以下の方の記事が詳しいので、そちらを参照してみてください。
Node-REDでSlack bot 2019年8月時点 - Qiita
slack-rtm-in
ノードを上記記事のように設定すればSlackのメッセージを取得できます。
SlackメッセージをNode-REDに喋らせる
Slackに投稿されたメッセージはmsg.payload.text
から取得できます。なのでこれをmsg.message
かmsg.payload.message
に入れてやればOKです。
また、slack-rtm-in
ノードから入ってくる情報は他にもいろいろあり、例えばmsg.payload.userObject.real_name
でユーザ名を取得できます。
これを使ってユーザ名も一緒に喋らせられるようにしたものが以下です。
間にtemplate
ノードをはさみ、そこでメッセージを組み立ててcast
ノードに渡しています。
まとめ
Node-REDを活用することで、簡単にGoogle Homeにメッセージを喋らせることができました。
また、外部システム(Slack)との連携も簡単にできました。
google-home-notifierを使ってSlackと連携するには
Google Home
|
google-home-notifier
|
(ngrok)
|
Google Apps Script
|
(Outgoing Webhook)
|
Slack
のような感じで、連携する物が多く構築や管理も大変でしたが、Node-REDを使うことで
Google Home
|
Node-RED
|
Slack
という感じで簡単に繋げることができました。
このように、Node-REDは「繋ぐ」ことに関してはかなりの威力を持っているので、アイデア次第でいろんなことができそうです。