8
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Node-REDを使って簡単にGoogle Homeに喋らせよう

Posted at

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の関数も使用できたりと結構高度なこともできます。

手順

ざっくり以下の手順です。

  1. Node-REDをインストール
  2. Castノードを追加
  3. ノードを繋ぐ

ラズパイで環境構築

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にアクセスすると以下のようなフローエディタ画面が表示されます。
ここでフローを編集していきます。
image.png

Castノードを追加

Google Homeに喋らせるには、Chromecast機能のノードを使用します。
右上のハンバーガーメニューからパレットの管理を開き、ノードを追加タブを開きます。
検索欄にnode-red-contrib-castと入れて、出てきたnode-red-contrib-castノードの「ノードを追加」ボタンを押します。

node-red-contrib-castv2というノードもあるのですが、Google Homeに喋らせるにはnode-red-contrib-castノードの方が楽なのでこちらを採用します。
image.png
追加されると、左のノード一覧の中に以下のCastノードが追加されていると思います。
image.png
これを真ん中のボードにドラッグ&ドロップして持ってきます。

Castノードの設定

真ん中に持ってきたノードをダブルクリックするとプロパティの編集画面が開きます。
image.png

以下の項目を埋めて「完了」を押します。

  • IPGoogle HomeのIPアドレス
  • language:「ja」
  • Message:「こんにちは」

他の項目は空欄でOKです。Volume欄に数値(0~100)を入れると喋るときの音量を調整してくれます。

injectノードを繋いでデプロイ

左上のinjectノードを同じように持ってきて、以下のように繋ぎましょう。
image.png
これでフローが作成されました。
その後、右上の「デプロイ」ボタンを押すとフローが実際にデプロイされます。
image.png
これで準備完了です。

実行

injectノードの左についているタグのようなものが実行ボタンになっています。これを押してみましょう。
image.png

そうするとあなたのおうちのGoogle Homeが「こんにちは」と喋ってくれたはずです。
非常に簡単にGoogle Homeに喋らせることができました。

任意の言葉を喋らせたい

今はCastノードに「こんにちは」というメッセージを固定で入力していましたが、任意のメッセージを入力させることができます。
フロー間はJavaScriptの文字列やオブジェクト形式のデータがmsg変数に入って流れています。Castノードはmsg.messageまたはmsg.payload.messageに文字列を入力すると、それを喋らせることができます。
なので、この形式で文字列を入力させるだけで、任意のメッセージを喋らせることができます。

例えば、以下のようにchangeノードを間にはさみ、msg.messageに「おはようございます」と代入すると、Google Homeは「おはようございます」と喋ります(Castノードの設定よりmsgの入力の方が優先される)。
image.png
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.messagemsg.payload.messageに入れてやればOKです。

また、slack-rtm-inノードから入ってくる情報は他にもいろいろあり、例えばmsg.payload.userObject.real_nameでユーザ名を取得できます。
これを使ってユーザ名も一緒に喋らせられるようにしたものが以下です。
image.png
間に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は「繋ぐ」ことに関してはかなりの威力を持っているので、アイデア次第でいろんなことができそうです。

  1. Raspberry Piで実行する : Node-RED日本ユーザ会

8
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?