Twilio と Watson Assistant をつないで音声ボットを ノーコード で作成してみる！

<img src="https://i.ibb.co/2nmDLbv/2022-12-25-16-24-57.png" alt="2022-12-25-16-24-57" border="0">

Watson Assistant は、自然言語を理解する AI チャットボットが作成できるプラットフォームです。
単なる FAQ の受け答えだけでなく、ユーザーからの質問に対して更問いを行うスロット・フィリング機能を持っています。
この便利なスロット・フィリング機能をチャット・ボットだけではなく、電話での受付業務にも適用できれば業務の効率化に貢献できそうなのですが、Watson Assistant は電話を直接受けることができません。

そこで、電話を直接受けることができる **Twilio** と **Watson Assistant** を連携させることで音声ボットを作成し、電話の受付業務の効率化にチャレンジしてみたいと思います。幸いにも Watson Assistant は標準で電話統合機能という電話プロバイダーとの連携機能を持っており、**Twilio** をサポートしています。

この組み合わせなら音声ボットの構築ができそうなので、実際にノーコードで実現できるのかどうか、具体的にみていきたいと思います。

# 構築ステップ

3 つのステップで構築作業を進めます。

1. Twilio にて、電話番号の払い出しと SIP Trunk を作成する
1. Watson Assistant にて、電話統合機能を構成して Twilio と連携する
1. Watson Assistant にて、電話での会話を制御する対話フローを作成する
 
それでは順番に見ていきます。

# 1. Twilio にて、電話番号の払い出しと SIP Trunk を作成する

まず最初に、Twilio へのサインアップを行います。
方法は Advent Calendar の注意事項にも記載がある [Twilioアカウント（無料）の作成方法](https://www.twilio.com/blog/how-to-create-twilio-account-jp)を参照して実施してください。

ポイントは 2 点あります。
* 払い出された電話番号をメモしておく
* Watson Assistant 側の SIP アドレスを Elastic SIP Trunks で構成する

になります。

### 払い出された電話番号をメモしておく
電話番号の確認方法を念の為、記載しておきますね。
[Active Numbers](https://console.twilio.com/us1/develop/phone-numbers/manage/incoming)をクリックしてください。
<img src="https://i.ibb.co/DrpjCjd/2022-12-25-19-46-41.png" alt="2022-12-25-19-46-41" border="0">

### Watson Assistant 側の SIP アドレスを Elastic SIP Trunks で構成する
ここの手順は、***2. Watson Assistant にて、電話統合機能を構成して Twilio と接続する**のところで実施します。

# 2. Watson Assistant にて、電話統合機能を構成して Twilio と連携する

### Watson Assistant インスタンスの作成 
Watson Assistant インスタンスは IBM Cloud にて作成する必要があります。
IBM Cloud アカウントの作成と、Watson Assistant インスタンスの作成手順は、[こちら](https://qiita.com/yanagih/items/b02db00d06de397bec64)に詳しく記載しておりますので、お時間がありましたらご参照をお願いします。

https://qiita.com/yanagih/items/b02db00d06de397bec64

### 電話統合機能の構成

Watson Assistant の **HOME 画面**から、**Integrations** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/a7b29b68-ecd5-2b30-aaa5-b7dba4ae7030.png)
Phone の **Add** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/3b68a234-b3ea-67fa-7634-8917de502925.png)
続けて **Add** をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/9d8a9bfa-2409-83b0-7c63-6337c71a7ded.png)
Twilioの構成は、上から 3 つ目です。
<img src="https://i.ibb.co/HrCX3XR/2022-12-25-18-21-37.png" alt="2022-12-25-18-21-37" border="0">
Watson Assitant 側の SIP アドレスが表示されるので、コピーしておいてください。
<img src="https://i.ibb.co/YbvjqB7/2022-12-25-18-26-32.png" alt="2022-12-25-18-26-32" border="0">

この SIP アドレスを Twilio 側に設定してあげます。

(ここからは Twilio 側での作業です)
上部の検索バーに **sip trunk** と入力すると **Elastic SIP Trunks** と表示されますので、それをクリックします。
<img src="https://i.ibb.co/MN2391V/2022-12-25-18-29-03.png" alt="2022-12-25-18-29-03" border="0">

