これは何?
我が家には生後4か月ほどの娘がいます。
生後2か月ごろから、いわゆる「ねんねトレーニング(ねんトレ)」をはじめ、ある程度スケジュールに沿って、授乳・睡眠をさせています。
さて、この「スケジュール」ですが、基本的には親が気にしながら生活して、ミルクを与えたり、ベッドに連れて行ったりするのですが、せっかくなら娘にもスケジュールを意識してほしい! ということで 睡眠時間が近づくと「こもりうた」を再生し、それにより「これから寝るんだな!」ということを意識してもらおうと考えました。
(この月齢で、そういうことが意識できるのかはよく知りませんが、まぁそういうのもやってみるといいのかも・・程度で実践しているだけです。)
要件
さて、では要件を整理します
- 1日数回の決められた時間で再生する
- 再生する曲は毎回同じ曲
- 曲の長さは3分ほど
まぁ、こんなとこですね。
Google Homeがあれば簡単?
我が家にはGoogle Homeがあります。ということで当初はそんなこと簡単に出来るだろうと思い調査を始めました。
まずは「決められた時間」という点です。これはGoogle Homeの「ルーティン」という機能が使えそうでした。この機能は、「時刻」と「Google Homeへ伝える文字列」を登録することで、その時間になると、Google Homeに自動的に命令が発行される仕組みです。
この「ルーティン」機能で「こもりうたを再生する何らかの命令」を実行することで、要件を満たせると考えました。
Google Homeで指定した曲を再生する
我が家のGoogle Homeの音楽のプロバイダはSpotifyの無料アカウントで登録しています。ということで 「〇〇を再生して」と伝えるとSpotifyにより音楽が再生されます。しかし無料アカウントの範囲では、指定した曲を再生することはできず、代わりに適当なプレイリストの曲がランダムに再生される仕様となっています。
ということで、Google Homeで標準的に音楽再生を指示する「〇〇を再生して」を「ルーティン」で実行するだけでは要件である「再生する曲は毎回同じ曲」を満たすことができません。
ちなみに、こもりうたの音源は同じ曲であれば何でも良いと考えていたので、著作権フリーのこもりうた音源のmp3ファイルを探してきました。しかしGoogle Homeではこのmp3ファイルを再生することができないようです。
手元にスマートスピーカーとmp3ファイルがあるのに、これを定時に自動再生することができない・・というのは、何とももどかしい話です。
Actions on Google
ここであきらめないのがエンジニアです。
Google Homeで動かすコマンドは自作できる、ということを知っていたので、それを駆使して、こもりうたの再生を試みることにします。
そのために利用するのがActions on Googleです。これを使うことでGoogle HomeやGoogle アシスタント用のチャットボットを作る事ができます。
プログラム不要で作れる「こもりうたタイム」
Actions on Googleでのアプリケーション開発はDialogflowというWeb開発ツールで行います。複雑なアプリケーションの場合はそこからさらに外部のWebサービスを作成し、そのサービスとやり取りをするような仕組みを作る必要があります。
しかし今回作ろうとしているのは「単にmp3を再生するだけ」の仕組みです。
そのようなややこしい開発をせずともDialogflowを少し使うだけで作る事ができました。
具体的には「Default Welcome Intent」という、対象のActionが呼び出された際に起動するIntentに少し細工をするだけです。IntentにはResponseと呼ばれる「返答」を登録することができ、そこには通常日本語の文字列を登録します。
例えば「はろー」と登録しておくと、そのActionが呼ばれたとき(「OK Google。〇〇につないで」といったとき)「はろー」とGoogle Homeがしゃべります。
実はこの部分、単なる日本語以外にも「SSML」という言語を記述することができます。
音声合成マークアップ言語(SSML) | Cloud Text-to-Speech のドキュメント | Google Cloud
これを利用すると下記のように記述することで、mp3ファイルを再生することができます。
<speak>お休みの時間です。<break time="1s" /><audio src="MP3ファイルのURL" /></speak>
これだけで、目的のActoinは完成です。
Actionの公開
さて、1行だけの簡単なActionですが、完成しました。
ということで「Assistant Directory(Google Assistant)」に公開申請をしてみます。
プライバシーポリシー文書の用意や、Directoryでの説明用の文言などを登録し公開申請をします。
何度かRejectされましたが、修正することで無事公開することができました。
https://assistant.google.com/services/a/uid/0000002b0ea1b142
ということで下記のようにルーティンを設定することで、指定した時間にこもりうたを再生できるようになりました!やったー!
困っていること
さて、ここまでで無事 Actionが作れて、ひとまずは意図した動作をしています。
我が家では娘が寝る時間の15分前になると「こもりうた」が流れるようになりました。
しかし、現在もまだ解決していない問題がいくつかあります。
時々こもりうたが再生されない
SSMLのAudioタグが時々失敗しているようなのです。紹介したSSMLで「お休みの時間です」と喋った後にmp3が再生されず、延々とGoogleHomeがアプリに接続したままになってしまうという現象が、結構な頻度で起きます(10回中1回くらい?)
この原因がさっぱりわからず、またデバッグの方法もわかりません。
個人的には再生エラーをGoogle Home側で検知し、mp3ファイルの再生をリトライしてほしいところです。
ルーティン以外から起動することが難しい
このActionの名前は「こもりうたタイム」としました。
そのためGoogle Homeから起動するときは「こもりうたタイム につないで」と伝える必要があります。
「ルーティン」で登録する場合は、この文言をアプリから文字として入力するので、問題なく起動します。
しかし、口頭でこのアプリにつなげる際に問題が生じます。しゃべり方によっては「子守歌タイムにつないで」と勝手に漢字に変換されてしまい、Actionが起動しないことがあるのです。
口頭だと必ず漢字に変換されるかというとそんなこともなく、なんとなくゆっくり目にしゃべるとひらがなとして認識されたりもします。
個人的には日本語の場合は、「読み」でActionを特定するようにしてほしいです、もしくはActionに複数の名前を登録できるのであればそれでも解決できます。
ActionのPermaLinkのOGP/Twitter Cardがおかしい
せっかく作ったActionなのでほかの人にも使って欲しい!と思いActionのPermaLinkをTwitterやFacebookに貼るわけですが、その際のOGP/Twitter Cardがおかしいです。
nullって・・
折角画像も作ったのにこれもOGP/Twitter Cardに反映されていません・・これは残念です・・
まとめ
さて、いくつか問題が残っていますが、当初予定していた「決められた時間に子守歌を再生する」という要件を満たす仕組みをGoogle Homeを使って実現することができました。
しかし、Google Homeは何でもできるようで意外なところで痒い所に手が届かないなという印象です。またGoogle Actionsもまだまだ完成度が低く、あまり使われていないような印象を受けました。
子育てを始めて、両手がふさがっているシチュエーションというのが意外に増えてきたので、Google Homeなどのスマートスピーカーの有用性を身にしみて感じています。今後この記事に書いたような問題点が解消し、さらに使いやすいスマートスピーカーとなってくれることを期待しています。