(2018/03/01) 当記事執筆時点(2017/04月)はIBM Cloud(旧Bluemix)のコンテナ・サービスはDockerベースだったのですが、その後Kubernetesベースのものに変わってしまったので記事が古くなってしまいました。そこで、新たにWatsonと電話で会話しよう! IBM Voice Gateway を使ってみた(Containers in Kubernetes Cluster編) - ★2018/3月 updateを書きましたのでこれからクラウド環境へのデプロイをお考えの方は新しいほうの記事をご参照ください。なお現時点でもIBM Voice Gatewayは独自のDocker環境へのデプロイは可能です。ゆえに当記事の前半は今でも有効かと思いますので記事は残しておきます。(要は後半のIBM Cloud上のDocker環境へデプロイする部分がもう使えなくなってる、ということです)
始めに
昨年末に「Watsonと電話で会話しよう! Voice Gateway for Watson(beta)を使ってみた」という記事を書きましたが、2017/3/24に当該サービスがIBM Voice Gatewayというサービス名で正式にリリースされたので置き換えます。なお、ベータと本番でいくつか変更があったので、ベータを触っていた方向けに当記事の末尾に注意点を書いておきますね。
こんにちわ!石田です。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分くらい)
こっちでは実際に電話を使ってWatsonに製品のことを説明させてしています
特長
- スマホや一般の電話を使ってWatsonとの会話を行える( self-service agents )
- 電話での顧客と担当者間の生の会話(音声)をリアルタイムにテキスト化してNLPやR&Rなどの他のWatsonサービスと共に活用する( Agent assistants )
- プログラミングが一切不要。各種サービスをセットアップするだけでいい
- 日本語も勿論オーケー
- Twilioなど既存サービスと繋がる。スマホを使ったデモも超簡単!
ユースケースの紹介はWays to use Voice Gatewayにあります。今回は電話でのself-service agentsを構成しますが、その場合の機能配置は以下のような感じです。従来ブラウザー等から利用していたWatsonのサービス群と利用者のフツーの電話を簡単につなぐサービスです。(電話は今回は簡単なのでTwilioを使いましたが、スタンダードなプロトコルをサポートしていればIVRでも何でもいいかと)
ドキュメント
正規のドキュメントがKnowledge Centerに公開されています。
IBM Voice Gateway Knowledge Center
シナリオ
様々なユースケース、実装方法の選択肢もいくつかあるのですが、今回は上の絵でも描いている一番シンプルな方法でやってみます。
- Bluemix上のWatsonサービスを利用( Conversation, TTS, STT )
- Voice GatewayはBluemix上のContainerとしてデプロイ
- 電話はTwilioを利用
- スマホのiPhoneからTwilioに架電
環境構築の流れ
大きくは以下の流れで環境を用意します。絵を見るとコンポーネントが多いのでなんか面倒くさそうですが、実際はメチャ簡単です。
- Bluemix上で①Conversation ②Speech to Text ③Text to SpeechのWatsonサービスを用意( Conversationは会話できる状態に設定済であること )
- クライアントPC( 今回はLinux想定 )上でDockerおよび関連ツールを準備
- Githubからリソース一式を入手
- DockerHubからイメージ2つをPULLし、Bluemixのコンテナ環境にPUSH(スクリプトあり)し、コンテナ開始
- 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 コマンドライン・インターフェース (こちらもここからダウンロードできます)
②コマンド行で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します。
中身は下記で、デプロイのコマンドやサンプルの構成ファイルなどが含まれています。(ベータの時の画像です。正式サービスでは他にサンプルなどディレクトリーが増えてますが、大筋に影響ない&再度画面コピーとるのが面倒なのでこのままにさせてください :-) )
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.envを docker.envという名前でコピーしてからdocker.envを編集します。編集するのは3つのセクションです。以下は完成系の例です。(要は各WatsonサービスのCredential情報をコピペなどで設定して、更に2-3か所独自に設定をすればいいだけ、です。)
セクション | キー | 設定値 | 備考 |
---|---|---|---|
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」で表示される下記の値です
※2..サービス資格情報からコピペ
各サービスのパネルの「サービス資格情報」で表示される値です。なければ「新規資格情報」ボタンで作成します。(既存のランタイムとbind済であればそちらの値でもかまいません。要は認証が通ればいいので)
④ 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のコンソールでは以下のように「実行中」になります。
以上でBluemix側の設定は完了です。
5. Twilioのアカウントを取得し、セットアップ
① もしTwilioのアカウントをお持ちでなければ、Twilioのトライアル・アカウントを入手します。( Twilioのサインアップ方法はネットに様々な情報があるので割愛します。)
② 有効なアカウントでコンソールにログインします。
③ まずは自分の電話番号をゲットしましょう。( Twilioではトライアル中も電話番号を1つ無料でもらえます。) ダッシュボードの下の方に「電話番号」がありますのでクリック。
↓ 電話番号が表示されるので「choose this number 」
↓ 電話番号がゲットできました。(+81503196xxxx→国内の電話では050-3196-xxxxになります)
④ 次はSIPトランクです。ダッシュボードから「エラスティックIPトランク」をクリック。
↓ 「Origination」- 「Add new Origination URI」
ブラウザを離れ、ウインドウで以下のコマンドにて稼働状況を表示
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
↓ このSIPトランクに先ほどの電話番号を関連付けます。「電話番号」-「Add a Number to this Trunk」
以上で環境設定は終了です。設定は色々ありましたけど、プログラムは一行も書かないで済みました!
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のログですが、両方向の会話が日本語できちんとログに記録されていますし、こちらの話がうまく認識されない時に、どのように認識されたのか、などを見ることもできます。
ご参考
- ドキュメント
- Getting Startedドキュメント
- DockerHubのイメージ・リポジトリー
voice-gateway-so
voice-gateway-mr - public GitHub repository
ベータと本番での変更点
技術的な面ではベータと殆ど変っていませんが、以下の変更があります。(個人的にはBluemixのサービスに入るのかな?と思っていたら、結局はDockerイメージのままでのご提供でした。オンプレでも動かせるからでしょうね。)
- サービスの名前がIBM Voice Gatewayになった
- starterのリポジトリの名前がsample.voice.gatewayになった
- docker.env内に書く変数の名前が変更になった
- デフォルト提供のdocker.envの定義内容も変わっている
- ライセンスと料金が発表された
私はベータで触っていた環境で「もう一回、正規のDockerイメージをpull & deployすればいいんじゃね?」と思ってやってみたんですが、動かなくてかなりハマリました。ベータのイメージを全部消して、もう一回ここから正規のスクリプトを入手の上、新しいdocker.envを上書きして実行したら、すんなりと動きました。もし皆様がベータ環境をお持ちの場合は、全部消して一からやりなおすことをお勧めします。(要はスクリプト2回なので、大した手間ではないです)
ライセンスと課金体系について
技術中心のQiitaに書くことではないですが、ベータの時は無料でしたが正式なサービスになってライセンスと課金体系も出てきてます。(発表レター)
- 開発と限定的な本番用途は無償
- 本番利用は有償で、課金体系は月次1000分単位で、サポートの要否でも価格が違うようです。
Qiitaなので値段までは書きませんが、スモール・スタートしやすいお値段ではないかとの印象です。