Watsonと電話で会話しよう! IBM Voice Gateway を使ってみた

  • 17
    いいね
  • 2
    コメント

始めに

昨年末に「Watsonと電話で会話しよう! Voice Gateway for Watson(beta)を使ってみた」という記事を書きましたが、2017/3/24に当該サービスがIBM Voice Gatewayというサービス名で正式にリリースされたので置き換えます。なお、ベータと本番でいくつか変更があったので、ベータを触っていた方向けに当記事の末尾に注意点を書いておきますね。

image
こんにちわ!石田です。IBMのWatsonと電話(Telephony)を簡単に組み合わせることができるサービス「IBM Voice Gateway」が2017/03/24に正式にリリースされました。(発表レター) Watson Conversationは従来もSpeech to TextやText to Speechと組み合わせれば音声による対話は可能でしたが、PCでのヘッドセットなどを使うものであり、(IVRや電話など) IPテレフォニーとの融合は(自分でアプリを組んで両者をつながない限り) そう簡単にはできませんでした。しかし、このIBM Voice Gatewayを使うと、一行もプログラムを書かずに電話を使ったWatsonとの自然な音声対話ができますし、お客様との会話をリアルタイムにキャプチャーして文脈に合った文献を探す、などの様々なユースケースが考えられ、対話の利用場面が拡がります。日本語もオーケーです!)

要は何してくれるの?

YouTubeの下記の動画がわかりやすいです。(5分くらい)

Demo: IBM WebSphere Connect Voice Gateway for Watson Beta

特長

  • スマホや一般の電話を使ってWatsonとの会話を行える( self-service agents )
  • 電話での顧客と担当者間の生の会話(音声)をリアルタイムにテキスト化してNLPやR&Rなどの他のWatsonサービスと共に活用する( Agent assistants )
  • プログラミングが一切不要。各種サービスをセットアップするだけでいい
  • 日本語も勿論オーケー
  • Twilioなど既存サービスと繋がる。スマホを使ったデモも超簡単!

ユースケースの紹介はWays to use Voice Gatewayにあります。今回は電話でのself-service agentsを構成しますが、その場合の機能配置は以下のような感じです。従来ブラウザー等から利用していたWatsonのサービス群と利用者のフツーの電話を簡単につなぐサービスです。(電話は今回は簡単なのでTwilioを使いましたが、スタンダードなプロトコルをサポートしていればIVRでも何でもいいかと)

image
では早速やってみます!

ドキュメント

正規のドキュメントがKnowledge Centerに公開されています。
IBM Voice Gateway Knowledge Center

シナリオ

様々なユースケース、実装方法の選択肢もいくつかあるのですが、今回は上の絵でも描いている一番シンプルな方法でやってみます。

  • Bluemix上のWatsonサービスを利用( Conversation, TTS, STT )
  • Voice GatewayはBluemix上のContainerとしてデプロイ
  • 電話はTwilioを利用
  • スマホのiPhoneからTwilioに架電

環境構築の流れ

大きくは以下の流れで環境を用意します。絵を見るとコンポーネントが多いのでなんか面倒くさそうですが、実際はメチャ簡単です。
image
1. Bluemix上で①Conversation ②Speech to Text ③Text to SpeechのWatsonサービスを用意( Conversationは会話できる状態に設定済であること )
2. クライアントPC( 今回はLinux想定 )上でDockerおよび関連ツールを準備
3. Githubからリソース一式を入手
4. DockerHubからイメージ2つをPULLし、Bluemixのコンテナ環境にPUSH(スクリプトあり)し、コンテナ開始
5. Twilioのアカウントを取得し、セットアップ

ここまでできれば、あとはスマホでTwilioに電話するだけです。
なお以降の手順は下記2つのドキュメントに記載の手順に沿っています。
- Deploying Voice Gateway on IBM Bluemix Container Service
- Setting up a Twilio SIP trunk for self-service agents

1. Bluemix上で3つのWatsonサービスを用意

Bluemix上で以下の3つのサービスのインスタンスを作成します。
- Conversations
- Text to Speech
- Speech to Text

これらについてはQiita始め、ネットに記事が多数あるので当記事では深入りしませんが、要はConversationsで会話ができる状態にしておいてください。(TTSとSTTはインスタンスを作るだけでいいです)既にお手持ちの環境があるのなら、それをそのまま使えます。

