朝起きれない問題に本気で向き合う目覚ましサービスを作った

この記事はTwilio AdventCalendar 2017かつSpeee AdventCalendar 2017の21日目の記事です。

昨日の記事はこちら

朝起きれていますか?

朝早く起きれると、自由な時間が増えて色々ハッピーになります。

朝起きれない問題

早起きが得なことは分かっているのですが、早起きは大体いつも失敗してしまいます。 その原因を考えてみます。

目覚ましアラームは次第に効能が悪くなる

朝起きるためにスマホ等でアラームをセットするわけですが、セットしたアラーム音も毎日聞いてると慣れてきて、次第に聞き流せるようになってしまいます。 そうならないように ものすごく嫌な音 をセットしてみたりするのですが、あまりにも嫌すぎて無意識の間にアラームを止めてしまうことが多々ありました。

逆説的には、 日々新鮮で楽しい出来事 が朝の目覚めには必要なのかもしれません。

「全部自己責任だから」という甘え

早起きはいつも失敗するものの、 出社が間に合わなくなるまで寝てしまうケース はほぼありません。 つまり、 自分以外の存在に対して影響が及ぶ状況下 では起きれるのです。

結局のところ、「早く起きれなかった分には誰も困らない」という甘えが裏にあるのではないでしょうか。

どうすれば朝起きれるのか

問題点の逆説から、以下の二つを抑えれば早起きの成功率が上がりそうです。

  1. 起きる度に新鮮で楽しい出来事が発生すること
  2. 自分以外の存在に対して影響が及ぶ状況下であること

上記を実現する最もシンプルな方法は 人に起こしてもらう ことです。

コミュニケーションを取ることで意識が覚醒する

起こしてくれる人がいるということはつまり、対話が発生します。対話は更新され続けるものであるため、常に新鮮な刺激とストレスの解放を得ることができます。

起こしてくれる誰かがいるという状況が気持ちを動かす

起こしてくれる人がいる手前、流石に無視するわけにはいきません。自分が起きずにいることがその人の損害になってしまいます。

起こす側の問題

上記から、起こしてくれる人の存在が非常に重要だということが分かりました。

しかし、起こす側の人にも解消すべき問題があります。

それは 起こす人が先に起きていないといけない という前提条件です。 すなわち、この条件を満たす上では 起こす人を起こす人 が必要であり、以下この構造は無限に続きます。

f:id:kohtaro24:20171221025628p:plain

この無限階層問題を脱出する上では 互いが互いを起こし合う という仕掛けを実現する必要があります。 f:id:kohtaro24:20171221031021p:plain

遠隔地にいる人を起こさなければならない時、最もよく使われるであろうツールはなんでしょう?

そう、 電話 です。

つまり お互いの電話に自動発信できる仕組み があればいいんです。 f:id:kohtaro24:20171222013832p:plain

お互いの発信によってお互いが目覚め、更に会話することによって意識が覚醒する。あわよくばそのまま二人の予定も立てられる。これは起きれそうです。 f:id:kohtaro24:20171222014717p:plain

作ってみた

  • 目覚ましの予約

目覚ましを利用するために予約を行います。 予約は以下のようなフローで行えます。

  1. 指定の電話番号に発信する
  2. 音声案内に従い、起こして欲しい日時と一緒に起きたい人の電話番号を伝える
  3. 寝る
  • 予約時刻のコール

予約した日時になると2人の電話が着信し、お互いが着信に応答した時点で通話がはじまります。

仕組みについて

この機能の大半はTwilioを用いることで実現しています。 バックエンドのアプリケーションとしてRuby on Rails、スケジューラとしてSidekiqを利用しました。

目覚まし予約の仕組み

Twilioの電話番号に着信が来るとRailsがイベントを受け取り、命令をTwiMLで返しています。 f:id:kohtaro24:20171222023201p:plain

このケースでは、Sayによる音声案内、Gatherによる音声テキスト化をTwiMLから利用しています。

Gatherの結果で得られたテキストから、rails側で正規表現なり駆使して必要なパラメータを抽出し、Sidekiqにスケジュール登録します。

f:id:kohtaro24:20171222023223p:plain

同時発信の仕組み

予約された日時になると、SidekiqがTwilio REST APIに電話番号への発信をリクエストすることで、Twilio経由で対象者への発信が行われます。

f:id:kohtaro24:20171222023750p:plain

Twilioの発信に対して応答があった際、Railsがイベントを受け取り、命令をTwiMLで返します。

f:id:kohtaro24:20171222024200p:plain

このケースでは、Dial, Conferenceによる電話会議の機能を利用しており、発信への応答者を随時Conference Room(会議室)に招待します。

f:id:kohtaro24:20171222024411p:plain

これにより、 2人が着信に応答したタイミングで通話が開始される 仕組みを実現できます。

だいぶざっくりした説明になってしまったのですが、詳細が気になる方はソースコードこちらにあるので御覧ください。

この目覚ましの特徴

① アプリもサイトも不要

予約機能も電話一つで利用できるようにしたので、ぶっちゃけ家電だったりガラケーでも問題なく利用できます。 そしてhtmlもcssjavascriptも書かないで済むので開発者が楽です。

② 予約者以外は朝起きて電話に出るだけでいい

親しい人と一緒のサービスを利用したいとなった場合、多くのSNSなどではアプリを入れる必要があったりアカウントを作ったり友達申請したりと、利用を開始できるまでの障壁がいくつもあります。この目覚ましにおいては、予約者が相手の番号を知ってるだけで利用条件が満たされます。

(全然知らない人の電話番号を登録するようなイタズラもできてしまうので、もし公に運営するならSMS認証挟んだりなどの対策が必要だと思います)

③ 最大250人で一緒に目覚ましできる

Conferenceの最大キャパシティが250人なので、その気になれば250人で同時に目覚ましすることも可能です。

(とても通話なんかできたもんじゃないと思いますが)

いかがでしょうか

この目覚まし、めざましくないですか?

正直、ConferenceやGatherを使ってみたいという気持ちだけが先行して、テーマ自体は完全にネタのつもりだったのですが、中々面白いものが形になったなと思います。

Twilioはまだまだ面白い使い方ができそうなので、引き続き試していこう。

おまけ

某モンスターの鳴き声で音当てゲーム的なものも作ってみました