テレビを見たユーザを判定し、視聴時間をはかる
我が家では、基本的にはこども達にテレビを自由に見せていますが、やっぱり長時間テレビばかり見ているのは避けたいなぁと思い、家族のテレビの視聴時間を可視化してみることにしました。
家族それぞれの視聴時間を計測するには、「誰がテレビをつけたか」を判定しなければなりません。今回、だれがテレビを点けたかの判定にGoogle HomeのVoice Match機能を利用することでうまくいったので記事にかいてみました。
※注:2017年末につくったやつなので、古い内容があるかも知れません
システム構成
おおまかな全体構成を説明します。家にはIFTTT経由にて赤外線リモコンで家電を操作できるNature Remoと、Raspberry Piがあります。Raspberry PiはHDMIでテレビとつなげてあります。
![スクリーンショット 2018-02-12 23.41.11.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F160451%2Fad5973f7-3c39-65d2-4232-250ab96471c1.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=573fbdb884f6356283e32d6f32ce339f)
テレビ電源ONから視聴時間計測の流れは次の通りです。
- Google Homeに「テレビつけて」で、以下2つのIFTTTアプレットを起動
- Nature Remoで家のテレビを電源ON
- 視聴者を判定し、Firebase Realtime Databaseに視聴者の名前を書き込む
- Nature RemoはIFTTTに従って、テレビをONにする
- Raspberry Pi上のプログラムは、HDMI CECでテレビのON/OFF状態を常時監視
- Raspberry Pi上のプログラムは、テレビがONなら、Firebaseから視聴者名を取得し、その視聴者の視聴時間を更新
このシステムではGoogle Homeを使わずにテレビのリモコンで電源ONされるとシステムが機能しません。
そこで、Raspberry Piがテレビ電源ONを検知した際、Firebaseに視聴者名が登録されていなかった場合にはRaspberry Piからテレビの電源をOFFにすることで、必ずGoogle Home経由でテレビをつけることを強制しています。
それでは詳細を以下に説明します。
Voice Matchによる視聴者の判定
視聴者の判定には、題名のとおり、Google HomeのVoice Match機能を利用しました。Voice
Match機能とは、Google Homeに最大6人までユーザを登録でき、ユーザを声で識別してユーザ毎にカスタマイズされた情報(ショッピングリストやその日の予定など)を応答してくれる機能です。
このVoice Match機能で識別したユーザ名をIFTTTに渡すことができれば良いのですが、残念ながら識別したユーザ名をIFTTTに渡す機能はありません。そこで、Google Homeのショートカット機能を利用します。
ショートカット機能は、任意の言葉のショートカットを作る機能です。例えば、「目覚ましを止めて」のショートカットとして「おはよう」と登録しておけば、「おはよう」のあいさつで目覚ましをとめることができるようになります。
実はこのショートカット機能はVoice Matchのユーザ毎に登録することができるため、同じ言葉でもユーザ毎に異なる挙動を実現することができます。
![Voice Match](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F160451%2F5e2c662a-c61c-9f16-5ca0-3d1c13501af0.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=e57eb3f86018c3c978f027f592e91da2)
今回は上の絵のように、「テレビをつけて」というショートカットを、ユーザ毎に「テレビを太郎がつけます」や「テレビがママがつけます」という言葉に対応させました。
これにより、IFTTTからテレビをつけたユーザを判定することができるようになりました。
Voice Match・ショートカットの設定
アカウント追加
Voice Matchでユーザを判定するには、まず家族全員分のGoogleアカウントを取得します。
その後、スマートフォンのGoogle Homeアプリを開いて、アカウントを追加していきます。
追加方法は下の図をみればわかると思います。
![スクリーンショット 2018-02-14 23.13.43.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F160451%2F42a9fe5c-a2cb-3bf5-0994-22d2bacea8f2.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=62a34a9a8e172be6c2d1e5aef5b4da8e)
Voice Match、ショートカット設定
アカウントが追加できたら、各アカウント毎にユーザの声を認識させます。目的のアカウントを選択してから、設定画面にて「デバイス」を選択します(下図左)。次の画面で「アカウントをリンクしてください」を選択し、指示に従っていけばOKです。途中で「OK, Google」と何回か話しかけ、声を認識させるフェーズがあります。
ショートカットの登録は、設定画面の「その他の設定」、「ショートカット」から登録できます。「テレビをつけて」に対して、ユーザ名を反映させた「テレビをパパがつけます」に変換していますね(下図右)。
![スクリーンショット 2018-02-15 0.37.57.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F160451%2F8ad39564-c1ed-0856-c89f-7011faa22e24.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c2b2378cb85570f1782d27a9800f2d75)
IFTTTからFirebase Realtime DBの更新
Firebase Realtime DBは、REST APIで値を更新することができるので、セキュリティさえ気にしなければIFTTTから直接に値を更新することができます。
設定の仕方はQiita記事「新着メールを知らせてくれるGoogle Home」と全く同じなので割愛します。
Raspberry Piからテレビの状態検知
Raspberry Piからテレビの状態検知にはHDMIのCEC(Consumer Electronics Control)という機能を利用しました。このCECを使ったHDMI経由でのテレビ制御のやり方はQiita記事「Raspberry PiとテレビをHDMI接続してテレビのON/OFFを確認する」が詳しいです。
テレビ視聴状況の可視化&通知
テレビの視聴状況は、Google-Home-Notifierを使って、テレビの電源ON時にGoogle Homeに喋らせています。「パパの今週のテレビ視聴時間は現在○○時間だよ」という感じです。
グラフでの可視化もしたかったので、react-liquid-gaugeを使って下図のように可視化してみました。一週間7時間を上限としてパーセンテージで表示してます。
![スクリーンショット 2018-05-02 12.04.46.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F160451%2Fc012d75c-0d59-c65a-a9ea-a73fa5258f88.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=3161f6446f8343bec5c6f092af19cc76)
以上、Voice Matchとショートカットを使うとユーザを識別して動作することができるので、他にも面白いことができそうですね。ぜひ色々やっていきたいです。