2. クライアントPC上でDockerおよび関連ツールを準備

①作業用のクライアントPC( 今回はLinux想定 )で以下を使えるように準備します。
- Docker環境
- DockerHubへのログイン可能なID
- cf コマンドライン・インターフェース (未導入の場合はここからダウンロードできます)
- Bluemix コマンドライン・インターフェース (こちらもここからダウンロードできます)
image

②コマンド行でDockerHubにログインします

root@ubuntu:~# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxxxxxxx
Password:
Login Succeeded

③同じウインドウでBluemixにログインします

root@ubuntu:~# cf login -a api.ng.bluemix.net
API endpoint: api.ng.bluemix.net
(途中割愛)
API endpoint:   https://api.ng.bluemix.net (API version: 2.54.0)
User:           xxxxx@xxxx.com
Org:            xxxxx
Space:          dev

④ コンテナー管理用 IBM Containers プラグイン(cf ic)コマンドをインストールします

root@ubuntu:~# cf install-plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64

**Attention: Plugins are binaries written by potentially untrusted authors. Install and use plugins at your own risk.**

Do you want to install the plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64? (y or n)> y

Attempting to download binary file from internet address...
10088681 bytes downloaded...
Installing plugin ibm-containers-linux_x64...
OK
Plugin IBM-Containers v0.8.964 successfully installed.

⑤ Bluemix上のIBM Containersにログインします

root@ubuntu:~# cf ic login
(途中省略)
Authenticating with the IBM Containers registry host registry.ng.bluemix.net...
OK
You are authenticated with the IBM Containers registry.
Your organization's private Bluemix registry: registry.ng.bluemix.net/xxxxxx

(以下省略)

3. Githubからリソース一式を入手

① Github上のsample.voice.gateway をクローン、またはダウンロードして適当なディレクトリーにunzipします。
image
中身は下記で、デプロイのコマンドやサンプルの構成ファイルなどが含まれています。(ベータの時の画像です。正式サービスでは他にサンプルなどディレクトリーが増えてますが、大筋に影響ない&再度画面コピーとるのが面倒なのでこのままにさせてください :-) )
image

4. DockerHubからイメージ2つをPULLし、Bluemixのコンテナ環境にPUSH&コンテナ開始

当該ウインドウでDockerHubとBluemixのIBM Containerにログインできていることが前提です
①<展開ディレクトリー>/bluemixで ./pull_tag_push.shを起動します。自動的にDockerHubからイメージ2つをPULLし、BluemixのIBM Containerのイメージ・レジストリーに登録が行われます。

  • それなりに時間がかかります
  • 途中で失敗しても単純リランでOKです
root@ubuntu:~/sample.voice.gateway-master/bluemix# ./pull_tag_push.sh
...(途中省略)
===============================================
  Pulling ibmcom/voice-gateway-so:latest
  Tagging registry.ng.bluemix.net/e051466/voice-gateway-so:latest
  ... and pushing to repository ..
  REPO: registry.ng.bluemix.net/e051466
===============================================
latest: Pulling from ibmcom/voice-gateway-so
d54efb8db41d: Pull complete
f8b845f45a87: Pull complete

...(途中省略)
===============================================
  Pulling ibmcom/voice-gateway-mr:latest
  Tagging registry.ng.bluemix.net/e051466/voice-gateway-mr:latest
  ... and pushing to repository ..
  REPO: registry.ng.bluemix.net/e051466
===============================================
latest: Pulling from ibmcom/voice-gateway-mr
c60055a51d74: Pull complete
...(途中省略)
===================================================================
  Pull, tag and push of voice gateway images completed successfully
===================================================================

② cf ic images コマンドでIBM ContainerのリポジトリーへのPUSHが成功したことを確認します。他にもいろいろ出てきますが、下記の2つがあることを確認します。(各々の機能詳細はここ を参照 )

イメージ名 コンポーネント名 役割
voice-gateway-so SIP Orchestrator SIPとConversationとのインターフェース
voice-gateway-mr Media Relay 各種メディアとのインターフェース
root@ubuntu:~/sample.voice.gateway-master/bluemix# cf ic images

REPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE
registry.ng.bluemix.net/xxxxxxxx/voice-gateway-mr       latest              eb16e43aeeda        8 days ago          220.1 MB
registry.ng.bluemix.net/xxxxxxxx/voice-gateway-so       latest              791b4a9ffe05        8 days ago          345 MB

③ 構成ファイルを作成します。サンプルである bluemix/docker-self-service.envdocker.envという名前でコピーしてからdocker.envを編集します。編集するのは3つのセクションです。以下は完成系の例です。(要は各WatsonサービスのCredential情報をコピペなどで設定して、更に2-3か所独自に設定をすればいいだけ、です。)

image
image

セクション キー 設定値 備考
Conversation WATSON_CONVERSATION_WORKSPACE_ID ワークスペースのID ※1
WATSON_CONVERSATION_USERNAME サービス資格情報からコピペ ※2
WATSON_CONVERSATION_PASSWORD 同上
WATSON_CONVERSATION_URL 同上
STT WATSON_STT_USERNAME サービス資格情報からコピペ ※2
WATSON_STT_PASSWORD 同上
WATSON_STT_URL 同上
WATSON_STT_MODEL ja-JP_NarrowbandModel 行を追加
TTS WATSON_TTS_USERNAME サービス資格情報からコピペ ※2
WATSON_TTS_PASSWORD 同上
WATSON_TTS_URL 同上
WATSON_TTS_VOICE ja-JP_EmiVoice 日本語音声を設定

※1..ワークスぺースID
Conversation Toolのパネルで会話のボックスの右上をクリックして「View Details」で表示される下記の値です
image

※2..サービス資格情報からコピペ
各サービスのパネルの「サービス資格情報」で表示される値です。なければ「新規資格情報」ボタンで作成します。(既存のランタイムとbind済であればそちらの値でもかまいません。要は認証が通ればいいので)
image

④ IBM Container上のリポジトリにあるイメージをデプロイします。<展開ディレクトリー>/bluemixで ./deploy.shを起動します。最終的に2つのコンテナにIPアドレスが割り振られ、起動状態になればOKです。

root@ubuntu:~/sample.voice.gateway-master/bluemix# ./deploy.sh
...(途中省略)
** Binding IPS
OK
The IP address was bound successfully.
OK
The IP address was bound successfully.
** Showing IP Bindings
Number of allocated public IP addresses: 2
Listing IP addresses in current space...
IP Address      Container/Group ID
169.44.125.28   2ef4f728-804b-4280-a9d4-c52f08b2ce3f
169.44.125.35   b07da396-7e88-48e9-9173-3a80513a44f5

** Finished **
CONTAINER ID        IMAGE                                                     COMMAND             CREATED             STATUS                   PORTS                                                                                      NAMES
b07da396-7e8        registry.ng.bluemix.net/e051466/voice-gateway-so:latest   ""                  2 minutes ago       Running 18 seconds ago   169.44.125.35:5060->5060/tcp, 169.44.125.35:8080->8080/tcp, 169.44.125.35:5060->5060/udp   voice-gateway-so
2ef4f728-804        registry.ng.bluemix.net/e051466/voice-gateway-mr:latest   ""                  2 minutes ago       Running 2 minutes ago    169.44.125.28:8080->8080/tcp, 169.44.125.28:16384-16484->16384-16484/udp  

Bluemixのコンソールでは以下のように「実行中」になります。
image

以上でBluemix側の設定は完了です。

5. Twilioのアカウントを取得し、セットアップ

① もしTwilioのアカウントをお持ちでなければ、Twilioのトライアル・アカウントを入手します。( Twilioのサインアップ方法はネットに様々な情報があるので割愛します。)
image

② 有効なアカウントでコンソールにログインします。

image

③ まずは自分の電話番号をゲットしましょう。( Twilioではトライアル中も電話番号を1つ無料でもらえます。) ダッシュボードの下の方に「電話番号」がありますのでクリック。

image


image


image

↓ 電話番号が表示されるので「choose this number 」
image

↓ 電話番号がゲットできました。(+81503196xxxx→国内の電話では050-3196-xxxxになります)
image

④ 次はSIPトランクです。ダッシュボードから「エラスティックIPトランク」をクリック。

