こんにちは、サイオステクノロジー技術部 武井です。全4回シリーズでお送りしております「多分わかりやすいDurable Functions」シリーズも今回で最後です。
- 多分わかりやすいDurable Functions 〜サーバーレスは次のステージへ〜【入門編】
- 多分わかりやすいDurable Functions 〜サーバーレスは次のステージへ〜【実践編】
- 多分わかりやすいDurable Functions 〜サーバーレスは次のステージへ〜【理論編】
- 今回はこちら → 多分わかりやすいDurable Functions 〜サーバーレスは次のステージへ〜【番外編】
せっかくいろいろ勉強をしたので、最後にDurable Functionsで社会貢献をしてみたいと思います。
政府による働き方改革の推進
労働人口の減少に伴う経済力の低下が懸念されています。少ない労働人工の中でも効率的に日本の経済を回す方法の模索が急務です。以下の3つの視点で働き方が見直されています。
労働の効率化 | 残業して長時間働くのではなく、労働の生産性を上げることを目標とします。 |
労働の多様化 |
ITやクラウドツールを活用し、オフィス以外で仕事ができるようにします。テレワークとも呼ばれています。 |
労働の一般化 |
労働市場に参加できる人を今まで以上に拡大します。高齢者や育児中の女性などが労働しやすい環境を作ります。 |
「働き方改革」により労働形態が多様化、出社時間もより自由になります。日々変わる起床時間に対応した「確実に気持ちよく起きることのできる」ことが必要となります。
そこで、Durable Functionsで目覚まし(二度寝防止機能付き)を作りました。
Durable Functions目覚ましの動き
Durable Functions目覚ましは以下のように動作します。
- 指定した時刻になると、あらかじめ指定した電話番号に対して、10桁のコードをプッシュ入力するようにアナウンスが流れる。
- 指定された10桁の番号をプッシュ入力する。
- 正しい10桁のコードを入力すれば終わり。間違っていれば、一旦電話が切れて、最初に戻り、再び10桁のコードをプッシュ入力するようにアナウンスが流れる。
つまり、音声ガイダンスで流れる10桁のコードを正確にプッシュしない限り延々とアナウンスが流れ続けます。正確に10桁のコードをプッシュ入力できるくらい、頭が働いているならば、きっちり起きることもできるでしょう。
アーキテクチャ
Durable Functions目覚ましで使っている技術は以下のとおりです。
Azure Functions | Azureが提供するサーバーレスアーキテクチャであり、オンデマンドでコードを実行でき、必要に応じてスケーリングするサービスです。 |
Durable Functions |
Azure Functionsのオーケストレーションサービスです。Azure Functionsの実行状態を管理し、ワークフローのような処理を実現します。 |
Twilio |
指定した電話番号にメッセージやSMSを送信したり、ユーザーのプッシュ入力を受け取ってインタラクティブな処理を行うクラウドAPIサービスです。 |
Open JTalk | 入力された日本語テキストに基づいて自由な音声を生成するHMMテキスト音声合成システムです。電話で流す音声メッセージの生成に使っています。 |
処理シーケンス
Durable Functions目覚ましの処理シーケンスをご説明致します。
■ その1:コード入力依頼のメッセージ送信
- Durable Functionsは、指定した時刻になると、クライアント関数経由でメッセージ送信関数(アクティビティ関数gatherCode)を起動します。ここで、イベントを受信するまで、Durable Functionsは待機状態となります。
- メッセージ送信関数(アクティビティ関数gatherCode)は、Twilioに対して、指定した番号にメッセージを流すよう、命令します。このとき、Twilio独自の言語「Twiml」を使います。
- Twilioは指定された番号に対して、コードを入力する旨のメッセージ(おはようございます!!次の指定した10桁の番号を入力してね。8395…)を流します。
■ その2:ユーザーのコード入力
- ユーザーは、メッセージで指定された10桁のコードをスマートフォンなどからプッシュ入力します。
- Twilioは、ユーザーが入力した10桁のコードをクエリパラメータに付与して、入力コードチェック関数(アクティビティ関数checkCode)をHTTPプロトコルにて呼び出します。
■ その3:入力コードのチェック
入力コード送信関数は、ユーザーが入力したコードが、最初に要求したコードと一致しているかをチェックします。そして、その結果を、Durable Functionsにイベントとして送信します。Durable Functionsはイベントを受け取ると、処理を再開します。
■ その4:最終チェック
もしユーザーが入力したコードと、最初に要求したコードが一致してなければ、一旦電話を切り、再度メッセージ送信関数を起動し、ユーザーに電話をかけて、コード入力のメッセージを送信します。ユーザーが正しいコードを入力するまで、延々とこのフローを繰り返します。
音声メッセージの作成
ユーザーに流す音声を作成します。先程もご説明したように、Open JTalkで作成することとします。インストール手順は以下のとおりです。
# wget https://sourceforge.net/projects/hts-engine/files/hts_engine%20API/hts_engine_API-1.10/hts_engine_API-1.10.tar.gz/download -O hts_engine_API-1.10.tar.gz # mkdir /usr/local/hts_engine_API # tar xzvf hts_engine_API-1.10.tar.gz # cd hts_engine_API-1.10 # ./configure --prefix=/usr/local/hts_engine_API # make # make install # wget https://downloads.sourceforge.net/open-jtalk/open_jtalk-1.09.tar.gz # mkdir /usr/local/open_jtalk # tar xvzf open_jtalk-1.09.tar.gz # cd open_jtalk-1.09 # ./configure --prefix=/usr/local/open_jtalk --with-hts-engine-header-path=/usr/local/hts_engine_API/include --with-hts-engine-library-path=/usr/local/hts_engine_API/lib --with-charset=UTF-8 # make # make install # wget https://sourceforge.net/projects/open-jtalk/files/Dictionary/open_jtalk_dic-1.09/open_jtalk_dic_utf_8-1.09.tar.gz # tar xzvf open_jtalk_dic_utf_8-1.09.tar.gz # cp -r open_jtalk_dic_utf_8-1.09 /usr/local/open_jtalk/ # wget https://excellmedia.dl.sourceforge.net/project/mmdagent/MMDAgent_Example/MMDAgent_Example-1.4/MMDAgent_Example-1.4.zip # unzip MMDAgent_Example-1.4.zip # mkdir /usr/local/hts_engine_API/hts_voice # cp -r MMDAgent_Example-1.4/Voice/mei/*htsvoice /usr/local/hts_engine_API/hts_voice/
では、実際に音声を作ってみましょう。
# echo "こんにちは" | /usr/local/open_jtalk/bin/open_jtalk -m /usr/local/hts_engine_API/hts_voice/mei_normal.htsvoice -ow output.wav -x /usr/local/open_jtalk/open_jtalk_dic_utf_8-1.09
上記のコマンドを実行しますと、output.wavが出力されます。今回作らなければいけない音声は以下のとおりです。
- ユーザーが電話を取ったら一番最初に流す音声(コードを入力してねみたいなもの)
- ユーザーが入力したコードが正しい場合に流す音声(コードは正しいよみたいなもの)
- ユーザーが入力したコードが間違っている場合に流す音声(コードが間違っているよもう一回入力してねみたいなもの)
やっぱり、きれいな萌え声で起こしてほしいと思います。いろいろチューニングした結果、以下のコマンドが一番気持ちよく起きることができると思いました。
# echo "こんにちは" | /usr/local/open_jtalk/bin/open_jtalk -a 0.5 -m /usr/local/hts_engine_API/hts_voice/mei_happy.htsvoice -ow output.wav -x /usr/local/open_jtalk/open_jtalk_dic_utf_8-1.09
ソースコード
本システムのソースコードは、以下のGitHubに登録してあります。言語はC#で書いております。
https://github.com/noriyukitakei/durable-moemoe-alarm
ソースコードの解説は以下のとおりです。
まとめ
全4回シリーズでお送りしたDurable Functionsですが、いかがでしたでしょうか?私は、Durable Functionsには限りない可能性を感じております。これからも、どんどん使っていきたいと思います。