NOBY APIを使って、Twilioで音声ボットを作る

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

# はじめに

みなさん、こんにちは。
KDDIウェブコミュニケーションズのTwilio事業部エバンジェリストの高橋です。

突然ですがみなさん、Noby APIって知っていますか？
マッシュアップアワードでも有名人な、青島さんが個人で運営されている会話エンジンで、非常に簡単に自然対話ができるサービスです。しかも無料！
詳しくはこちらの記事を参照してください。
[【Noby API】ノビィ取り扱い説明書【CotoGoto】](https://qiita.com/blue_islands/items/0d5a9ea5f4911e959924)

Noby APIを使えば、簡単にボットを作ることができるので、Twilioと連携させて音声ボットを作ってみたいと思います。

# 作業手順

- Noby APIの認証キーを取得する。
- Twilio Studioを使ってコールフローを作成する。
- 電話番号に対して、作成したStudioフローを割り当てる。

# ハンズオン

## Noby APIの認証キーを取得する。

認証キーの取得方法は、こちらの記事を御覧ください。
[【Noby API】ノビィ取り扱い説明書　使い方編【CotoGoto】](https://qiita.com/blue_islands/items/20c61c1737873117dcf9)
認証キーは文字列になりますので、忘れずにメモしておきましょう。

## Twilio Studioを使ってコールフローを作成する。

Twilio Studioは、コールフローをドラッグアンドドロップで作ることができるツールです。
今回はすでに作成ずみのコールフローをひな形にして、必要なところを修正していきましょう。

Twilioのアカウントを持っていない方は、[こちらの記事](https://qiita.com/mobilebiz/items/932eb21ff6ed36f524d8)を参考にトライアルアカウントを作成してください。

- [こちらのページ](https://jp.twilio.com/login/kddi-web/)からログインを行い、Twilio管理コンソールに入ります。
- 電話番号を購入していない方は、050番号を一つ購入してください。すでに番号を持っている方は、そちらを使っても大丈夫です。
- 管理コンソールの左側にあるボタンアイコン（ドットが3つかかれたアイコン）を押して、スライドメニューを開いて、**Studio**を選択します。
<img width="338" alt="スクリーンショット 2019-09-28 15.44.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/fa304fa5-78cb-bd29-db8d-94836f1d715d.png">

- 赤いプラスアイコンをクリックするか、**Create a new flow**ボタンを押して、新しいフローを作成します。
- **FLOW NAME**に適当な名前を入力して、**Next**ボタンを押します。
- **Import from JSON**を選択して、**Next**ボタンを押します。
<img width="601" alt="スクリーンショット 2019-09-28 16.02.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/8f1d7586-15b7-4799-7e2e-597c10b999be.png">

- **New Flow**ダイアログのコード欄に、以下のJSONをすべて貼り付けます。

```json
{
  "description": "NOBYBOT",
  "states": [
    {
      "type": "InitialState",
      "name": "Trigger",
      "properties": {
        "offset": {
          "x": 0,
          "y": 0
        },
        "flow_url": "https://webhooks.twilio.com/v1/Accounts/ACXXXX/Flows/FWXXXX"
      },
      "transitions": [
        {
          "event": "incomingMessage",
          "conditions": [],
          "next": null,
          "uuid": "acc8302d-5dcc-449c-b719-8aa108e2e6c7"
        },
        {
          "event": "incomingCall",
          "conditions": [],
          "next": "FF337c3817e9089643498ccae2f6264a95",
          "uuid": "8c75c995-ad6d-40a0-8317-8b9860886c0e"
        },
        {
          "event": "incomingRequest",
          "conditions": [],
          "next": null,
          "uuid": "1d2398ce-3694-4fb0-8ef1-11dff4d260ce"
        }
      ],
      "sid": "FF4c868c422ccb86add0b83168d3992d55"
    },
    {
      "type": "Webhook",
      "name": "NOBY_API",
      "properties": {
        "offset": {
          "x": 20,
          "y": 690
        },
        "method": "GET",
        "url": "https://app.cotogoto.ai/webapi/noby.json?appkey=ここに認証キーを入れる&text={{widgets.TALK.SpeechResult}}",
        "body": null,
        "timeout": null,
        "parameters": null,
        "save_response_as": null,
        "content_type": "application/x-www-form-urlencoded;charset=utf-8"
      },
      "transitions": [
        {
          "event": "success",
          "conditions": [],
          "next": "FF80c80357e172a604e42653b91c2f0ef2",
          "uuid": "867ebd37-3215-4e4a-af05-2d3c1ecc86df"
        },
        {
          "event": "failed",
          "conditions": [],
          "next": null,
          "uuid": "aaf7c49a-82c6-4fa8-bc6d-9238473742b2"
        }
      ],
      "sid": "FFcb0e9c9d7d9eeca1a6712739518bf5bc"
    },
    {
      "type": "Gather",
      "name": "TALK",
      "properties": {
        "offset": {
          "x": 30,
          "y": 430
        },
        "timeout": 5,
        "finish_on_key": "#",
        "stop_gather": true,
        "number_of_digits": null,
        "save_response_as": null,
        "say": "{{flow.variables.noby_text}}",
        "play": null,
        "voice": "Polly.Takumi",
        "language": "ja-JP",
        "loop": 1,
        "hints": null,
        "gather_language": "ja-JP"
      },
      "transitions": [
        {
          "event": "keypress",
          "conditions": [],
          "next": null,
          "uuid": "207ed041-ea33-4502-8f44-776e793e6833"
        },
        {
          "event": "speech",
          "conditions": [],
          "next": "FFcb0e9c9d7d9eeca1a6712739518bf5bc",
          "uuid": "563d8c51-9fda-4e7d-a09c-addc92a8e5cb"
        },
        {
          "event": "timeout",
          "conditions": [],
          "next": null,
          "uuid": "90bcfafe-9b44-4ead-b49f-34ecb44aa82f"
        }
      ],
      "sid": "FF6e79e00f85e7b743e161b1879204a84e"
    },
    {
      "type": "SetVariables",
      "name": "DefaultSetting",
      "properties": {
        "offset": {
          "x": 110,
          "y": 160
        },
        "variables": [
          {
            "key": "noby_text",
            "value": "僕はノビー。僕と話をしよう。何か話してね。"
          }
        ]
      },
      "transitions": [
        {
          "event": "next",
          "conditions": [],
          "next": "FF6e79e00f85e7b743e161b1879204a84e",
          "uuid": "7c73b43e-0f8f-4a68-a874-85ad6166bc2d"
        }
      ],
      "sid": "FF337c3817e9089643498ccae2f6264a95"
    },
    {
      "type": "SetVariables",
      "name": "NOBY_REPLY",
      "properties": {
        "offset": {
          "x": -130,
          "y": 950
        },
        "variables": [
          {
            "key": "noby_text",
            "value": "{{widgets.NOBY_API.parsed.text}}",
            "index": "0"
          }
        ]
      },
      "transitions": [
        {
          "event": "next",
          "conditions": [],
          "next": "FF6e79e00f85e7b743e161b1879204a84e",
          "uuid": "5a4c4942-ecdb-4baa-bc6b-ab345aa5dc53"
        }
      ],
      "sid": "FF80c80357e172a604e42653b91c2f0ef2"
    }
  ]
}
```

<img width="604" alt="スクリーンショット 2019-09-28 16.08.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/34579f25-e86d-e83f-01ad-1f82e18b9c0f.png">

- 45行目の**ここに認証キーを入れる**という文字を、NOBY APIの認証キーに置き換えます。
- **Next**ボタンを押します。
- 以下のようなフローが読み込まれます。

<img width="516" alt="スクリーンショット 2019-09-28 16.14.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86046/ee5d3edf-8ce8-ba87-3eac-6aeaae1da694.png">

## 電話番号に対して、作成したStudioフローを割り当てる。

- スライドメニューから**Phone Numbers**を選択します。
- 購入済みの050番号をクリックして選択します。
- **A CALL COME IN**という項目のプルダウンから**Studio Flow**を選択し、その右側のプルダウンから先程作成したStudioフローの名前を選択します。
- **Save**ボタンを押します。

## テスト

設定した電話番号に電話をかけて、何か会話をしてみましょう。

# まとめ

NOBY APIはとても簡単につかうことができる会話エンジンで、色々と秘密の機能なんかもあります。
ぜひAPIドキュメントを読んで色々と試してみましょう。

---
### Twilio（トゥイリオ）とは

https://twilio.kddi-web.com
Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの 様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。初期費用不要な従量課金制で、各種開発言語に対応しているため、多くのハッカソンイベントやスタートアップなどにも、ご利用いただいております。