Watson Assistant + Twilio でつくる「任務遂行型音声チャットボット」

2022年12月22日掲載

キービジュアル

この記事は、ソフトバンク Advent Calendar 2022 の22日目の記事となります。

目次

  • この記事は IBM Watson Assistant と Twilio の連携による音声チャットボットについて、ユースケースのアイデアと、構築のポイントについて紹介しています。
  • 詳細な手順を説明するチュートリアルではありませんので、基本的な概念や操作方法については、公式ドキュメントや技術ブログなどでご確認ください。

はじめに

今回は、配送中継センター内での荷物の移動作業を例にとって、作業者に指示を与えながら業務の一部を完了させることを目的とした、任務遂行型の音声チャットボットを作ってみたいと思います。

任務遂行型とは

チャットボットと聞いて思い浮かぶのは、人間が答えてほしい質問に対してロボットに回答させるといった、一問一答型のサービスが多いのではないかと思います。

それとは反対に、実行してほしい一連のタスクをロボットが人間に指示しながら、ミッションを完了させるようなチャットボットを「任務遂行型」と呼ぶことにします。

音声チャットボットとは

スマホの普及も相まって、テキストベースのチャットボットは雨後のタケノコのごとく出現しました。

一方、音声チャットボットと言えば、 電話による再配達の自動受け付けや、Siri や Alexa などのバーチャルアシスタントなどがありますね。

では、音声ベースのチャットボットはテキストベースに比べて、どのようなメリットがあるのでしょうか?

例をあげてみると、

  • 画面(テキスト)を見ることなく、会話が進められる
  • ハンズフリー化が容易に実現できる。(スマートスピーカーやイヤホンマイクなど)
  • 入力インターフェースとしてはテキストよりもやさしいので、子供や高齢者にも受け入れやすい。
  • サービス提供者にとっても、UIを作る手間が省ける

上記のことから、何か作業をしていたり、移動中でも会話が進められるので、任務遂行型には音声チャットボットがうってつけではないでしょうか?

サービス構成

任務遂行型の音声チャットボットを実現するために、今回は IBM Cloud の チャットボット フレームワークである、Watson Assistant と、CPaaS の Twilio を利用します。

Twilio

Twilio は 電話やテキストメッセージなどの通信機能をAPI化することでプログラムから利用可能にした、クラウドコミュニケーション プラットフォームサービス (CPaaS) と呼ばれています。

Elastic SIP Trunking という機能を利用することで、電話の音声とWatson Assistant を接続可能にしています。

Watson Assistant

IBM Watson Assistant は IBM Cloud のコグニティブ・サービスのプロダクトで、テキストベースのチャットボット フレームワークです。

電話統合というオプションを利用することで、Twilio などの CPaaSと連携して、音声ベースのチャットボットも構築できます。

また、SMS統合というオプションを利用すれば、ショートメッセージのインターフェースで会話することも可能になります。

Speech to Text

IBM Watson Speech to Text も  IBM Cloud のコグニティブ・サービスのプロダクトで、人間の声をテキストに書き起こしてくれるサービスです。

Text to Speech

IBM Watson Text to Speech も  IBM Cloud のコグニティブ・サービスのプロダクトで、テキストを人間らしい音声で読み上げてくれるサービスです。

シーケンス

  1. 電話からの音声は、公衆電話網を通じて、Twilio に伝送されます。
  2. Twilio は 音声を Assistantに送信します。
  3. Asisstant は 入力音声をSpeech to Text に送信します。
  4. Speech to Text は 音声をテキストに変換し、
  5. Assistantに 返却します。
  6. Assistant は入力テキストを解釈し、応答テキストを作成します。
  7. Assistant は 応答テキストを Text to Speech に送信します。
  8. Text to Speech はテキストを音声に変換し、
  9. Assistant に返却します。
  10. Assistant は応答音声を Twilio に送信します。
  11. Twilio は 音声を 公衆電話網を通じて、電話に伝送します。

サービスの準備と接続

⚠️ Twilio と IBM Cloud のアカウントはすでに用意されている前提です。

1. Twilio コンソールでの作業

a. SIP Trunk を作成し、新しいTwilio番号(電話番号)を購入するか、既存のTwilio番号に紐づけます。

⚠️ まだ作業が残っているので、画面は開いておきます。

2. Watson Assistant ツールキットでの作業

⚠️ Watson Assistantで電話統合を利用するためには、プラスプラン以上の料金プランのインスタンスが必要になります。(30日間お試しできるトライアルプランでも可能ですが、ライトプランは利用できません)

a. プロジェクトの新規作成

b. 電話統合(Integrations -> Phone)の作成

  b-1.「Manage phone numbers」に、「1. Twilio コンソールでの作業-a」で紐づけたTwilio 電話番号を登録します。

  b-2. Speech to Text のインスタンスを新規作成、または既存インスタンスを割り当てます。(言語モデルは日本語)

  b-3. Text to Speech のインスタンスを新規作成、または既存インスタンスを割り当てます。(言語モデルは日本語)

3. Twilio コンソールでの作業

a. 「1. Twilio コンソールでの作業-a」で作成した SIP Trunkの「Origination URI」に「2. Watson Assistant ツールキットでの作業-b」で払い出された SIP URI を登録します。

Assistant ダイアログの実装

シナリオ