image


image

↓ 「Create a SIP Trunk」
image

↓ お好きな名前で「作成」
image

↓ できました
image

↓ 「Origination」- 「Add new Origination URI」
image

ブラウザを離れ、ウインドウで以下のコマンドにて稼働状況を表示

cf ic ps
root@ubuntu:~/sample.voice.gateway-master/bluemix# cf ic ps
CONTAINER ID        IMAGE                                                     COMMAND             CREATED             STATUS                   PORTS                                                                                      NAMES
b07da396-7e8        registry.ng.bluemix.net/e051466/voice-gateway-so:latest   ""                  46 minutes ago      Running 56 seconds ago   169.44.125.35:5060->5060/tcp, 169.44.125.35:8080->8080/tcp, 169.44.125.35:5060->5060/udp   voice-gateway-so
2ef4f728-804        registry.ng.bluemix.net/e051466/voice-gateway-mr:latest   ""                  46 minutes ago      Running 58 seconds ago   169.44.125.28:8080->8080/tcp, 169.44.125.28:16384-16484->16384-16484/udp                   voice-gateway-mr

↓ cf ic psで表示されるうち、voice-gateway-soの方(ポート5060を使っている方)のIPアドレス:ポート番号を以下の形式でパネルの「オリジネーションSIP URI」欄に記入して「追加」

sip:<address:port>;transport=tcp

image

↓ 追加されました。
image

↓ このSIPトランクに先ほどの電話番号を関連付けます。「電話番号」-「Add a Number to this Trunk」
image

↓ 電話番号にチェックを入れ「Add Selected」
image

↓ 関連付けができました。
image

以上で環境設定は終了です。設定は色々ありましたけど、プログラムは一行も書かないで済みました!

6. お疲れ様でした!では電話してみましょう!

では先ほどTwilioで設定した電話番号 050-XXXX-XXXXにお手持ちのスマホか手元のお電話から電話を架けてみてください。Watsonからの挨拶が聞こえてきましたか? こちらの話声はきちんと認識されましたか?

ドキュメントには他にも色々と有益な情報が掲載されています。ぜひチェックしてみてください。

うまくいかない時の問題判別

Troubleshootingに説明がありますが、コンテナのトレースやログを入手できます。
SIP Orchestrator log files

cf ic cp voice-gateway-so:/logs/messages.log .
cf ic cp voice-gateway-so:/logs/trace.log .

Media Relay log files

cf ic cp voice-gateway-mr:/vgw-media-relay/logs/trace-mr.log .

以下はSIP Orchestratorのログですが、両方向の会話が日本語できちんとログに記録されていますし、こちらの話がうまく認識されない時に、どのように認識されたのか、などを見ることもできます。

image

ご参考

ベータと本番での変更点

技術的な面ではベータと殆ど変っていませんが、以下の変更があります。(個人的にはBluemixのサービスに入るのかな?と思っていたら、結局はDockerイメージのままでのご提供でした。オンプレでも動かせるからでしょうね。)

  • サービスの名前がIBM Voice Gatewayになった
  • starterのリポジトリの名前がsample.voice.gatewayになった
  • docker.env内に書く変数の名前が変更になった
  • デフォルト提供のdocker.envの定義内容も変わっている
  • ライセンスと料金が発表された

私はベータで触っていた環境で「もう一回、正規のDockerイメージをpull & deployすればいいんじゃね?」と思ってやってみたんですが、動かなくてかなりハマリました。ベータのイメージを全部消して、もう一回ここから正規のスクリプトを入手の上、新しいdocker.envを上書きして実行したら、すんなりと動きました。もし皆様がベータ環境をお持ちの場合は、全部消して一からやりなおすことをお勧めします。(要はスクリプト2回なので、大した手間ではないです)

ライセンスと課金体系について

技術中心のQiitaに書くことではないですが、ベータの時は無料でしたが正式なサービスになってライセンスと課金体系も出てきてます。(発表レター)
- 開発と限定的な本番用途は無償
- 本番利用は有償で、課金体系は月次1000分単位で、サポートの要否でも価格が違うようです。

Qiitaなので値段までは書きませんが、スモール・スタートしやすいお値段ではないかとの印象です。