TwilioとVoice Agent with Watsonを使って会話ボットを作成する

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# はじめに

本資料は、2018/8/29に開催された「[水曜ワトソンカフェ Vol.12](https://bmxug.connpass.com/event/95186/)」で発表したときの資料となります。
記述されている情報は、2018/8/27現在のものです。

[Voice Agent with Watson](https://console.bluemix.net/catalog/services/voice-agent-with-watson)は、Watsonサービスを電話網と直接接続することで、コールセンターやコンタクトセンターの運用をサポートすることができるサービスです。
Voice Agent with Watsonは、以下のコンポーネントの組み合わせにより実現されます。

- Watson Assistant
- Speech to Text
- Text to Speech

![スクリーンショット 2018-08-27 09.10.18.png](https://qiita-image-store.s3.amazonaws.com/0/86046/fbd68026-eff5-7b32-630a-778a046c3c25.png)

### スペースの準備

Voice Agent with Watsonは、現在米国南部、米国東部でのみ利用可能なため、これらの地域のスペースを持っていない場合は、以下の手順に従って米国南部、もしくは東部のスペースを作成しておきます。

- [IBM Cloudコンソール](https://console.bluemix.net/dashboard/apps/)にログインします。ダッシュボード画面が開きます。
- **管理**メニューから**アカウント**の中の**Cloud Foundryの組織**を選択します。
- スペースを追加したい組織を選択します。
- **スペース**タブで、**スペースの追加**を行います。
![水曜ワトソンカフェ 新規スペース作成.png](https://qiita-image-store.s3.amazonaws.com/0/86046/730f7bd4-8853-664d-c3bd-daea46327c18.png)

- **作成**ボタンを押します。

### Speech to Textリソースの作成

[Speech to Text](https://console.bluemix.net/catalog/services/speech-to-text)は、音声認識エンジンです。2018年8月現在、対応している言語は、英語 (US)、英語 (UK)、日本語、アラビア語 (MSA、ブロードバンド・モデルのみ)、北京語、ポルトガル語 (ブラジル)、スペイン語、フランス語 (ブロードバンド・モデルのみ)、韓国語となります。
1ヶ月100分までの利用が可能なLiteプランに対応しています。

- IBM Cloudダッシュボードから、**リソースの作成**ボタンを押します。
- **検索**ボックスで、「Speech」と入力すると、**Speech To Text**リソースが表示されるので、そちらを選択します。
![スクリーンショット 2018-08-27 09.39.16.png](https://qiita-image-store.s3.amazonaws.com/0/86046/f0f7e073-223d-8cf4-6944-5ca60aabfbb1.png)

- **サービス名**にわかりやすい名前を付けます。
- **デプロイする地域/ロケーションの選択**から、米国南部もしくは米国東部のいずれかを選択します。
- **組織の選択**と、**スペースの選択**は、該当する地域にスペースを持っていれば自動的に選択されます。複数のスペースを持っている場合は、作成したスペースを選択してください。
- **作成**ボタンを押します。

### Text to Speechリソースの作成

[Text to Speech](https://console.bluemix.net/catalog/services/text-to-speech)は、テキストと自然言語を処理し、適切な抑揚を付けて合成した音声出力を生成します。2018年8月現在、対応している言語は、英語 (US)、英語 (UK)、日本語、ポルトガル語 (ブラジル)、スペイン語（カスティリャ語）、スペイン語（北米）、フランス語、イタリア語、ドイツ語となります。なお、日本語については、女性の声のみを提供しています。
1ヶ月10,000文字までの利用が可能なLiteプランに対応しています。

- IBM Cloudダッシュボードから、**リソースの作成**ボタンを押します。
- **検索**ボックスで、「Text to Speech」と入力すると、**Text to Speech**リソースが表示されるので、そちらを選択します。
- **サービス名**にわかりやすい名前を付けます。
- **デプロイする地域/ロケーションの選択**から、Speech to Textで選択した地域を選択します。
- **組織の選択**と、**スペースの選択**は、自動的に選択されます。複数のスペースを持っている場合は、Speech to Textで選択したスペースを選んでください。
- **作成**ボタンを押します。

### Watson Assistantリソースの作成とサンプル会話のインポート

[Watson Assistant](https://console.bluemix.net/catalog/services/watson-assistant-formerly-conversation)は、アプリケーションに自然言語インターフェースを追加してエンドユーザーとのやり取りを自動化します。 ワークスペース内に、インテントやエンティティを作成していくことで、チャットボットや会話ボットのエンジンを作成することができます。また、Watson Assistant サービスは、簡単な Web アプリケーションを使ってトレーニングできます。
1ヶ月10,000件までのAPI呼び出しが可能なLiteプランに対応しています。

今回は、Watson Assistantの詳細については触れませんので、テストに利用するサンプルの会話データはダウンロードしておきます。
[ここ](https://raw.githubusercontent.com/WASdev/sample.voice.gateway/master/conversation/voice-gateway-conversation-ja.json)を右クリックして、リンク先を別名で保存します。ファイルの拡張子は、jsonにしてください。

- IBM Cloudダッシュボードから、**リソースの作成**ボタンを押します。
- **検索**ボックスで、「Assistant」と入力すると、**Watson Assistant**リソースが表示されるので、そちらを選択します。
![スクリーンショット 2018-08-27 10.03.10.png](https://qiita-image-store.s3.amazonaws.com/0/86046/d3c63c0a-b6fc-b0de-b178-b25e9f3711f5.png)

- **サービス名**にわかりやすい名前を付けます。
- **デプロイする地域/ロケーションの選択**から、Speech to Textで選択した地域を選択します。
- **組織の選択**と、**スペースの選択**は、自動的に選択されます。複数のスペースを持っている場合は、Speech to Textで選択したスペースを選んでください。
- **作成**ボタンを押します。

続いて、Watson Assistantをテストするためのサンプル会話データをインポートします。

![スクリーンショット 2018-08-27 10.38.08.png](https://qiita-image-store.s3.amazonaws.com/0/86046/27b62784-7cae-4448-44f7-047ae6b6a68b.png)

- **ツールの起動**ボタンを押します。Watson Assistantツールが起動します。
- **Workspace**タブに移動します。
![水曜ワトソンカフェ- サンプル会話のアップロード.png](https://qiita-image-store.s3.amazonaws.com/0/86046/ecc44149-b048-b91e-065d-fde8b605ae2f.png)

- アップロードアイコン（上の図の赤い囲み部分）を押します。
- **Choose a file**をクリックして、先ほどダウンロードしておいたサンプル会話のjsonファイルを選択します。
![スクリーンショット 2018-08-27 10.44.27.png](https://qiita-image-store.s3.amazonaws.com/0/86046/074cbe97-156a-fb42-a710-1a0984866dc7.png)

- **Import**の選択は「Everything」のまま、**Import**ボタンを押します。

では、読み込んだデータを使って正しく会話ができるかを確認してみましょう。

- 画面右上にある**Try it**ボタンを押します。
- テストウィンドウが開き、初期メッセージが表示されるので、たとえば「どのようなユースケースがありますか？」と応答してみます。
- 以下のように該当する回答が正しく戻ってくれば成功です。

![スクリーンショット 2018-08-27 10.47.39.png](https://qiita-image-store.s3.amazonaws.com/0/86046/daeff85c-fd95-6d68-a817-a2e99267c7a1.png)

### Watson Voice Agentのインストール

さて、ここまでで準備が整いましたので、いよいよWatson Voice Agentをインストールしてみましょう。
Watson Voice Agentは、1ヶ月100分間まで利用できるLiteプランに対応しています。

- IBM Cloudダッシュボードページから、**リソースの作成**ボタンを押します。
- **検索**ボックスで、「Voice Agent」と入力すると、**Voice Agent with Watson**リソースが表示されるので、そちらを選択します。
![スクリーンショット 2018-08-27 10.51.37.png](https://qiita-image-store.s3.amazonaws.com/0/86046/12656874-134e-d7ab-912b-221efda7b49e.png)

- **サービス名**にわかりやすい名前を付けます。
- **デプロイする地域/ロケーションの選択**から、Speech to Textで選択した地域を選択します。
- **作成**ボタンを押します。
- 音声エージェントのエンドポイントが表示されるので、SIPから始まる文字列をメモ帳にコピーしておきます。この文字列はインストールした地域毎に異なります。

![水曜ワトソンカフェ SIPトランクエンドポイント (1).png](https://qiita-image-store.s3.amazonaws.com/0/86046/eefb38a3-d574-d65c-2b92-2a98379f16f6.png)

## Twilio側の準備

SIPエンドポイントが確定したので、ここではTwilioのElastic SIP Trunkingを作成していきます。

Twilioのアカウントをお持ちでない方は、[こちら](https://www.youtube.com/watch?v=rNiaLjnhlB4)の動画を見てアカウントを作成してください。
すでにアカウントをお持ちの方は、[こちら](https://jp.twilio.com/login/kddi-web)からログインをします。

### 電話番号の購入

まずは、Watson Voice Agentで利用する電話番号（今回は050番号）を用意していきます。すでに電話番号をお持ちの方は、この後の作業はスキップして構いません。
なお、050番号の利用料は、108円/月です。

- 管理コンソールの右側に表示されているスライドメニューを開き、**Phone Numbers**を選択します。
- さらにサブメニューから**番号を購入**を選択します。
- **COUNTRY**のプルダウンから「Japan (+81)」を選択して、**検索**ボタンを押します。
- **TYPE**がローカルとなっている番号のいずれかを選択し、**購入**ボタンを押します。
- **この番号を購入しますか？**というダイアログが表示されるので、**この番号を購入する**ボタンを押します。
- 番号が購入できたら、**閉じる**ボタンを押して、ダイアログを閉じます。

購入した電話番号は、後ほど利用しますのでメモ帳に控えておいてください。

### Twilio Elastic SIP Trunkingの作成

続いて、Elastic SIP Trunkingの設定を行います。Elastic SIP Trunkingとは、Twilioが世界中に張り巡らせている通信ネットワークに利用して、世界180カ国以上の国に対して電話の受発信をおこなうためのものです。
今回はTwilioから購入した050番号に対して、Elastic SIP Trunking経由で電話の着信を受けます。このときのTwilioの料金は、1分0.5円となります。

- 管理コンソールの左側のスライドメニューを開き、**Elastic SIP Trunking**を選択します。
- **新しいSIPトランクを作成します。**という赤いボタンを押します。
- **わかりやすい名前**に「Watson Voice Agent」と入力して、**Create**ボタンを押します。
![スクリーンショット 2018-08-27 11.42.03.png](https://qiita-image-store.s3.amazonaws.com/0/86046/7609ed5a-f42f-1880-edb5-5a4875f6ed61.png)

- 作成されたトランクメニューから**オリジネーション**を選択します。
- **Add new Origination URL**ボタンを押します。
- **オリジネーションSIP URI**欄に、先程メモ帳に控えておいたWatson Voice AgentのSIPエンドポイントのURIを記入します。
![水曜ワトソンカフェ Add Origination URI.png](https://qiita-image-store.s3.amazonaws.com/0/86046/98b25c2d-05df-78db-e77d-fd09e3476bcd.png)

- **追加**ボタンを押します。
- 次に、トランクメニューの**電話番号**を選択します。
- **Add an Existing Number**ボタンを押します。
- 先程購入した電話番号の右側にあるチェックを入れて、**Add Selected**ボタンを押します。

- 次に、トランクメニューの**一般**を選択します。
- **Call Transfer（SIP REFFER）**の**CALL TRANSFER**を「有効」にし、さらに**Allow Call Transfers to the PSTN via your Trunk.**のチェックボックスをオンにします。
![スクリーンショット 2018-12-10 12.00.03.png](https://qiita-image-store.s3.amazonaws.com/0/86046/07babd6a-70f8-80a5-5cac-f7abd6be9009.png)

- **保存**ボタンを押して、Twilio側の設定は終了です。

### 音声エージェントの設定

では最後の仕上げに、Watson Voice Agentの設定を行います。
ここでは、すでにTwilioで購入した電話番号が必要になります。

- Voice Agentの管理画面の左にある**管理**メニューを選びます。
- **音声エージェントの作成**ボタンを押します。
- **名前**には、適当な名前を指定します。
- **電話番号**には、先程購入したTwilioの050番号を+81から指定します。
- **Watson Assistant**や、**Speech to Text**、**Text to Speech**の項目については、すでに作成してあるそれぞれのサービスが表示されるはずですので、特に選択する必要はありません。
- すべての項目を確認したら、右上の**音声エージェントの作成**ボタンを押します。

### テストしてみる

以上で設定はすべて完了です。
サンプルの会話データがすでに動くはずですので、先程購入したTwilioの番号に電話をかけて、実際に対話のテストをしてみましょう。

## 補足

会話ボットのやり取りの中で、有人オペレーターにスイッチしたいケースも少なくありません。
その時の設定は、以下の記事を御覧ください。

[Voice Agent with WatsonからTwilio経由でオペレータに架電する](https://qiita.com/mobilebiz/items/f3883e34ae910d9a94ef)