【古い記事です】Watsonと電話で会話しよう！ IBM Voice Gateway を使ってみた


:warning: (2018/03/01) 当記事執筆時点(2017/04月)はIBM Cloud(旧Bluemix)のコンテナ・サービスはDockerベースだったのですが、その後<font color="DeepPink">Kubernetesベースのものに変わってしまったので記事が古くなってしまいました。</font>そこで、新たに[Watsonと電話で会話しよう！ IBM Voice Gateway を使ってみた(Containers in Kubernetes Cluster編) - ★2018/3月 update](https://qiita.com/ishida330/items/b4a19b4b044d41695cc5)を書きましたのでこれからクラウド環境へのデプロイをお考えの方は新しいほうの記事をご参照ください。なお現時点でもIBM Voice Gatewayは独自のDocker環境へのデプロイは可能です。ゆえに当記事の前半は今でも有効かと思いますので記事は残しておきます。（要は後半のIBM Cloud上のDocker環境へデプロイする部分がもう使えなくなってる、ということです）

## <i class="fa fa-newspaper-o" style="font-size:1em;"></i> 始めに

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


![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b77282f4-d9ff-0083-2a89-a16cf2245660.png)
こんにちわ！石田です。IBMのWatsonと電話(Telephony)を簡単に組み合わせることができるサービス「**IBM Voice Gateway**」が2017/03/24に正式にリリースされました。([発表レター](https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=an&subtype=ca&appname=gpateam&supplier=760&letternum=JAJPJP17-0179)) 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](http://img.youtube.com/vi/vnAalcUnf5c/0.jpg)](http://www.youtube.com/watch?v=vnAalcUnf5c)

こっちでは実際に電話を使ってWatsonに製品のことを説明させてしています

[![IBM Voice Gateway: the cognitive call center solution](http://img.youtube.com/vi/yz9bq3MnuxA/0.jpg)](https://www.youtube.com/watch?v=yz9bq3MnuxA)

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

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c69bfb36-e4ee-2b25-bf19-7be8add491c8.png)
では早速やってみます！


# ドキュメント
正規のドキュメントがKnowledge Centerに公開されています。
[IBM Voice Gateway Knowledge Center](https://www.ibm.com/support/knowledgecenter/SS4U29/welcome_voicegateway.html)

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

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


# 環境構築の流れ
大きくは以下の流れで環境を用意します。絵を見るとコンポーネントが多いのでなんか面倒くさそうですが、実際はメチャ簡単です。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3d56d7f3-da5c-5cbe-c559-8bcc89e30d33.png)
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に電話するだけです。
なお以降の手順は下記２つのドキュメントに記載の手順に沿っています。
- [Deploying Voice Gateway on IBM Bluemix Container Service](https://www.ibm.com/support/knowledgecenter/SS4U29/deploybmix.html)
- [Setting up a Twilio SIP trunk for self-service agents](https://www.ibm.com/support/knowledgecenter/SS4U29/twilio.html)


## 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 コマンドライン・インターフェース  (未導入の場合は[ここ](https://console.ng.bluemix.net/docs/starters/install_cli.html)からダウンロードできます）
- Bluemix コマンドライン・インターフェース  (こちらも[ここ](https://console.ng.bluemix.net/docs/starters/install_cli.html)からダウンロードできます）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/697a3049-a17d-cfa3-11c3-b5cfa998e99b.png) 

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

```bash
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にログインします

```bash
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)コマンドをインストールします

```bash
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にログインします

```bash
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](https://github.com/WASdev/sample.voice.gateway) をクローン、またはダウンロードして適当なディレクトリーにunzipします。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/042d42bd-dd0d-4494-86b2-ca1a2a7feb65.png)
中身は下記で、デプロイのコマンドやサンプルの構成ファイルなどが含まれています。(ベータの時の画像です。正式サービスでは他にサンプルなどディレクトリーが増えてますが、大筋に影響ない＆再度画面コピーとるのが面倒なのでこのままにさせてください :-) ）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/802d9ce8-5c11-9b93-a756-659b2bfd11c6.png)

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

- それなりに時間がかかります
- 途中で失敗しても単純リランでOKです

```bash
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が成功したことを確認します。他にもいろいろ出てきますが、下記の２つがあることを確認します。(各々の機能詳細は[ここ](https://cjcarpen.gitbooks.io/voice-gateway-for-watson/content/about.html#architecture) を参照 )

| イメージ名 | コンポーネント名 | 役割 | 
|:-----------|:------------|:------------|
| voice-gateway-so | SIP Orchestrator | SIPとConversationとのインターフェース |
| voice-gateway-mr | Media Relay | 各種メディアとのインターフェース |

```bash
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情報をコピペなどで設定して、更に２－３か所独自に設定をすればいいだけ、です。）

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/bb2c056e-1186-191a-ed2a-d7248dbfcbd8.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b6cd5644-e283-c38d-2cef-a8a2e2c7eedf.png)

| セクション | キー | 設定値 | 備考 |
|:-----------|:------------|:------------|:------------|
| 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](https://qiita-image-store.s3.amazonaws.com/0/108535/c48aca2f-726d-7c92-2a7e-b363979423fa.png)

※2..サービス資格情報からコピペ 
各サービスのパネルの「サービス資格情報」で表示される値です。なければ「新規資格情報」ボタンで作成します。（既存のランタイムとbind済であればそちらの値でもかまいません。要は認証が通ればいいので）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8401f7e0-361f-1279-309c-281df6910cc6.png)

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

```bash
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](https://qiita-image-store.s3.amazonaws.com/0/108535/7b04e8c9-39d9-cd51-062b-0781d41b4eef.png)

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

## 5. Twilioのアカウントを取得し、セットアップ
① もしTwilioのアカウントをお持ちでなければ、[Twilioのトライアル・アカウントを入手](http://twilio.kddi-web.com/)します。( Twilioのサインアップ方法はネットに様々な情報があるので割愛します。) 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/02fe77bb-5eb6-602b-d5b3-e061ce41df70.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/98165712-f27c-d208-c3d7-65af2b30d3d6.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/ab226fd1-c90e-6bd3-910b-f3a81fa04d37.png)

↓
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/37a5b18d-55ed-a9a9-050d-9584334dd0d5.png)

↓
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/7d1dd260-5f4e-cf11-d93e-76221b1fb30e.png)

↓　電話番号が表示されるので「choose this number 」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/efed0811-9ecc-babb-4005-df66f0e74c63.png)

↓　電話番号がゲットできました。(+81503196xxxx→国内の電話では050-3196-xxxxになります）
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/60075873-f380-7c78-5227-190bea67573e.png)

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

![image](https://qiita-image-store.s3.amazonaws.com/0/108535/b8ed03f7-4000-1b60-2787-580ed82148bc.png)

↓
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/1dfc41f4-8e29-1e08-5d9d-9b9bee23b12a.png)

↓　「Create a SIP Trunk」 
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a497147e-6228-484d-7c26-a7d22da9b0da.png)

↓　お好きな名前で「作成」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/18f17235-cd6e-175a-90b5-51797e809f99.png)

↓　できました
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/88cb830f-375e-0395-ef60-3134ad32f642.png)

↓　「Origination」- 「Add new Origination URI」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/a4eaca08-a9c1-bbe2-f265-e88828f2018b.png)

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

```
cf ic ps
```

```bash
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](https://qiita-image-store.s3.amazonaws.com/0/108535/2f7a44dc-c81e-6800-516d-0115b4ac0509.png)

↓　追加されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/19c992e4-43df-7ca3-466e-90b7677abaf7.png)

↓ このSIPトランクに先ほどの電話番号を関連付けます。「電話番号」－「Add a Number to this Trunk」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/3d70ddd7-48ff-ddad-3ac9-0e1de372568c.png)

