Amazon EchoをRaspberry Piのワイヤレス音声認識マイク&スピーカとしてミクさんの声で喋らせたり家電制御(リモコン制御)する方法

f:id:karaage:20180221013326j:plain:w640

Amazon EchoをRaspberry Piのワイヤレス音声認識マイク・スピーカとして使いたい

 我が家では、Amazon Echoを壁掛け設置して色々便利に活用しています。

 ただ、そんな中。妻から色々不満の声が上がってきました。具体的には以下です。

  • リマインダでいちいち2回言うのが気にくわない。1回で良い
  • 音声認識で家電(テレビ・リモコン・ルンバ)の制御がしたい
  • からあげDashボタンの音声認識率が悪くてつかえない

 ここまできたら、Amazon Echo単体では、如何ともしがたいですね。そんなときの強い味方が我らがRaspberry Piです。要はAmazon EchoをRaspberry Piのワイヤレス音声認識マイク&スピーカと使うことができれば何でもできます(ラズパイ脳なのでRaspberry Piなら何でもできると信じている)。

 というわけで、今回は色々ネット情報調べて試行錯誤して、自分なりのAmazon EchoとRaspberry Piを連携させるベストプラクティスを見つけたので、その方法に関してご紹介したいと思います。助けられた先人の知恵は、本記事の最後に参考リンクとしてまとめていますので、この記事で分かり辛いという人はそちらも参考にしてみて下さい。

システム概要

 今回構築したシステムは以下のようなイメージとなります。

f:id:karaage:20180221015258j:plain:w640

 Amazon EchoとRaspberry Piを入力・出力両方向で連携させるところが肝で、これによりAmazon EchoをあたかもRaspberry Piの音声認識マイク&スピーカとして使うことが可能になります。このシステムでは、Raspberry PiからAmazon EchoへはBluetoothで、Amazon EchoからRaspberry PiへはNode-REDを用いて接続しています。Node-REDのところは、実際には「Node-RED Alexa Home Skill Bridge」でブリッジしたりと間に色々あるようなのですが(あんまり分かってない)、使うときはユーザはそこらへんは特に意識しないで、Amazon EchoとRaspberry Piがローカルネットワークで繋がっているかのように動作してくれるのが大変ありがたいです。

 Amazon EchoからRapberry Piへの接続は、他にも「IFTTT + Slack + Hubot」 の組み合わせや、「Alexa Skills Kit + AWS lambda + AWS IoT」の組み合わせなど色々な手段があるようですが、IFTTTの日本語認識率が致命的に悪いとか、多くのサービスを使用して煩雑とか、スキル作成は初心者にはハードルがあるなどそれぞれ色々難点があるので、今のところNode-RED使うのが一番シンプルで応用も効きそうで良いかなと思っています(個人の感想です)。

事前準備

 まずは、Amazon EchoとRaspberry Piを用意しましょう。

Amazon Echo Dot (Newモデル)、ブラック

Amazon Echo Dot (Newモデル)、ブラック

 Raspberry Piに関しては、以下の記事を参考にRaspberry Piの基礎的なセットアップをします

 リモコン制御に関しては、以下の記事の irMagicianかVIR-USB赤外線学習リモコンセットのところを参考にして、コマンドでリモコンを操作できるようにしておきましょう。今回は、Siriは使わないので、homebridge関係のセットアップは不要です。

 VIR-USB赤外線学習リモコンをRaspberry Piに繋いでセットアップした図 f:id:karaage:20180221013312j:plain:w640

Amazon EchoをBluetoothスピーカとして使ってミクさんの声で喋らせる

 これは以前Bluetoothのスピーカと繋いだことあるので簡単でした。以下記事の「スマートフォン・Raspberry Piとスピーカーの接続性」という項目を参照下さい(私が以前に、はてなニュースさんに寄稿した記事です)。

 上記では、Pringlesとなっていますが、Amazon Echoの場合は以下のように表示されます。

f:id:karaage:20180214004144p:plain:w480

f:id:karaage:20180214004150p:plain:w480

 あとは、Raspberry Piに喋らせるだけです。Raspberry Piにミクさんの声で喋らせる方法は以下記事を参照下さい。

 うまくいけば、以下のような感じにAmazon Echoにミクさんの声で好きなことをしゃべらせることが可能です

 Bluetoothは、Raspberry PiとAmazon Echoの接続性を気にしていたのですが、Raspberry Piを1日放置しても接続したままでしたし。Raspberry Piを一旦電源切って再起動しても、自動的に接続してくれるので、そこまで悪くは無さそうです。

 後は、cronとか使えばRaspberry Piを使って、Amazon Echoにミクさんの声で好きなタイミングで好きな言葉をしゃべらせることができます。リマインダのように2回繰り返すこともないですね。

 天気予報やグーグルカレンダーの予定読み上げなども、以下記事参考にすれば簡単に実現できると思います。といっても、これらの機能はAmazon Echo単体でもある機能なので、利点はミクさんの声にできることくらいですが。

