テレビを見たユーザを判定し、視聴時間をはかる
我が家では、基本的にはこども達にテレビを自由に見せていますが、やっぱり長時間テレビばかり見ているのは避けたいなぁと思い、家族のテレビの視聴時間を可視化してみることにしました。
家族それぞれの視聴時間を計測するには、「誰がテレビをつけたか」を判定しなければなりません。今回、だれがテレビを点けたかの判定にGoogle HomeのVoice Match機能を利用することでうまくいったので記事にかいてみました。
※注:2017年末につくったやつなので、古い内容があるかも知れません
システム構成
おおまかな全体構成を説明します。家にはIFTTT経由にて赤外線リモコンで家電を操作できるNature Remoと、Raspberry Piがあります。Raspberry PiはHDMIでテレビとつなげてあります。
テレビ電源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のユーザ毎に登録することができるため、同じ言葉でもユーザ毎に異なる挙動を実現することができます。
今回は上の絵のように、「テレビをつけて」というショートカットを、ユーザ毎に「テレビを太郎がつけます」や「テレビがママがつけます」という言葉に対応させました。
これにより、IFTTTからテレビをつけたユーザを判定することができるようになりました。
Voice Match・ショートカットの設定
アカウント追加
Voice Matchでユーザを判定するには、まず家族全員分のGoogleアカウントを取得します。
その後、スマートフォンのGoogle Homeアプリを開いて、アカウントを追加していきます。
追加方法は下の図をみればわかると思います。
Voice Match、ショートカット設定
アカウントが追加できたら、各アカウント毎にユーザの声を認識させます。目的のアカウントを選択してから、設定画面にて「デバイス」を選択します(下図左)。次の画面で「アカウントをリンクしてください」を選択し、指示に従っていけばOKです。途中で「OK, Google」と何回か話しかけ、声を認識させるフェーズがあります。
ショートカットの登録は、設定画面の「その他の設定」、「ショートカット」から登録できます。「テレビをつけて」に対して、ユーザ名を反映させた「テレビをパパがつけます」に変換していますね(下図右)。
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時間を上限としてパーセンテージで表示してます。
以上、Voice Matchとショートカットを使うとユーザを識別して動作することができるので、他にも面白いことができそうですね。ぜひ色々やっていきたいです。