Voice Agent with WatsonからTwilio経由でオペレータに架電する

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

# はじめに

本記事は、以下の後編となります。すでにVoice Agent with Watsonが実装されていることを前提にかかれていますので、予めご了承ください。
[TwilioとVoice Agent with Watsonを使って会話ボットを作成する](https://qiita.com/mobilebiz/items/169bdb6910927d4b8a60)

## Twilio側の実装

Voice Agent with Watson側から発信をする場合は、Elastic SIP Trunkingのターミネーションという機能を利用します。
ここではそちらの設定を行っていきます。

- [管理コンソール](https://jp.twilio.com/login/kddi-web)にログインします。
- **Elastic SIP Trunking**メニューの**認証**、**IPアクセス制御リスト**を選択します。

<img width="1408" alt="スクリーンショット 2018-10-11 10.50.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/185bc14b-277a-9bc8-4e71-0016801d739f.png">

- **新しいIPアクセスコントロールリストを作成する**ボタンを押します。
- プロパティの**わかりやすい名前**欄には、「Watson Voice Agent」と入力します（名前は何でも良いです）。
- **IPアドレス**欄には、米国南部で構築している場合は「169.60.154.134」、米国東部で構築している場合は「169.61.86.179」と入力します。
- その下の名前欄にはそれぞれの地域がわかるような名前を入れておきます。

<img width="600" alt="スクリーンショット 2018-10-11 10.52.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/f7f7d64c-9106-fdf8-ea8e-f40ce4731cd9.png">

- **Create**ボタンを押します。
- 続けて、Elastic SIP Trunkingメニューから**トランク**を選択します。

![VA_EST_一覧 (1).png](https://qiita-image-store.s3.amazonaws.com/0/86046/ecdf4bae-7f13-5690-8c02-6eb2a2eb5334.png)

- すでに作成済みのトランクをクリックします。
- トランクメニューから**ターミネーション**をクリックします。
- **TERMINATION SIP URI**欄に、「watson-voiceagent-XXXXXXXX」（XXXXXXXの部分は他の人と被らないような文字列）と入力します。Availableと表示されればOKです。この文字列は後ほど使うので、忘れないようにしてください。
- **IP ACCERSS CONTROL LISTS**欄をクリックすると、先ほど作成したWatson Voice AgentというIPアドレス制御リストが表示されるので、そちらを選択します。

![VA_TerminationURI.png](https://qiita-image-store.s3.amazonaws.com/0/86046/f04d4b52-c271-e11f-3ae6-64d239a38fef.png)

- **SAVE**ボタンを押して、設定を保存します。

以上でTwilio側の設定は一旦終了です。

## Watson側の設定

Watson側では、以下の設定が必要になります。

- Watson Assistantで、転送をするためのインテント（発話条件）を追加します。
- 同じくAssistantのダイアログで、作成したインテントに関するノードを追加します。

では、早速始めましょう。

- IBMクラウドにログインし、ダッシュボードからWatson Assistantを選択します。

![VA_Dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/86046/364a601b-693f-e198-e9a2-3a7b0fff93d3.png)

- **ツールの起動**ボタンを押します。

![VA_Assistant.png](https://qiita-image-store.s3.amazonaws.com/0/86046/d050f52b-5ec5-b3cd-e375-25e053a8ddd6.png)

- **Workspaces**タブに移動し、今回利用しているWorkspaceを選択します。
- **Intents**タブにいることを確認し、**Add intent**ボタンを押します。
- **Intent name**欄に、「#SwitchToOperator」と入力し、**Description**欄には、「オペレータに転送」と入力します。
- **Create intent**ボタンを押します。
- **Add user examples**欄に、「オペレーターをお願いします」と入力して、**Add example**ボタンを押します。
- 同様にサンプルとして「オペレーター」「オペレーターにつないで」「オペレーターと話したいです」などを登録していきます。

<img width="1390" alt="スクリーンショット 2018-10-11 14.36.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/84ef6bf2-34c1-362d-a384-76a06eff919a.png">

- 画面上部の左矢印を押してから、今度は**Dialog**タブに移動します。
- **Add node**ボタンを押します。

![VA_Assistant_Dialog.png](https://qiita-image-store.s3.amazonaws.com/0/86046/3a7e2ff8-3f0f-1f0b-bb8a-5d090aedbc3e.png)

- フローの名前は、「SwitchToOperator」にします。
- **If bot recognizes:**欄には、先ほど作成したインテント「#SwitchToOperator」と入力します。
- さらに、**Then respond with:**の右側にあるメニューボタンを押して**Open JSON editor**を選択します。

<img width="805" alt="スクリーンショット 2018-10-11 15.06.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/c327f5f8-4d0d-a31a-59fe-d947009a42e9.png">

- JSONエディタが開いたら。すでに記述されているJSONをすべて削除し、以下の内容を上書きます。

```json
{
  "output": {
    "text": {
      "values": [
        "オペレータに接続しています。このままお待ちください。"
      ],
      "selection_policy": "sequential"
    },
    "vgwAction": {
      "command": "vgwActTransfer",
      "parameters": {
        "transferTarget": "sip:+819012345678\\@watson-voiceagent-XXXXXXX.pstn.jp1.twilio.com"
      }
    }
  }
}
```

- 12行目を以下のように修正します。
- *sip:+819012345678*の部分を、どなたか別の方の携帯電話番号に変更します。このとき、先頭の0を+81に変換してください。
- *@watson-voiceagent-XXXXXXX.pstn.jp1.twilio.com*の*XXXXXXX*の部分を先程ターミネーションの設定時に指定したものに変更します。

以上で設定は完了です。

## テスト

Voice Agent with Watsonに電話をして、会話の途中で「オペレーターにつないで」と発話すると、「オペレータに接続しています。このままお待ち下さい。」とガイダンスが流れて、指定した携帯電話が鳴ります。

## 補足

今回の設定ではオペレーターが携帯電話になっているので、発信者番号が表示されません。これは、日本国内においてPSTN経由での発信では、Twilioの番号を通知しなくてはならないためです。
Twilio番号を通知させるためには、JSON内で新しい050番号宛に発信させるようにし、その番号からオペレーターに転送させるようにします。