twilioでIVRはどのように進化するか

この記事は [ぐるなび Advent Calendar 2018](https://qiita.com/advent-calendar/2018/gnavi-developers) 7日目の記事です。
@colorful_cookie が担当します。

今回は**twilio**というサービスを使って、IVR（自動応答電話）にどれだけ介入できるかチャレンジしてみました。また、それによってIVRというものがどのように発展していくかをお話ししたいと思います。

# twilioとは
![Twilio Mark - Blue.png](https://qiita-image-store.s3.amazonaws.com/0/311068/6ea0b214-87ab-a9df-82a1-e1c63d8760ee.png)
https://www.twilio.com/
先達の方々が既に各所わかりやすい説明をしてくださっていますので、料金等については割愛させていただきます。
twilioは、簡単に言いますと、音声通話・SMS・チャット・ビデオなどの様々なコミュニケーション手段を提供するクラウドAPIサービスです。
電話番号を購入し、その番号に対しWebhookを用い、TwiML（後述）を読み込ませることで様々な介入を行えます。

IVRと言えば荷物の再配達サービスなどでお馴染みですが、これを気軽に構築できるようになります。

# TwiMLとは
https://jp.twilio.com/docs/voice/twiml
一言でいうと**XML**です。さまざまな命令をXML形式で記載し、twilioに読み込ませることで、様々な通話の制御が行えます。

```xml:hello_world
<?xml version="1.0" encoding="UTF-8"?>
<Response>
     <Say>Hello World</Say>
</Response>
```
このTwiMLをtwilioに読み込ませると、発話開始時に自動音声で「Hello world」と喋るようになります。


# やれること（の一部）
twilioは、電話に関連するほぼ全ての事柄に対して介入できます。また、Webhookを通じてサーバと連携することで、サービスの内容は更に拡充されます。よりユーザに合った会話を提供したり、必要な情報を記録してサーバへ送信することも出来るようになります。
以下では、その代表的な機能を抜粋して紹介いたします。

## 入電があれば自動応答音声を流す
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/311068/9a236336-4a7b-a115-bd86-e526e362f6ff.png)
twilioから購入した電話番号に入電があった場合、あらかじめ設定しておいた音声を流すことができます。TwiML内の`<Pause>`タグでインターバルを秒単位で指定できます。

```xml:example_01
<Response>
    <Play>../voice/01.mp3</Play>
    <Pause length="1"/>
    <Play>../voice/02.mp3</Play>
    <Pause length="5"/>
</Response>
```

## 入電時にプッシュ通知を送る
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/311068/585d89bd-5fcc-b2b0-77fe-e15bc0d6e3e0.png)
twilioから購入した電話番号に入電があった場合、リダイレクトや再ダイヤルを通じ各デバイスのサーバーを経由してプッシュ通知を送信できます。なんらか失敗した場合は自動的に次行の処理が行われます。

```xml:example_02
<Response>
    <Dial action="../api/push_notification" method="POST">415-123-4567</Dial>
    <Say>I am not reachable</Say>
</Response>
```

## 話者の入力に対して応答を切り替える
![図3.png](https://qiita-image-store.s3.amazonaws.com/0/311068/4f869f40-cfd1-998d-e1e8-c704b78d39e0.png)
話者の入力をサーバーに問い合わせ、問い合わせた先のプログラムからその後の処理や転送先を切り替えることができます。入力の終了をtwilioに通知するキーも別途指定することができます。

```xml:example_03
<Response>
    <Gather action="../api/call_action" finishOnKey="" method="POST">
        <Say>Please enter any key</Say>
    </Gather>
    <Say>We didn't receive any input</Say>
</Response>
```

## 発信者の電話番号を取得してSMSを送信する
![図4.png](https://qiita-image-store.s3.amazonaws.com/0/311068/9a133d7e-f11c-3853-1c35-6dc37a52ad9f.png)
あらかじめ発信者の電話番号を取得しておくことで、twilio SDKからSMSを送信することができます。
SMSの到達率は購入した回線の国籍によって変わり、日本国外の番号ですと到達率が90%程度に低下します。日本国内であればほぼ欠落しませんが、１通ごとの利用料が高いというデメリットがあります。

## 話中に入力された内容をサーバに送信する
![図5.png](https://qiita-image-store.s3.amazonaws.com/0/311068/0e465d82-c772-2812-8d14-fd22690902d4.png)
話中にユーザの入力があればそれをサーバに送信することができます。送信する内容はtwilio SDK内でカスタマイズでき、他に必要な情報を付帯して送ることができます。

## 通話ステータスを取得する
![図6.png](https://qiita-image-store.s3.amazonaws.com/0/311068/e0883731-f404-a1f2-f17a-f3dc90dd14ab.png)
とあるユーザは話中、とあるユーザは通話終了...など、それぞれの通話がどの状況なのかを把握することができます。

## ほかにも
+ ビデオ配信
+ LINEなどへの連携機能
+ FAX送信
+ SIPインフラ**そのもの**をインターネット経由で作成可能

など、外部のサービスとつなげることで、電話でやれることがグッと広がります。

# 最後に
これだけのポテンシャルを持っているtwilioですが、日本でのコミュニティはまだまだ小規模なものになっています。普段当たり前に使っている電話というツールに、こういった形で自由度高く切り込めるサービスはあまり見当たらないのではと思います。利用できる場は多く、参入障壁も比較的低いため、どんどん広まって欲しいですね。