GoogleHomeって基本受け身ですよね。ユーザーから話しかけられるのをずっと待っているという。
そんなGoogleHomeを自発的に喋らせることができたら使い道が広がるのでは?
なんてことを考えて実現方法をググっていると、どうやらRaspberry Pi(以降、ラズパイ)をサーバにして、google-home-notifierというものを使えばプッシュ発話することができるらしいので、試してみました。
参考にさせていただいたのは以下の3つの記事です。
Google Homeにプッシュ発話をさせる、Raspberry Pi 3へのgoogle-home-notifierの最新導入手順
GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
Raspberry Pi 3 Model B+の初回セットアップ(購入から起動まで)
先人たちの知恵と経験が詰まった上記の記事を見ながらやればできるんですが、ラズパイ初心者の私にはお作法というか、どうすればいいかわからず詰まった点がいくつかあったので、私と同じくラズパイ初心者(+node.jsに慣れてない人)に向けて、苦戦した点とどうやって解決したかを含めて一から書いていきたいと思います。
最終目標物は、このような感じです。(クリックで拡大します)
ざっくり以下のような流れで進めていきます。
- ラズパイを用意する
- ラズパイを起動してgoogle-home-notifierとか色々準備する
- 喋らせたい内容をhttpでリクエストできるようにする
- 外部からアクセスできるようポート開放する
目次
Step1:Raspberry Pi(ラズパイ)を準備する
まずはラズパイが必要です。
私は先人の記事の通りRaspberry Pi3 model Bを準備しましたが、これと同じかこれより新しいモデルがよいと思います。
Raspberry Piは最新版のRaspberry Pi3 model B+、OSはRaspbianを利用します。ラズパイ3は本体にWi-Fiモジュールが内蔵していて、別途USBのWi-Fiドングルなどを刺さなくてよいのが嬉しいです。
引用元:Google Homeにプッシュ発話をさせる、Raspberry Pi 3へのgoogle-home-notifierの最新導入手順
そして、ラズパイだけではなくマイクロSDカードや電源ケーブル、マウス、キーボード、HDMI接続に対応したモニターも必要です。
そしてこのOSのインストールが地味に面倒なので、以下のようなセット商品を買うと、最初からSDカードにOSがプリインストールされているので手間いらずでオススメです。
ラズパイを動かすのに必要なものは全部で以下です。
- ラズパイ本体
- 電源ケーブル
- HDMIケーブル
- HDMI対応モニター(無い人はテレビで代用可)
- MicroSDHCカード(16GB以上推奨)
- MicroSDHCカードリーダー
- USBマウス、キーボード
- LANケーブル(※Wifi使うなら不要)
- ラズパイ本体を入れるケース(※これは任意)
こんな感じで接続します。
ラズパイには電源スイッチが無いので、電源ケーブルを差せば自動で電源が入ります。
しかし、OSが無いと画面が表示されないので、まずやることは、SDカードへのOS(Raspbian)のインストールです。
SDカードが空っぽだと、電源を入れても画面に何も表示されないのは仕様なので、心配することはなかったのです。冷静に次の手順を進めていきましょう。
MicroSDHCが読み書きできるカードリーダを使って、パソコン経由でOS(Raspbian)をSDカードにインストールします。
ここで先人の知恵を利用させていただきます。以下の記事にとても詳しくやり方が書かれていますので、この通りやればOKですよ。
Raspberry Pi 3 Model B+の初回セットアップ(購入から起動まで)
ラズパイの起動ができたら、次はnode.js/npm/google-home-notifierとかの設定をしていきます。
Step2:google-home-notifierの動作に必要な設定をしていく
ラズパイの中身の設定はここも先人の知恵の通り進めればOKです。以下記事の中ほどにある「パッケージマネージャーの最新化」から順にやっていきましょう。記事内の手順と全く同じでOKです。
Google Homeにプッシュ発話をさせる、Raspberry Pi 3へのgoogle-home-notifierの最新導入手順
パッケージマネージャーの最新化からずーーーーっと進めていって、最後のサンプルプッシュ発話実行までできましたでしょうか。ここのステップでは特に詰まる点は無かったと思います。
次は、ラズパイの外からhttpリクエストで任意のテキストをプッシュ発話できるようにします。
Step3:GoogleHomeに喋らせたい内容をhttpでリクエストできるようにする
ここからは、別の先人の記事を参考に進めていきます。
以下の記事の中ほどの「google-home-notifierの設定」から順にやっていきましょう。
GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
なお、記事の通りにexample.jsをソース変更していくのですが、変更する前にまずオリジナルのexample.jsはバックアップ取っておきましょう。ファイルをコピーしてexample_old.jsなどに変名しておけばOKです。
バックアップが終わったら、ソースは基本的に全部コピペでOKですが、2点だけ補足します。
var express = require(‘express’);
var googlehome = require(‘./google-home-notifier’);
var ngrok = require(‘ngrok’);
var bodyParser = require(‘body-parser’);
var app = express();
const serverPort = 8091; // default portvar deviceName = ‘ribihome’;
var ip = ‘192.168.1.10’; // default IP //ここにIPを記載引用元:GoogleHomeスピーカーに外部からプッシュして自発的に話してもらいます
ポートが8091になっているので、都合が悪い人は任意の値に変えておきましょう。あまりポートに詳しくない人は8091のままで大丈夫です。
そして、GoogleHomeのIPアドレスを記載する必要がありますので、調べて記載しましょう。調べ方は、GoogleHomeのアプリから調べることができます。
こんな感じで表示されています。
IPアドレスが変動したら動かなくなってしまうので、ルーターの設定でIPアドレスの固定化をしておきましょう。あとでまとめて解説します。
私の場合は192.168.179.8なので、以下のようなコードになります。
var express = require('express');
var googlehome = require('./google-home-notifier');
var ngrok = require('ngrok');
var bodyParser = require('body-parser');
var app = express();
const serverPort = 8091; // default port
var deviceName = 'Google Home';
var ip = '192.168.179.8'; // default IP //ここにIPを記載
コードを編集し終えましたら、ターミナルから実行してみましょう!
node example.js
ちょっと見づらいですが、以下のような待ち受け状態になったと思います。(スクショの撮り方が分からなかったのでカメラで撮ってます。あとで調べます、すみません。)
あとは別のPCやスマホからhttpリクエストをこのラズパイに投げればOKです。
まずラズパイにhttpリクエストを投げるには、ラズパイのIPアドレスを知る必要があります。
ターミナルで「ip a」と打つと、ラズパイのIPアドレスが分かります。
これを見ると、192.168.179.4だということが分かりますね。なおこれも、ルーターの設定でIPアドレスの固定化をしておきましょう。あとでまとめて解説しますね。
では同一ネットワークの(同じWifiを使用している)パソコンやスマホから、Chromeなどのブラウザを起動してアドレスバーに以下を入力してみてください。
http://<IPアドレス>:<port番号>/google-home-notifier?text="<メッセージ>"
例)http://192.168.179.4:8091/google-home-notifier?text="こんにちは"
入力したらGoogleHomeが”こんにちは”と喋ってくれれば成功です!
ブラウザはこんな画面になると思います。
もしここまでやったのにGoogleHomeが喋ってくれないという方は、
- ソースコードの改変が手順通りか?
- ソースコードに記載したポート・IPアドレスと、”http://<IPアドレス>:<port番号>”のポート・IPアドレスが一致しているか?
- http://~のリクエストを実行するパソコン・スマホと、ラズパイ、GoogleHomeが同じネットワーク上にあるか?
の3点を確認してみてください!
では、この状態では同一のネットワークでしか動作しないので、最後にこれを外部のネットワークから(外出先から)でも利用できるようにしてみます。
Step4:ラズパイを外部からアクセスできるようポート開放する
先ほどの、
「http://192.168.179.4:8091/google-home-notifier?text=”こんにちは”」
この192.168.179.4というのは、ローカルIPアドレスなので、同じネットワークにいるパソコンやスマホからじゃないとアクセスできません。
今の状態は図にするとこのような感じです。
これを外部からでもアクセスできるようにグローバルIPで指定できるようにします。
図にすると、冒頭の図のようなイメージです。
これを実現するためには、
- グローバルIPアドレスを持っていること
- ポート開放(ポートマッピング)すること
の2つが必要になります。
グローバルIPアドレスを持っているか確認
まずラズパイに接続しているネットワークがグローバルIPアドレスを持っていることが最初の条件です。
基本的に、フレッツ光とかのファミリータイプで回線を引いている家であればグローバルIPが払い出されているのですが、アパートやマンションにお住まいだと共同回線を使用するマンションタイプになっている場合が多いので、プライベートIPが払い出されている可能性があります。
あとは、固定回線を引いていないソフトバンクAirなどの固定回線無しのサービスを使用している場合もグローバルIPではなくプライベートIPの可能性が高いです。
まずはご自分の家のネットワークがグローバルIPなのかどうかを確認してみてください。
確認方法は、「回線名+グローバルIP」とかでググると出てくると思います。
※もし分からなければ、次の手順にそのまま進んでみてください。もし次の手順が設定できない、または設定したのに動かないという場合はプライベートIPである可能性が高いです。
もし家のネットワークがプライベートIPだった場合は、グローバルIPが払い出される格安SIMを使うという手もあります。OCNモバイルoneやイプシムはグローバルIPが払い出されるSIMなので、これを使ってスマホからテザリングするという方法ですね。
ポート開放(ポートマッピング)する
外部からラズパイにアクセスするためにはルーターのポート開放が必要です。
ルーターやパソコン(OS)が外部からの通信をブロックしてしまうので、ブロックしないようにルーターやOSの設定をしていきましょう。
ただし今回は、使用するポートをデフォルトの8091に指定された方は、ラズパイ側の設定を何も変更しなくてもルーターの設定だけでOKのはずです。
ルーターのポート開放の方法は各種ルーターのマニュアルを見て各自行っていただくことになりますので、まずは「ルーター名+ポート開放」や「ルーター名+マニュアル」などでググってみてください。
今回は、私が使用している「Aterm MR05NL」のルーターの設定例を記載していきます。基本的にはどのルーターでも画面が違うだけで手順は似たようなものになると思います。
まるはルーターの管理画面にログインします。Atermの場合はブラウザでhttp://aterm.me/または”192.168.179.1″と入力すると、ログイン画面が表示されてログインできます。
次に、ポート開放の設定を開いて設定します。
そして、ラズパイとGoogleHomeのIPアドレスが変更されないように、IPアドレスの固定化を行います。
Macアドレスの確認方法ですが、GoogleHomeのMacアドレスはGoogleHomeアプリで確認します。GoogleHomeアプリからGoogleHomeのIPアドレスを調べた際に、同じ場所にMacアドレスも表示されていましたね。
そしてラズパイのMacアドレスは「ip a」コマンドで確認します。ラズパイのIPアドレスを調べた時と同じように、Macアドレスも「ip a」コマンドで表示されています。
以上でポート開放の手順は完了です。
最後に、グローバルIPアドレスを確認します。以下のページにアクセスすると確認できます。
赤で囲った部分にグローバルIPアドレスが表示されていますので、メモっておきましょう。
さて、それでは実際にやってみましょう。
ラズパイとは別のネットワークのパソコンやスマホのブラウザから、
「http://<グローバルIPアドレス>:8091/google-home-notifier?text=”こんにちは”」
を打ってみましょう。
グローバルIPアドレスには今調べたアドレスをそのまま入力します。
できましたでしょうか!?
もしできない場合は、
- ルーターのポート開放設定が正しくない
- そもそもグローバルIPアドレスではない
可能性がありますので、「ルーター名+ポート開放+できない」とかで調べたり、お使いの回線がグローバルIPアドレスなのかどうかもう一度調べたりしてみてください。
まとめ
以上の手順で、目的の「GoogleHomeを自発的に喋らせる」ことができました。そしてポート開放することで外部ネットワークからでも喋らせることに成功しました。
私は、Widnowsのタスクスケジューラにhttpリクエストをタスク登録しておいて、ある時間になったらお知らせを自動で喋らせる運用をしています。
みなさんもぜひ、ラズパイを使ってプッシュ発話を実現して色々遊んでみてくださいね。