**Create new SIP Trunk** をクリックし、SIP Trunk を作成します。トランク名は任意です。
<img src="https://i.ibb.co/CpLfxxF/2022-12-25-18-43-55.png" alt="2022-12-25-18-43-55" border="0">
**Origination** をクリックし、Origination URIs をセットします。
<img src="https://i.ibb.co/Wx70kCX/2022-12-25-18-54-03.png" alt="2022-12-25-18-54-03" border="0">
Watson Assistant 側の SIP アドレスをペーストします。
<img src="https://i.ibb.co/FWbkXWs/2022-12-25-18-55-53.png" alt="2022-12-25-18-55-53" border="0">
**Numbers** をクリックし、Twilio で払い出された電話番号をアサインします。
<img src="https://i.ibb.co/YLbJNXw/2022-12-25-18-57-09.png" alt="2022-12-25-18-57-09" border="0">
<img src="https://i.ibb.co/0nVv7dk/2022-12-25-18-58-54.png" alt="2022-12-25-18-58-54" border="0">
このような画面が表示されれば成功です。
<img src="https://i.ibb.co/mC8vzHY/2022-12-25-19-00-01.png" alt="2022-12-25-19-00-01" border="0">

(ここから Watson Assistant 側に戻ります)
<img src="https://i.ibb.co/ynrPQSV/2022-12-25-19-01-34.png" alt="2022-12-25-19-01-34" border="0">
Twilio で払い出された電話番号を入力します。
<img src="https://i.ibb.co/xYXm2d9/2022-12-25-19-03-06.png" alt="2022-12-25-19-03-06" border="0">
日本語モデルが選ばれていることを確認します。
<img src="https://i.ibb.co/Yb7m1Cy/2022-12-25-19-05-00.png" alt="2022-12-25-19-05-00" border="0">
日本語モデルが選ばれていることを確認します。
<img src="https://i.ibb.co/CW23fGL/2022-12-25-19-06-32.png" alt="2022-12-25-19-06-32" border="0">
Twilio で払い出された電話番号が表示されていることを確認します。
<img src="https://i.ibb.co/DK8KRwX/2022-12-25-19-07-49.png" alt="2022-12-25-19-07-49" border="0">

以上です。

# 3. Watson Assistant にて、電話での会話を制御する対話フローを作成する

対話フローの作成手順は、[直感的に操作できる Actions で対話フローを作成してみる](https://qiita.com/yanagih/items/f98cff2b5b9ce3208fc4)で詳細に解説していますので、時間がありましたらご参照願います。

ここでは、Watson Assistant で作成した対話フローをご紹介します。
『ピザの注文』と『注文のキャンセル』、『割引条件』について答えられるように構成してあります。
<img src="https://i.ibb.co/qkh64jg/2022-12-25-19-25-25.png" alt="2022-12-25-19-25-25" border="0">

:::note info
作成した対話フローをエクスポートし、[Github](https://github.com/Watson-bx-04/twilio-dialogflow/tree/main)にアップロードしましたので、必要に応じてダウンロードください。
:::

# 試してみる

それでは早速試してみます。
青枠が **Watson からの応答**です。
オレンジ枠が **私が話した内容**です。
私の発話が正しく認識されていることがわかります。

(Watson Assistant の Analytics 画面の**会話内容の表示機能**からの抜粋です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/474a5995-6373-79d7-3fcb-8f9a06c6e178.png)
この図だけではわからないのですが、選択肢は **「イチ、マルゲリータ. ニ、シーフード. サン、ペパロニ」** というように特別に手を加えなくても選択肢を音声用に自動変換してくれています。

:::note info
選択肢をプッシュボタンで選ぶ(『シーフード』の場合は 2 をプッシュする)ことも可能でした。
Twilio と Watson Assistant の組み合わせの便利な面が見れました。
:::

:::note info
注文が終わった際、Watson Assistant 側から電話を切る命令 (end_session) を発行してみたところ、ちゃんと動作し電話を切ることができました。これも嬉しいテスト結果でした。
<img src="https://i.ibb.co/31VJLB3/2022-12-25-19-57-03.png" alt="2022-12-25-19-57-03" border="0">
:::
# いかがでしたでしょうか

一問一答のような単純な FAQ 音声ボットではなく、**更問いをしながらピザの注文を受け付ける音声ボット**を**ノーコード**で作ることができました :relaxed:
Twilio と Watson Assistant がタッグを組むことで、**音声での受付業務をボット化する可能性**が見えてきました。

# 参考情報

#### Twilioアカウントの作成方法
https://www.twilio.com/blog/how-to-create-twilio-account-jp

#### 電話および Twilio Flex との統合
https://cloud.ibm.com/docs/assistant?topic=assistant-deploy-phone-flex&locale=ja

#### その他
https://qiita.com/yanagih/items/b02db00d06de397bec64

https://qiita.com/yanagih/items/f98cff2b5b9ce3208fc4

https://github.com/Watson-bx-04/twilio-dialogflow/