家電制御(リモコン操作)

 Amazon EchoからRaspberry Piへの通信を実現するには、以下の3つの設定をする必要があります。といっても、上2つは決まり切ったことをするだけで、肝となるのはNode-REDですね。

  • Node-RED Alexa Home Skill Bridge(Webサービス)
  • スキル追加(Amazon Echo)
  • Node-RED(Raspberry Pi)

 順に設定していきます。

Node-RED Alexa Home Skill Bridge の設定

 Amazon EchoとRaspberry Piを繋げる(ブリッジする)ためのサービスです。以下サイトにアクセスします。

Node-RED Alexa Home Skill Bridge

 以下の画面から左上のRegisterをクリックします f:id:karaage:20180214010514p:plain:w640

 以下画面のAdd Deviceをクリック f:id:karaage:20180214010517p:plain:w640

 好きな名前のデバイスを作成します。とりあえず今回はkechoとしました。karaage echoね。 f:id:karaage:20180214010518p:plain:w640

Amazon Echoのスキル設定

 続いてAmazon Echoのスキル設定をしましょう。まずはスマートフォンのAmazon Alexaアプリを起動します。以下はiPhoneでの設定例ですが、他のスマホでも基本は同じだと思います。

 まずはスキルで、「Node-RED」で検索しましょう。「node」とかでもOKです。「Node-RED」というスキルが出てくるはずなので、クリックしましょう。 f:id:karaage:20180221002738p:plain:w480

 有効にしようとすると以下のような画面が出てきますので、「Node-RED Alexa Home Skill Bridge」で設定したユーザ名とパスワードを入力しましょう f:id:karaage:20180221002731p:plain:w480

 成功すれば、以下のようにスマートホームのメニューに以下のように先ほど登録したデバイス「kecho」が出てきます f:id:karaage:20180221002724p:plain:w480

 「kecho」を選択すると以下のような画面が出てきます。 f:id:karaage:20180221004043p:plain:w480

 まだ「kecho」の中身を作っていないので当然オン、オフをタップしても何も起こりません。また、このままだと「kecho」がAmazon Echoの音声認識のトリガとなってしまうため、呼びやすい名前に変えておきましょう。

 そのために、右上の編集をタップして以下のような画面に遷移します。

f:id:karaage:20180221004049p:plain:w480

 名前を編集という項目をタップすると「kecho」を好きな名前に変えることができます。今回は照明を制御したいので、「ライト」という名前にしてみました。

f:id:karaage:20180221003754p:plain:w480
 デバイスの名前がライトになりました

 複数のデバイスを登録したい場合は、「Node-RED Alexa Home Skill Bridge」でデバイス追加した後、上記スマートホーム画面の「デバイスを追加」をタップしてしばらく待つだけでOKです。

 これでAmazon Echoから音声認識で自分で作ったNode-REDの仮想デバイスを呼び出す準備ができました。次は、いよいよNode-REDの中身を作っていきましょう。

Raspberry Pi側のNode-REDセットアップ

 最初にターミナルから、以下コマンドを実行してアップデートしましょう

$ update-nodejs-and-nodered

 最初アップデートしないで設定しようとしたら、以下のように肝心のノードを追加する項目(パレットの管理)が設定に出てこなくて焦りました。必ずアップデートしましょう。 f:id:karaage:20180219234634p:plain:w640

 アップデート完了したら、以下コマンドでNode-REDを起動します。

$ node-red-start

 また、以下コマンド実行しておくと、次回からはRaspberry Piが起動すると自動的にNode-REDが立ち上がるようになります(上記のコマンドの入力が不要になります)。

$ sudo systemctl enable nodered.service

 これでRaspberry Pi上にNode-REDサーバが立ち上がるようになりました。Node-REDはブラウザからサーバにアクセスして、開発していく流れになります。Raspberry Piでブラウザを立ち上げてアクセスしてもよいのですが、GUIでの開発にRaspberry Piだと少し非力なので、Raspberry Piと同じネットワーク上にあるPC(Mac)のブラウザからアクセスして開発していくことにします。

 ブラウザのアドレス欄に、Raspberry PiのIPアドレスを入力しましょう(分からなければRaspberry Pi上でifconfig というコマンド打つとそれっぽい数字が出て来ます)。もしくは、ホスト名経由でもアクセスできます(Macの場合は設定不要です。WindowsはiTunesをインストールすればOKのはず)。今回Raspberry Piは kechoという名前にしたので、kecho.localでアクセスします。

