今回作るプログラムは「しゃべる」アラームです。指定時間まで、あと何分なのかを一定時間ごとに通知します。Webブラウザの音声合成APIを使うことで、うっかり遅刻を防ぎましょう。

  • おしゃべりタイマーでうっかり遅刻を防止しよう

    おしゃべりタイマーでうっかり遅刻を防止しよう

テレワークで集中しすぎて遅刻激増?!

皆さんは趣味に集中しすぎて遅刻したことないですか。特に昨今テレワークで自宅作業が増えています。作業に集中しすぎて寝るのが遅くなったり、寝坊して会議の時間など約束の時間を忘れてしまうと大変です。

筆者も一度作業を始めると集中しすぎて時間をうっかり忘れてしまう事が多いです。そこで、最近では作業を始める前に、こまめにアラームをセットするよう気をつけます。それでも、プログラミングが楽しすぎて食事の時間も忘れてしまうこともしばしばです。

そこで、今回作るプログラムが役立ちます。予定の時間まで、「あと1時間です」「あと30分です」「あと15分です」・・・と定期的に予定時間までのカウントダウンをしてくれます。

Webブラウザの音声合成APIを使わないのはもったいない

さて、昨今、PCで作業する場合、大抵はWebブラウザを開いているのではないでしょうか。昨今のWebブラウザには、任意の文章を読み上げるという音声合成APIが備わっています。そのため、この機能とタイマーの機能を組み合わせれば、自分の好きな「おしゃべりアラーム」を作ることができます。ちなみに、以前、本連載37回目ではこの機能を使って「時報アプリ」を作ったこともあります。今回は、この時報を改良してアラームを作ってみましょう。

そこで、簡単な復習として、10秒ごとに現在時刻をしゃべる時計を作ってみましょう。以下のプログラムを「なでしこ簡易エディタ」に貼り付けて実行してみましょう。

●時刻報告とは
  今を表示。
  今を話す。
  「時刻報告」を10秒後。
ここまで。

時刻報告。

プログラムを実行すると10秒ごとに現在時刻が音声合成APIにより発話されます。

  • 10秒ごとに現在時刻が読み上げされる

    10秒ごとに現在時刻が読み上げされる

このように『「***」を話す』と書くだけで、任意の文章を読み上げてくれます。この文章に関数「今」を指定することで、現在時刻を発話します。

また、時計などの繰り返しが生じるプログラムのポイントですが、関数「時刻報告」の中で10秒後に再び「時刻報告」を実行するように指定している部分です。これにより1度「時刻報告」を呼び出したら後は、10秒ごとに繰り返し「時刻報告」が実行されるようになっています。

ところでどんなブラウザに対応しているの?

もし、文字だけが表示されて、何も聞こえない場合には、ブラウザを再起動するなどして再度試してみてください。それでも聞こえなかったり、エラーが表示される場合には、こちらのCan I Useのページでご利用の環境が、Speech Synthesis APIに対応しているか確認してみると良いでしょう。

  • 現在Speech Synthesis APIは主要なブラウザに対応している

    現在Speech Synthesis APIは主要なブラウザに対応している

とは言え、主要なWebブラウザの最新版を利用している場合には利用可能です。スマートフォンでも利用できます。具体的には、Edgeではバージョン14以降、Firefoxでは49以降、Chromeでは33以降(AndroidのChromeは88以降)、Safriは7以降(iOS含む)、Opera27以降で利用可能です。既にSpeech Synthesis APIはかなり身近な存在と言えます。

アラームを作ってみよう

それでは、本題のアラームを作ってみましょう。以下のプログラムを簡易エディタに書き込んでみましょう。

# 予定時刻を入力 --- (*1)
「予定時刻を『HH:MM:SS』の書式で入力してください」と尋ねる。
予定時刻はそれ。

# UIを作成 --- (*2)
「🕐予定👉{予定時刻}」のラベル作成。改行作成。
「🕐現在👉--:--」のラベル作成して、時刻ラベルに代入。
DOM親要素に{"余白":"2em", "文字サイズ":"2em"}をDOMスタイル一括設定。

●時刻確認とは # --- (*3)
  今から予定時刻までの秒差を残秒に代入。
  「🕐現在👉{今} (残り:{残秒}秒)」を時刻ラベルにテキスト設定。
  # 予定時刻までのカウントダウンを行うか順に確認 --- (*4)
  事柄=「」
  もし、残秒=(60*30)ならば、事柄=「あと30分で予定です」
  もし、残秒=(60*10)ならば、事柄=「あと10分で予定です」
  もし、残秒=(60*5)ならば、事柄=「あと5分で予定です」
  もし、残秒=(60*3)ならば、事柄=「あと3分で予定です」
  もし、残秒=(60*1)ならば、事柄=「あと1分で予定です」
  もし、残秒=(30)ならば、事柄=「あと30秒で予定です」
  もし、残秒=(10)ならば、事柄=「あと10秒で予定です」
  もし、残秒=(0)ならば、事柄=「予定時間です!」
  もし、事柄≠空ならば、事柄を話す。# --- (*5)
  「時刻確認」を1秒後。
ここまで。
時刻確認。

プログラムを実行すると、最初に質問ダイアログが開き、予定時刻を聞かれます。適当な時刻を半角数字で「10:20:30」のように「時:分:秒」の書式で入力してください。

  • 予定時刻を入力しよう

    予定時刻を入力しよう

すると、タイマーが始まります。画面には残り秒数を表示します。そして、残り30分、10分、5分、3分、1分、30秒、10秒のタイミングで、残り時間を声で通知します。

  • タイマーが始まったところ

    タイマーが始まったところ

プログラムを確認してみましょう。プログラムの(*1)の部分では「尋ねる」命令を使ってユーザーに予定時刻を尋ねます。そして、(*2)の部分では画面に表示するUIを作成します。ここでは「ラベル作成」命令を使って二つのラベルを画面に作成します。

(*3)の部分では時刻確認を行う関数を定義します。この関数では「秒差」命令を利用して、予定時刻と現在時刻の秒差を調べます。そして、(*4)の部分で秒差が該当する秒数であれば、音声で通知を行うという処理となっています。

まとめ

以上、今回はしゃべるアラームのプログラムを作ってみました。今回のように、任意の文章を読み上げることができる命令「話す」はとても手軽で強力です。アイデア次第でいろいろな用途に利用できると思います。活用してみてください。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。