Watson相手に自らの英語発音を鍛える

[昨日まで](https://qiita.com/rk05231977/items/99e26397c3ae43a0cfc6)で、Jitsi Meetの会議室をIBM WatsonのAIにつなぐことができたので、もう少し応用を追求したい。

考えたのは、自分が英語で発話した内容をAIでテキストに起こして記録し、それをそのままオウム返しでWatsonに読み上げさせるというもの。
これは人相手にやって貰うと恥ずかしすぎるというか、申し訳ない気持ちが勝ってなかなか出来ないことではないかと思うので、良い応用例になるのではないか。

WatsonAssistantの機能で、入力があったらテキスト内容をWebhookで他のサービスに渡して連携することができるのでそれを使う。
あと、Webhook時のレスポンスをWatsonAssistantのクライアント（ここではVoice Agent）に返すことが出来るので、「(自分)会議室で話す」＞「(Watson)会話を文字に起こす」＞「(Webhook先)会話の文字列を記録or表示する」＞「(Watson)起こした文字を復唱する」が可能となる。

# Webhookの応答サービスを作る
簡単に、POSTリクエストを受け取ったら会話内容をコンソールに表示し、その内容でレスポンスを返すプログラムを作成する。
Asteriskサーバーで実行すればいいだろう。とりあえずruby sinatra？
コマンドプロンプトで以下を実行する。

```
# apt-get install ruby
# gem install sinatra --no-ri
```

以下のファイルを作る。

```ruby:responder.rb
require "sinatra"
require "json"

set :bind, "0.0.0.0"
set :port, 80
post "/" do
  content_type 'application/json'
  r = (JSON.parse request.body.read)["text"]
  puts r
  JSON.generate({response: r})
end
```

ポート80を空け、プログラムを起動する。

```
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# ruby responder.rb
```

# Watson Assistantの構成

１．IBM Cloud、VoiceAgent-WatsonAssistantの「Watson Assistant」を起動する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/c577a5bb-ac74-37a6-7c1c-4dc3e8be4ba4.png)

２．Skillsの画面で「Create skill」をクリックする。Dialog skillを選択し、Skill名を入力して、「The room to stare at yourself」とか？、「Create dialog skill」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/9905d732-b735-7210-c58b-5808a338a97a.png)

３．Intentは作らない。「Options」＞「Webhooks」を開き、URLに先に作成したサービスのURLを指定する。例えば「http://pbx.example.com/」。設定の変更は自動で行われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/0783b585-d1be-5e89-0ab9-5e631776c2bc.png)

４．「Dialog」＞「Anything else」をクリックし、画面右上の「Customize」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/165f4414-c383-7dd1-d2b8-f426c707b95a.png)

５．「Callout to webhooks～」をONにし、「Call a webhook」にチェックを付け、「Apply」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/553d1903-48ac-1f70-854e-a17c16a9e8f2.png)

６．Parametersで「Add parameter」をクリックしてKey:「text」、Value:「```"<? input.text ?>"```」を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/490983bf-08b5-0c1d-8de0-f6ebf93cdcc6.png)

７．Assistant respondsで、「I didn't under stand～」の返答を削除し、「$webhook_result_1」にText応答「```"You said... <? $webhook_result_1.response ?>"```」を設定する。Webhook応答がないときの念のため、「anything_else」にはText応答「"No respose."」を設定する。

（変更前）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/5f2ed682-bb61-105e-b026-9a6ffbf259b7.png)

（変更後）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/4a2bd2e6-fdd2-17b3-8235-99d28d39a4e0.png)


再度書くが、設定の保存は値を変更すれば自動的に行われる。

# Voice Agentを編集する
１．IBM Cloud、Voice Agentの管理画面を開き、「エージェントの編集」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/ebc1f7e6-0794-16bf-f6af-4c28ed67c44d.png)

２．会話のスキル名に、先に作成したスキルを設定し、「変更を保存」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/3a087111-b965-a84a-ee13-79f015c1010d.png)

# 試してみよう

１．Jitsi Meetの会議室を開き、Watsonの電話番号につなぐ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/b1e6a824-f9e6-76f1-8ca6-048ec4e66ec0.png)

２．おもむろにマイクに向かって「Happy new year!」と言ってみる。

３．上手くいけば、先に起動したWebhookのコンソールに、自分が言った内容が表示されるはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146381/e4e5b6fe-9fc1-6dc1-013c-91feeee125fc.png)
１回目は「up the neovia」、２回目は「I. P. nuclear」、３回目にようやく「happy new year」である。
黙ると「vgwPostResponseTimeout」が飛んでくる。