つい先日、Google Assistant SDK がサードパーティーに公開され、RaspberryPiでも利用できる様になったので、早速試してみました。
RaspberryPi GoogleAssistant - YouTube
おなじみ「OK Google」から音声コマンドを使って、天気情報やGoogle音声検索などが行えます。
今回公開されたSDKはIFTTTとの連携が簡単に行えます。試しに音声で照明の点灯・消灯などを試してみました。残念ながら今のところ日本語対応はしていないのですが、相変わらずGoogleの音声認識精度はとても高いと感じました。
SDKはpip
でインストール出来、手軽に使う事が出来ます。簡単にまとめてみます。
環境
- Raspberry Pi3 (RASPBIAN JESSIE WITH PIXEL 4.4 / Python 3.4.2)
- LOGICOOL ウェブカム HD画質 120万画素 C270
- ミニロボットPC等用スピーカー小型かわいい白
- 7インチ(1024*600) IPS液晶パネル ディスプレイ
- irMagician-T(大宮技研)
音声入力用のマイクはウェブカムのマイクを使用しました。
Google Cloud PlatformでAPIの認証情報を取得する
公式ページのドキュメントに沿って設定をすれば比較的簡単に設定する事が出来ます。SDKはGoogleCloudPlatformを利用しますのでアカウントの設定はあらかじめしておきます。
ドキュメントにある「GO TO THE PROJECTS PAGE」ボタン押下でプロジェクトが自動的に作成出来ます。このプロジェクトのAPIキー経由で、Googleのサーバーを利用し音声認識を行う事が出来ます。
「API Manager」→「認証情報を作成」により、「APIキー」と「クライアントID」を作成します。
「クライアントID」で一つ注意が必要です。今回はRaspberryPiを利用しますので「その他」を選択して下さい。
「クライアントID」が取得出来たら「クライアントシークレット」のJSONファイルをダウンロードします。ドキュメントに従って
$ scp ~/Downloads/client_secret_XXXX.json pi@<raspberry-pi-ip-address>:/home/pi/
password: <password-for-raspberry-pi>
RaspberryPiのIPアドレスとパスワードを設定します。
Google Assistant Python Sample
googlesamples/assistant-sdk-python - GitHub
公式のレポジトリにSDKのインストール方法が詳しく書かれているのでRaspberryPiにpip
でインストールします。
$ sudo apt-get install portaudio19-dev libffi-dev libssl-dev
$ sudo python3 -m pip install --upgrade google-assistant-sdk[samples]
IPアドレスとパスワードを事前に登録しているので、環境変数の設定などをせず利用出来ます。ユーザーフレンドリーなSDKですね。
$ python3 -m googlesamples.assistant
INFO:urllib3.connectionpool:Starting new HTTPS connection (1): accounts.google.com
INFO:root:Connecting to embeddedassistant.googleapis.com
Press Enter to send a new request...
これでGoogleAssistantと会話ができる様になります。時間や天気、単語検索などはサンプルコードからも利用出来ます。
IFTTTに登録する
GoogleAssistantはIFTTTのレシピになっているので、連携が簡単に行えます。試しに「『Tweet』と発話したらツイートする」レシピを作ってみます。
レシピを保存、実行したら、RaspberryPiにGoogleAssistantを立ち上げて「Tweet」と言ってみます。
こんな感じでツイート出来ました。
さて、ここからが本番です。ドキュメントにはIFTTTの「Maker Webhooks」を使うと簡単に出来るよ。と書いてあります。RaspberryPiのローカルサーバーにWebhookを送信するには「ngrok」を使うと良いと書いてあります。
ngrok
今まで知らなかったのですが、これを利用するとローカルサーバーのアドレスを公開アドレスとして利用する事が出来ます。このアドレスを利用してIFTTTからGET(POST)リクエストを送信しRaspberryPiを動かすという仕組みです。
RaspberryPiのChromiumから公式ページを開き、「LINUX ARM」版をダウンロード、解凍するとアプリを利用出来る様になります。
無料アカウントを登録するとリクエストトークンが発行されるのでRaspberryPiに登録します。登録が終わったら以下の様なコマンドを実行します。
$ ./ngrok http --region ap 8080
これでアジアリージョンのアドレスとlocalhostの8080番ポートを紐づける事が出来ます。
ngrok by @inconshreveable (Ctrl+C to quit)
Session Status online
Account xxxxxx (Plan: Free)
Version 2.2.4
Region Asia Pacific (ap)
Web Interface http://127.0.0.1:4040
Forwarding http://xxxxxxxx.ap.ngrok.io -> localhost:8080
Forwarding https://xxxxxxxx.ap.ngrok.io -> localhost:8080
Connections ttl opn rt1 rt5 p50 p90
0 0 0.00 0.00 0.00 0.00
無料プランでは実行の度にアドレスはランダムに変わってしまいます。固定アドレスを使用するには有料プランに課金しないといけないみたいですね。
さて、もう少しです。RaspberryPiにローカルサーバーを立て、IFTTTからのリクエストを受け取れる様にします。
ローカルサーバーを立てる
node.js
でローカルサーバーを立てる際はフレームワークexpress
を利用していたのですが、Pythonでは初めてだったので、一番シンプルそうなbottle
フレームワークを利用しました。
irmagicianのPythonライブラリは netbuffalo/irmcli - GitHub こちらで公開されているので、これをPython3で動作する様に一部書き換え、bottleでローカルサーバーを立てました。
irmagicianの赤外線読み取りはiOS10「ホーム」アプリと「Raspberry Pi + irMagician」でお手軽家電操作。 - Qiita この記事と同じです。
さて、これでpython3 app.py
でローカルサーバーhttp://localhost:8080
が立てられ、パスhttp://localhost:8080/light_on
に接続されると照明がつき、http://localhost:8080/light_off
に接続されると照明を消せる様になりました。
ngrokを作動させておけば、外部アドレスとしてhttp://xxxxxxxx.ap.ngrok.io/light_on
とhttp://xxxxxxxx.ap.ngrok.io/light_off
でRaspberryPiを動作させる事が出来ます。
IFTTTと連携する
さて、ようやく準備が整いましたのでIFTTTと連携させてみます。
これは照明をつけるレシピです。消灯のレシピと合わせて登録すれば完成です。
まとめ
RaspberryPiに特化したSDKなのでインストールが楽に行え(重要)、高性能な音声認識を利用する事が出来ました。
WebサービスやRaspberryPiの様なIoT機器との連携が手軽に出来るので日本語対応が楽しみですね。では。
追記(2017/5/21)
SDKが0.1.0から0.3.0にバージョンアップしていたので追記します。
Download the Library and Run the Sample - Google Assistant SDK
oauthの認証をライブラリを使って行うように変更になっています。
上記サンプルでは仮想環境を作らずそのままSDKをインストールしていたのですが、新しいバージョンだと動作しませんでした。
リンクを貼っておきますので詳しくはそちらをご参照下さい。では。