見出し画像

Taskerを使って自宅に音声通知システムを構築した話

こんにちは!

前回、中古のAndroidタブレットを激安で入手したという話を書きましたが、今回はその活用として音声通知システムをつくったことについて書いていきます。もともとはカレンダーとしての利用を想定して買った端末では有りますが、家に常設しているAndroid端末という特性を活かして使ってみた感じですね。


やったこと

今回つくったのは、前回紹介したNexus 7を使って音声通知を行うシステムです。実はこれを応用してすでに色々と活用を進めているのですが、一つ一つ紹介していると長くなりそうなので、今回はそのうちの簡単なものだけ紹介します。その他のものに関しては、そのうち別途記事にしていきたいと思います。

Taskerを使って通知を読み上げるシステム自体はいろいろとやりかたがあるとは思いますが、今回はSlackを活用することにします。もちろん、各種アプリの通知をそれぞれ設定して読み上げるような形にしても別段問題はないのですが、僕の使い方と今後のカスタマイズを考えると、Slackで一本化したほうが何かと便利だからという理由です。このあたりは使い方でわかれるところだと思っていて、応用次第では例えば「Line」で特定の人から来たメッセージを読み上げる、なんてシステムも比較的楽に実装できたりします。

今回これをやってみようと思った理由は、常に家にあるタブレットの存在と相性が良いと思ったからです。スマホにこういう読み上げ機能をもたせるという手もありますが、外出中に通知が来たりするとめちゃくちゃ恥ずかしいと思うので、そういう事故が起こらないというのは大きいですw 僕の家には常時稼働のサーバーPCがあるのでそちらを使っても良いのですが、音声関係の扱いはちょっと面倒なので、Taskerでサクッと音声通知を実装出来るという点でも向いているかなと。


SlackのIncoming Web Hook

音声読み上げの通知にはSlackの「Incoming Webhook」というアプリを活用します。特定のURLにメッセージを投げ込めば、それがSlackに通知として出力されるので、Nexus側でその通知をキャッチして読み上げるというプロセスですね。

構成

Incoming Webhookについて簡単に説明すると、特定のURLにメッセージを載せたhttpリクエストを送ると、それがSlack側で予め設定したグループに投稿されるという比較的シンプルな仕組みです。詳細はSlackの公式ドキュメントやネット上の記事を調べてみてもらえればと思いますが、外部からSlackにポストできるようになるので、Slackで何かを自動化する際の基本となるものと言えるでしょう(あくまでも外部→Slackの一方通行なので、これ単体でできることは限られますが)。

単純に通知の読み上げをするだけなら必ずしもこれを使う必要はないのですが、最大のポイントはその汎用性の高さです。httpリクエストさえできればいいということは、実質的にインターネットに接続されている機器のどこからでも通知の指示が出せるということなので、できることの幅は遥かに広がります。Nexusの内部でやっている限りはその内部の情報をトリガーにするしかないわけですが、Incoming Webhookを経由させることで、インターネットにつながるあらゆるデバイスからトリガーを押すことができます。もちろん、Nexus自体もインターネットにつながるので、Nexus内部の情報をトリガーとすることも可能です(Taskerにはアクションとしてhttpリクエストが出来る機能もあるので、実装も楽です)。

詳細は今後の記事に書いていくつもりですが、これが出来ると汎用性は飛躍的に上がる感じですね。Incoming Webhookの仕組みがシンプルで、実装が楽なのもGoodです!

あとは、読み上げの適用アプリの設定をSlackに一本化できるのもメリットと言えばメリットです。また、音声読み上げは自宅だけですが、通知自体はSlackをインストールしている端末全体にいくというのもいい感じですね。手元の携帯にもどんな通知が来ているのかが配信されるので、外出先からでも通知内容はチェックできます。


帰宅検知通知

ということで、まずはテスト的に家に帰ってきた時に声をかけてくれる機能を実装します。「おかえりなさい」と言ってもらっても良いんですが、それだとベタすぎる気がするので、「ゆっくりしていってね」と言ってもらいましょうw

やり方としては、Nexus側で周囲のBluetooth端末をチェックして、いつも携帯しているスマホが認識されたら帰宅とみなすという実装です。このあたりはTaskerを使えばお手の物ですね。


トリガーの設定は以下のような感じ。