↓　電話番号にチェックを入れ「Add Selected」
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/8fc1a857-785f-972e-d05d-201b297a5fbc.png)

↓　関連付けができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/108535/c87f40ab-6e1c-c616-371f-1f5c4e6a47e9.png)

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

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

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

[ドキュメント](https://www.ibm.com/support/knowledgecenter/SS4U29/deploybmix.html)には他にも色々と有益な情報が掲載されています。ぜひチェックしてみてください。

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

[Troubleshooting](https://www.ibm.com/support/knowledgecenter/SS4U29/troubleshooting.html)に説明がありますが、コンテナのトレースやログを入手できます。
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](https://qiita-image-store.s3.amazonaws.com/0/108535/f7fbe0f7-c790-b195-76a8-a737e6d4197e.png)


# ご参考

- [ドキュメント](https://www.ibm.com/support/knowledgecenter/SS4U29/welcome_voicegateway.html)
- [Getting Startedドキュメント](https://www.ibm.com/support/knowledgecenter/SS4U29/gettingstarted.html)
- DockerHubのイメージ・リポジトリー
 [voice-gateway-so](https://hub.docker.com/r/ibmcom/voice-gateway-so/)
 [voice-gateway-mr](https://hub.docker.com/r/ibmcom/voice-gateway-mr/)
- [public GitHub repository](https://github.com/WASdev/sample.voice.gateway)

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

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

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

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

技術中心のQiitaに書くことではないですが、ベータの時は無料でしたが正式なサービスになってライセンスと課金体系も出てきてます。([発表レター](https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?infotype=an&subtype=ca&appname=gpateam&supplier=760&letternum=JAJPJP17-0179#eordinfx))
- 開発と限定的な本番用途は無償
- 本番利用は有償で、課金体系は**月次1000分**単位で、サポートの要否でも価格が違うようです。

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