今回の通話開始後のシナリオは以下の流れを想定しています。

通話の開始 〜

指示者(ボット):「お疲れさまです。作業内容をお知らせします。」

指示者(ボット):「駐車場Aのトラックの荷物を検品してください。」

作業者(人間):「終わりました」

指示者(ボット):「駐車場Aのトラックの荷物を倉庫Bに移動してください。」

作業者(人間):「完了しました」

指示者(ボット):「では、事務所に戻って休憩してください。お疲れ様でした。」

〜 通話の終了

ノードの構成

「Assistant settings」でダイアログ機能を有効にして、各ノードを作成します。

ダイアログの各ノードは以下のように構成します。

順序ノード名条件アクション備考
1

ようこそ

welcome

作業開始のメッセージを伝える

 

2

作業1

なし

作業1の内容を伝える

 

2-1

完了

#完了

ノード3にジャンプして、作業2の内容を伝える

ノード2の子ノード

2-2

タイムアウト

input.text == "vgwPostResponseTimeout"

ノード2-1にジャンプして、応答待ち

ノード2の子ノード

2-3

緊急連絡

#中止

電話をかける

ノード2の子ノード

2-4

Anything else

anything_else

聞き返す

ノード2にジャンプして、再度作業1を伝える

ノード2の子ノード

3

作業2

なし

作業2の内容を伝える

 

3-1

完了

#完了

ノード4にジャンプして、作業完了のメッセージを伝える

ノード3の子ノード

3-2

タイムアウト

input.text == "vgwPostResponseTimeout"

ノード3-1にジャンプして、応答待ち

ノード3の子ノード

3-3

緊急連絡

#中止

電話をかける

ノード3の子ノード

3-4

Anything else

anything_else

聞き返す

ノード3にジャンプして、再度作業2を伝える

ノード3の子ノード

4

作業完了

なし

作業完了のメッセージを伝える

通話を切断する

 

実装のポイント

基本的な作り方はテキストベースと同じ考え方ですが、電話統合を利用するうえでのポイントについて説明します。

タイムアウト処理 (ノード 2–2, 3-2)

電話統合の場合、一定時間内(デフォルトは7秒)に応答がなかった場合はタイムアウトが発生し、入力テキストにタイムアウト定数がセットされます。

タイムアウト時間は長くすることも可能ですが、タスクの完了時間のばらつきを考慮して、タイムアウトをスキップするノードを用意します。

(制限時間のあるタスクの場合は、強制終了させるという使いかたも考えられますね)

1. ノードの「If assistant recognizes」の条件を以下のように設定します。

    input.text == "vgwPostResponseTimeout"

2. 「Jump to」で直前の完了ノードに戻して、応答を待ちます。

緊急連絡(ノード 2-3, 3-3)

タスクの継続が困難になった場合など、緊急時に管理者(人間)と直接会話するために電話をかけるノードを用意します。

1. ノードの「Assistant responds」でJSONエディターを開き、

2. output.genericに以下の要素を追加します。

{
  "response_type": "connect_to_agent",
  "transfer_info": {
    "target": {
      "service_desk": {
        "sip": {
          "uri": "相手先電話番号"
        }
      }
    }
  },
  "agent_available": {
    "message": "管理者に替わります。"
  },
  "agent_unavailable": {
    "message": "管理者に繋がりませんでした。"
  },
  "message_to_human_agent": "作業者が指示を仰いでます"
}

「相手先電話番号」は transfer_info.target.service_desk.sip.url に以下の形式でセットします。

"tel:" + "+国番号" + "先頭の0を除いた電話番号"

例. 管理者の電話番号が「080-55-XXXXXXX」だった場合、"tel:+818055XXXXXXX" となります。

電話を切る (ノード4)

作業完了後、こちらから通話を切断します。

1. ノードの「Assistant responds」でJSONエディターを開き、

2. output.genericに以下の要素を追加します。

{
  "response_type": "end_session",
  "channels": [
    {
      "channel": "voice_telephony"
    }
  ]
}

おわりに

今回の例で取り上げた作業指示以外にも、1対多のさまざまな業務に応用できる可能性があると思っています。

実際にソフトバンクの社内では、営業への稟議のトレースなどに活用しています。

今回の記事で伝えたかったのは以下の3点になります。

  • Watson Assistant を使えば、ノーコードでチャットボット が作れる
  • Twilio との電話統合で音声チャットも簡単に実現
  • 音声チャットボットのメリットを生かして、人が関わるさまざまなタスクを自動化できる可能性

IBM Watson も Twilio も無料で試すことができるので、ぜひ触ってみてください。

それでは、ソフトバンク Advent Calendar 2022 の 23日目にバトンを渡します。和田さんよろしくお願いします。

関連サービス

IBM Cloud

IBM Cloudは、IBMが提供するビジネスのためのクラウドサービスです。AIプラットフォームのIBM Watsonをはじめとする幅広い製品・サービスを提供。ビジネス活用だけでなく、既存システムからのセキュアなクラウド移行や、クラウドネィティブ・アプリケーションの開発の両方に対応できるクラウドサービスです。

Twilio

Twilioは、電話、SMS、ビデオ、チャットなど、多様化するお客さまとのコミュニケーションチャネルを1つにつなぐクラウドコミュニケーションAPIです。

おすすめの記事

条件に該当するページがございません