「プロファイル→状態→ネット→近くのBluetooth」として名前の欄にスマホの名称を記載すればOK。その他の細かい設定はよくわかりませんが、「標準的な機器」「Low-Energy(LE)機器」のチェックを入れておきます。


そして、このトリガーに対応するアクションとしては、

「ネット→HTTPリクエスト」として、方式は「POST」、URLはIncoming WebhookのURL、本文に{"text":"ゆっくりしていってね"}と入力。ついでに、カレンダーとして使う関係上、家にいるときは画面は常時点灯してほしいので「画面→常時点灯」の設定もしておきます(今回の本筋ではないので、ここの詳細はカット)。

さらに離脱時(外出時:スマホのBluetoothの検出しなくなったとき)のアクションとして「画面→画面消灯」の設定と、「行ってらっしゃいませ」のHTTPリクエストの設定をしておきます(本文だけ変えて、設定自体は上記とおなじ)。


ここまでで、帰宅・外出を検出してSlackに投げるまでの処理は実装できました。あとはSlackから来た通知を読み上げる機能を実装します。

こちらのトリガーは「イベント→UI→通知」として「所有者であるアプリ」でSlackを選択、タイトル欄にIncoming Webhookで設定した投稿名を追加します。

アクション側の設定は

「タスク→待機」で4秒した後に、「アラート→読み上げ」として、「文字」に「%evtprm3」(%evtprm3は通知の内容を表す変数名)を入力して、あとは適当に読み上げのピッチ・速度などを変えてあげればOK。


という感じで設定すると、家に帰宅した時に「ゆっくりしていってね」と声をかけてくれるようになりました! 読み上げエンジンの関係上、有名な「ゆっくりしていってね」とはちょっと違う声質になっているのが残念といえば残念ですが、まあ疲れて帰ってきた時の和みにはなるかなとw


Googleカレンダーの通知

帰宅時に「ゆっくりしていってね」と言ってもらえると和むは和むのですが、これだけでは流石に実用性がなさすぎるのでw、もうちょっと実用的なものとしてGoogleカレンダーに設定してある予定を10分前に音声でリマインドするようにしましょう。

こちらもやり方はいろいろありますが、今回は上記のIncoming Webhookではなく、Slackのgoogleカレンダーアプリを活用することします。もちろん、手元でコードを書いてGoogleカレンダーの日程をAPI経由で入手してIncoming Webhookに投げるようにしても良いんですが、SlackにはGoogleカレンダーの予定のリマインドを通知する機能があるので、そちらを利用します(単純にちょっと横着しただけですw)。

前の章で紹介した通知読み上げの設定はIncoming Webhookの投稿名を条件にいれているので、Googleカレンダーアプリからの通知には反応しません。というわけで、Googleカレンダー用に別途読み上げのタスクを追加します。

トリガーの側は先ほどと同様に「所有者であるアプリ」に「Slack」を設定したうえで、タイトルに「*Google*」を入力すればOK。これでGoogleカレンダーからの通知をキャッチしてトリガーに設定できます。

読み上げの部分はちょっとトリッキーな操作が必要です。というのは、SlackのGoogleカレンダーアプリの通知内容が「10 minutes until this event:{イベント名}」という形式になっているので、そのまま読み上げるとちょっと都合が悪いです。

なので、アクション側は4秒の待機のあとに「変数→変数の切り出し」で%evtprm3の28文字目以降を切り出して新たな変数(例えば%saymessage)に格納し、読み上げの文章としては「%saymessage の10分前です」みたいな形にする必要が有ります。

まあなにはともあれ、上記のように設定することで予定を読み上げてくれるようになりました! 「読書の10分前です」とか「睡眠の10分前です」とかをリマインドしてくれるので、多少は生活が規則正しくなった気がします。とは言っても、リマインドしてくれることと実際にその時間に行動できることは必ずしも一致しないんですけどねw


まとめ

今回は前回購入したAndroidタブレット「Nexus7」を使って音声通知システムを構築した話を書きました。今回の内容は帰宅時の挨拶と予定のリマインドということで、かなり限られた用途では有りますが、工夫次第ではまだまだ応用の余地は有ります。そのあたりは追い追い紹介できればと思っています。

それでは、また!


この記事が気に入ったらサポートをしてみませんか?