f:id:karaage:20180215003741p:plain:w640

 上記のような起動画面が表示されたら、右上のメニューボタンから、パレットの管理をクリックします f:id:karaage:20180215004313p:plain:w640

 パレット->ノードを追加で「node-red-contrib-alexa-home-skill」を検索。ノードを追加しましょう。 f:id:karaage:20180215004327p:plain:w640

 左下にalexaのノードが追加されます f:id:karaage:20180215004430p:plain:w640

 ここからは、Node-REDのプログラミングになります。レゴのブロックみたいにGUIでノードをつないでいって機能を実現するのが作法のようです。とりあえず参考サイトなどをみながら勘で作ってみます。

 alexa homeをドラッグアンドドロップして、画面に置いて選択。Accountの鉛筆マークをクリックします。 f:id:karaage:20180215004410p:plain:w640

 ユーザ名とパスワードは、もちろん「Node-RED Alexa Home Skill Bridge 」で設定したものを入力します f:id:karaage:20180215004456p:plain:w640

 kechoが選択できます。 f:id:karaage:20180215004512p:plain:w640

 あとは、「機能」の「switch」と「その他」の「exec」を使って、以下のようにAmazon Echoで音声認識したON/OFFを元にライトをオン・オフするという流れを作ってやります。なんとなく動きはこの絵をみると想像できますね。 f:id:karaage:20180221010517p:plain:w640

 「switch」の設定は以下のようにしています。オンとオフで行き先を切り替えているだけですね f:id:karaage:20180215004544p:plain:w640

 「exec」の設定は以下の通りです。ここで、Raspberry Piに実行させたい好きなコマンドを入力しましょう。今回は照明のリモコンONにするコマンドを使用しています。引数のmsg.payloadのチェックは外しておきましょう。 f:id:karaage:20180221010844p:plain:w640

 設定終わったら、最後に必ず右上の「デプロイ」をクリックしましょう。デプロイの意味わからない人は、ファイルの保存くらいにとらえておいてください。私も正直あんまり分かってないです。

 これで設定はOKです。

動作テスト

 続いては動作テストしてみましょう。まずはAmazon Alexaアプリのスマートホームから「ライト」を選択して、「オン」「オフ」をタップしてみましょう。 f:id:karaage:20180221003702p:plain:w480

 問題無ければ、Raspberry Piが設定したコマンドを実行して、今回は照明をオン・オフします。うまくいかないときは、ブラウザでNode-REDサーバにアクセスしておくと、エラーの箇所が表示されますので、確認しましょう。

 ここまでうまくいったら、後はAmazon Echoに「アレクサ ライト オフ」「アレクサ ライト オン」と話しかけましょう。以下のように照明を制御してくれます。

 やったね!

 Amazon Echo、IFTTTを使うと、現状は異常に認識率悪いのですが、Node-RED経由の認識率は悪くなさそうな印象です。今後、他の単語も試してみようと思います。

まとめ

 Amazon EchoをNode-RED経由でRaspberry Piのワイヤレス音声認識マイク&スピーカとして使う方法を紹介しました。思ったよりシンプルな構成でAmazon EchoとRaspberry Piを連携させることができました。心配していた、Bluetoothとの接続性と音声認識の精度も、実用的なレベルにありそうな感触です。Raspberry Piで音声認識や音声出力を試してみたいという人は、マイクとスピーカ買う代わりにAmazon Echoを買うというのも良い選択肢かなと思いました。

 今回は家電制御として照明制御を試しましたが、今回構築したシステムならAmazon Echoの音声認識をトリガにRaspberry Piのあらゆるコマンドを実行できるので非常に応用範囲が広いと思います。例えば、、Raspberry Piを使って照明制御の他にリモコンで操作できるテレビ・エアコン・ルンバを制御したり、カメラを撮影したり、Slack、Twitter、はてなブログのようなWebサービスと連携させても面白そうですね。色々なことを試して実際に運用してみたいなと思っています。

Amazon Echo Dot (Newモデル)、ブラック

Amazon Echo Dot (Newモデル)、ブラック

参考リンク

Amazon Echo Dot(Alexa)とNode-REDで家電をスマートホームに対応させる - rochefort's blog

Echosim.ioを使うと日本でもAlexaでSmart Homeを実現できるので、安価なBlack Beanで照明やエアコンを制御してみた - 知的好奇心 for IoT

Amazon Echoとラズパイで、音声で照明をon/offする - Qiita

Amazon Echoで「○○をつけて」と言って家電を操作する - Qiita

【IoT】4.Node-REDの設定をしてみる - そこらへんのパパの独り言

カラスのノート: amazon alexa と raspberry pi を使って簡単にスマートホームを作る

素人でもスマートスピーカーから家電を操作できた - Qiita

関連記事