PR
4/1朝まで
どなたでも有料記事が読み放題「無料開放デー」開催中!

 みなさんは米Googleのスマートスピーカー「Google Home」をお持ちだろうか。米Amazon.comの「Amazon Echo」よりも早く販売され、家電量販店でも大量に売られているため、既に入手した読者も多いだろう。本連載でも以前、開発プラットフォーム「IFTTT」とGoogle Homeの連携について紹介したが、今回はちょっと趣が違う。筆者の家庭の話で恐縮だが、少し付き合ってほしい。

 我が家にはGoogle Homeが3台ある。あるとき妻から、「娘の部屋にあるスマートスピーカーに『ご飯だから降りていらっしゃい』と言わせられないの?」と言われた。娘の部屋は2階、妻はいつも1階にいる。夕食のたびに妻は2階上がり、娘に「ご飯だよ」と言っていた。「毎回、娘を呼ぶたびに2階に上がる手間が大変」ということで、その問題を解消するためにスマートスピーカーを利用できないか、ということだ。ということで私、父であり、夫であり、エンジニアとしての威信をかけて、この問題を解決するソリューションを考え、仕組みまで作ることにした。

 最初の難関は、家庭内のローカルネットワークとはいえ、どうやってリモートのGoogle Homeをしゃべらせるかということだ。しかも課題はそれだけではない。仮にスマートスピーカーに「ご飯ですよ」と言わせたとしても、それを娘が聞いたかどうかが分からない(寝ているかもしれない)。もしくは娘が聞いたとしても、意図的に無視するかもしれない。それでは今と何も変わらないので、何らかの手段で反応を確認する方法が必要だ。簡単なようで実現は思いのほか難しそうだ。

 本来のスマートスピーカーは、声で命令することで、何かしらのアクションを返すことが役割だ。残念ながら、少なくともAmazon EchoとLINEのスマートスピーカー「LINE Clova」は、我々のような第三者が遠隔でスマートスピーカーをしゃべらせるためのAPIは提供されていない。さらにAmazonやLINE自身でさえ、そういったサービスは提供していない。利用者の意図にかかわらず、スマートスピーカーが勝手にしゃべり出したら不気味なので仕方がないだろう。

 しかしローカルネットワークからであれば、Google Homeにしゃべらせることは可能だ。Google Homeは「Google Cast」に対応している。「Chromecast」をご存じの方は多いだろう。Chromecastを挿したテレビに対して、スマートフォンから動画再生を指示することができる。この仕組みがGoogle Castだ。Google Homeに対して、Google Castプロトコルで再生させたい音声ファイルのURLを投げ込めばいいのだ。

EnOceanデバイスで反応を確認

 妻がボタンを押すことで、娘のGoogle Homeにしゃべらせるようにすれば半分は完成だ。あとは娘がそれを聞いたかどうかを確認する方法を用意する必要がある。

 そこでボタンを押すと、家族の各部屋のGoogle Homeに「ご飯だよ」としゃべらせ、本人が止めるまで呼び続けるという家族にとって迷惑な仕様を考えた。さらに呼び出しには、バックグラウンドミュージックも挿入可能だ。なんとなくイラッとしそうな曲を選択してみた。これで呼び出されたら、家族はすぐにやってくるはずだ。

 もし再生のキャンセルをキャッチできれば、娘が反応したと分かる。それが分かれば、妻の手元にあるGoogle Homeに「娘が応答しました」としゃべらせるのだ。私の仕事部屋も2階だ。妻が使うボタンデバイスには2つのスイッチを用意し、どちらか好きな方を呼び出せるようにした。ちなみに、このスイッチは本連載で以前、紹介した電池要らずのEnOceanデバイスを採用した(写真1)。

写真1●Google HomeとEnOceanデバイス
写真1●Google HomeとEnOceanデバイス
[画像のクリックで拡大表示]

 この仕組みを作るゲートウェイとして、今回はASUSの「Tinker Board S」を使った。このゲートウェイにEnOceanのレシーバーUSBドングルを挿して、ボタンの押下を受信する。その後、前回紹介したNTTグループのAI(人工知能)「NTTCorevo」の音声合成APIを使って合成した音声ファイルを受信し、Google Castを使って該当のGoogle Homeにしゃべらせるのだ。

 今回はNode.jsで開発した。まず、ゲートウェイが行わなければならないのは、ローカルネットワーク上に存在するGoogle Homeの発見だ。Google HomeはmDNS/DNS-SD(Apple Bonjour)に対応している。このプロトコルを使ってGoogle HomeのIPアドレスを発見する。これについては、筆者がnode-dns-sdという名前のnodeモジュールをオープンソースとして公開している*1。次に、音声合成は、前回紹介したNTT corevoの音声合成APIを使った。このnodeモジュールも筆者が一般公開している*2

 最後に、指定のGoogle HomeにGoogle Castでしゃべらせる必要があるが、これは「node-castv2-client」というnodeモジュールを使った*3。nodecastv2-clientは、Google Homeに投げ込んだURLの音声ファイルの再生が中断されたイベントも取得できる。以上で、やりたいことが実現できた。

 なおGoogle CastはGoogle Homeに対して音声ファイルのURLを投げ込む。言い換えると該当の音声ファイルをホスティングしたWebサーバーが必要になる。そのため今回は、ローカルにWebサーバーを立ち上げ、Google Homeからのリクエストを受けられるようにしている。実際の動作については、YouTubeに動画としてアップしているのでご覧あれ*4

 なお今回はたまたまGoogle Homeを使ったが、今回紹介した仕組みは、Google Castを使って遠隔操作を実現している。そのためChromecastを挿したテレビやAndroid TV搭載のテレビ(ソニーの「BRAVIA」やシャープの「AQUOS」)でも動作する。

*1 node-dns-sd
https://github.com/futomi/node-dns-sd
*2 node-corevo-tts
https://github.com/futomi/node-corevo-tts
*3 node-castv2-client
https://github.com/thibauts/node-castv2-client
*4 YouTube
「ご飯だよ for Google Home デモ」
https://youtu.be/PYxfbE96vQM
羽田野 太巳(はたの ふとみ)
futomi 代表取締役社長、ニューフォリア取締役 最高技術 責任者
羽田野 太巳(はたの ふとみ) Webシステム開発およびWebコンサルティングに携わる。HTML5の気運が高まる以前からHTML5の探求を始め、HTML5専門サイト「HTML5.jp」を立ち上げ、HTML5の普及啓蒙に関わる。HTML5関連書籍や雑誌記事執筆も行う。現在は、Webベースのアプリケーション開発やデジタルサイネージ・システムの研究開発の指揮を執る。