ブログ

Twilioを使って体調報告ダイヤルを作ってみた

KDDIウェブコミュニケーションズ 技術本部の金城です!

コロナ禍で、出社前の検温や体調報告を義務化する企業が増えてきています。 そこで、TeamsやSlackなどの手軽に上司に連絡できるチャットアプリを利用していない企業に向けた、出社前の体調報告ができるシステムをTwilio事業部の研修で作ってみました。

今回のブログでは、TwilioのStudio・FunctionとFirebaseのFirestoreを使った体調報告IVRについてご紹介します!

使用したツール

Twilio Studio

今回のシステムでは、電話の自動応答にTwilioのStudioを使います。

Studioは自動応答システムを構築するためのTwilioの機能です。ドラッグ&ドロップで必要なパーツを組み立てていくだけでシステムフローが完成するので、プログラミング知識がない人でも簡単に自動応答システムを構築することが可能です。

Twilio Functions

Twilio Functionsは、Twilio内にサーバレスでコードを構築および実行することができる機能です。

今回のシステムでは、発信者が入力した体温や体調に応じて、ガイダンスの最後にその日の出勤指示メッセージを流すようにしています。このとき、入力に応じたメッセージを出力するためにFunctionsを使います。Studio側から作成したFunctionsのコードを呼び出すことにより、発信者の状態に応じた出勤指示メッセージをシステムフローに組み込むことができます。

Firebase Cloud Firestore

FirebaseはmBaaS(mobile Backend as a servise)の1つで、Googleが提供しているバックエンドの管理をする必要がないクラウドサービスです。

Firebaseを使うことで、開発者はアプリケーションの開発に専念でき、バックエンドで動くサービスの作成・管理の必要がありません。今回のシステムでは、FirebaseのCloud Firestoreという機能を利用して、Twilioで構築したIVRに対する応答結果をリアルタイムでデータベースに保存します。

体調報告IVR構築手順

今回のブログでは、StudioとFunctionsを使ったIVRの実装についてご紹介します。 Firebaseの利用については、次回のブログでご紹介します。

新規フローの作成

これから実際に発信者が電話をかけたときの自動応答のフローを構築していきます。

Twilioにログインした後、Twilioのコンソール から、赤い四角で囲ったボタンをクリックします。

AllProduct & Services

RUNTIMEの中にある「Studio」をクリックします。

All Product & Services-Studio

新しいStudioのフローを作成します。

Add Flow

フローの名前を決めてNextをクリックします。

「Start from scratch.」を選択してNextをクリックします。

新規フローの作成画面が表示されます。

体調報告IVRのフロー構成

今回作成する体調報告IVRの流れは図の通りです。

今回使用するWidgetは以下4つです。

  • Trigger

フローの開始となるWidgetです。今回は電話の着信がフローの開始のきっかけなので、「Incoming Call」を選択します。

  • Gather Input On Call

音声を再生し、それに対するユーザの返答を取得・保持します。今回は、社員番号・体温・身体状態をユーザがキーパッドで入力するので、「User Pressed Keys」を使用します。また、キーパッドが未入力だったときは、「No Input」を使用します。

  • Split Based On…

フローを分岐させるWidgetです。今回は、キーパッドでユーザが入力した内容が期待値のとき、不正な値のときの2パターンに分岐させます。

  • Run Function

StudioからFunctionsのコードを呼び出したいときに使用するWidgetです。今回のシステムではユーザの入力に対応した出勤指示メッセージを流したいので、「Gather Input On Call」で保持したユーザの入力を「Run Function」に渡し、「Run Function」で出勤指示メッセージを流すFunctionを呼び出します。

新規Functionsの作成

これから、「Run Function」で呼び出すFunctionsを作成していきます。

Twilioのコンソール から、赤い四角で囲ったボタンをクリックします。

AllProduct & Services

RUNTIMEの中にある「Functions」をクリックします。

新しいFunctionsを作成します。

「Hello Voice」を選択し、「Create」をクリックする。

Functionsの作成画面が表示されます。

Functionsの実装

ユーザの入力に対応した出勤指示メッセージを流すためのコードは以下の通りです。

event.Tmp1やevent.Status1には、Studioで取得したユーザのキーパッド入力の値が格納されます。 体温が37.5度以上で咳と鼻水の症状がある場合、37.5度以上の場合、37.5度以下で症状がある場合、37.5度以下で症状がない場合で出勤指示メッセージが変化するようにします。

exports.handler = function(context, event, callback) { 

    let twiml = new Twilio.twiml.VoiceResponse(); 

    let temperatureInput = event.Tmp1 / 10; 

    let temperatureNoInput = event.Tmp2 / 10; 

    let temperatureChanged = event.Tmp3 / 10; 

    let statusInput = event.Status1; 

    let statusNoInput = event.Status2; 

    let statusChanged = event.Status3; 

     

    if (temperatureInput >= 37.5 || temperatureNoInput >= 37.5 ||  temperatureChanged >= 37.5) { 

        if (statusInput == 2 || statusNoInput == 2 || statusChanged == 2){ 

                twiml.say({ 

                    language: 'ja-JP' 

        },    "体調報告を受け付けました。新型コロナウイルスに感染している可能性があります。" 

            + "体温が37.5度以上なので、本日は仕事を休んで外出を控えてください。" 

            + "周囲の人に病気を移す可能性があるため、咳エチケットを心がけてください。" 

            + "症状が4日以上続く場合は、保健じょや病院に必ずご相談ください。"); 

        }else { 

                twiml.say({ 

                    language: 'ja-JP' 

        },    "体調報告を受け付けました。新型コロナウイルスに感染している可能性があります。" 

            + "体温が37.5度以上なので、本日は仕事を休んで外出を控えてください。" 

            + "症状が4日以上続く場合は、保健じょや病院に必ずご相談ください。"); 

   }else { 

        if (statusInput == 0 || statusNoInput == 0 || statusChanged == 0){ 

                twiml.say({ 

            language: 'ja-JP' 

        }, "体調報告を受け付けました。平常通り仕事を開始してください。"); 

        }else { 

                twiml.say({ 

                    language: 'ja-JP' 

        },    "体調報告を受け付けました。" 

            + "現在の体温は37.5度以下ですが、今後発熱する可能性があります。" 

            + "この電話の終了後、個別に直属の上司にご相談ください。" 

            + "また、現在の症状が4日以上続く場合は、保健所や病院に必ずご相談ください。"); 

        }  

    } 

    callback(null, twiml); 

}; 

StudioとTwilioで取得した電話番号の紐付け

StudioとFunctionsの作成が完了したら、Studioと電話番号の紐付けを行います。

Twilioのコンソール から、赤い四角で囲ったボタンをクリックします。

AllProduct & Services

SUPER NETWORKの中にある「Phone Numbers」をクリックします。

番号を購入します。

「アクティブな電話番号」をクリックし、買った電話番号を選択します。 「A CALL COMES IN」の中を「Studio Flow」と自分が作成したStudioのフロー名に設定します。

これでStudioで作成した体調報告IVRが指定した電話番号に紐づきました。 実際に指定した電話番号に電話をかけて、Studioで作成した音声が流れるか確認してみましょう。

まとめ

今回のブログでは、TwilioのStudioとFunctionsを使った体調報告IVRを作ってみました。次回は、ユーザがキーパッドで入力した情報をクラウド型DB(Firestore)に保存する方法をご紹介します!Twilioの魅力はなんといっても手軽に自分のアイデアを形にできるところだと思います。
興味を持った方はぜひ試してみてください!

金城海姫
金城海姫

株式会社KDDIウェブコミュニケーションズ 技術本部 第二開発部 新入社員(2020年8月時点) 沖縄高専卒の新米エンジニア 酒と旅行とねこが好き

お問い合わせはこちら

Share!!

  • お役立ち情報
  • イベント情報
  • 相談会申込
  • 導入事例