Amazon EchoとIBM Watsonを連携させてみた - パート3 -

# **はじめに**
* [前回](https://qiita.com/TMR1000/items/79110dbef585dca45b2f)に続き、AlexaとWatson（Conversation）の連携を解説する。


# **3. 対話のフローを作る(Watson Conversation)**
* いよいよ対話のフローの作成である。Watson Conversationは、比較的古くからこの手のサービスを手がけていることからか、フローの作成がしやすいインタフェースが用意されている。Node-REDと同様にIBM CloudのカタログからWatson Conversationを探してみよう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/d017de59-5fa3-afda-d9d7-0fe618a80601.png)

* Watson Conversationの立ち上げは、特に指定する項目はない。作成をクリックして環境が出来上がるのを待とう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/2d1be954-35d0-b5ba-8c51-7091b652b91f.png)

* 開発コンソールには、こちらのLaunch Toolから入ることが出来る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/e17bad8c-5711-7ecb-7378-d96541a1d0ae.png)

* コンソールが立ち上がったら最初にCreate Workspaceをしよう。ワークスペースの名前は、Watson環境の識別のためにあるのみで外部から参照されるものではないので、任意につけよう。Languageはもちろん日本語を選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/43b56b97-3499-aecb-6085-27d0c45b8afe.png)

* ワークスペースができたら、クリックして先に進もう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/6ce9f8f0-bf57-dea3-bb9d-ac240e734996.png)

* まずはじめにAdd intentより、ハローワールド用のIntentを作ろう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/1a4b28ab-b4b4-1eed-4be6-2a5d162229f6.png)

* Intent名は適当で良く、ここでは、User examplesが重要である。Alexaが聞き取った音声が日本語のテキストに変換されて渡ってくるので、今回は"ハローワールド"という事柄について、ユーザーが呼びかけるかもしれなく、かつ、Alexaがちょっとミスって変換するかもしれない、なるべく多くのボキャブラリーを登録してあげると、ちゃんと認識できる可能性が高まる。本来はAlexaの音声認識＝日本語テキスト化の精度に依存するところではあるものの、なかなか認識しないと思われるかどうかは、ここの作り込み次第でもあると思う。ちなみに、Hello Worldという英語も登録しているが、ASK側で日本語を指定している限り音声が英語に変換されてくることはおそらくないと思われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/89f71c5d-3563-2a12-13ed-98eb3ceb6668.png)

* 次に、LaunchRequestとStopRequestのIntentを作成する。これの意味は後ほど解説するので、この通りに作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/34ea1e0c-c7ea-f2e2-8ef9-6595c3a8a3d4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/63542c00-182e-5ca7-5498-6060edeb465b.png)


* 今回必要なIntentは以上の3つだ。次にやることは、Dialogで対話のフローを作ることである。Dialogにはいくつかの設定が必要である。"ようこそ"、"起動"、"ハローワールド"と、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/96d4aad6-52c6-c28a-9e20-cbcf99c50900.png)

* "終了"、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/3ef07c7f-19f5-de67-a3ce-a18baecc4df3.png)

* "その他"の5つだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/82c26830-d7b1-4165-fcd2-9b8edbe2d2a4.png)

* ”ようこそ”と"その他"は、デフォルトで作られる。ここは特に買えなくて良いが、"その他"はWatsonがIntentを理解できなかった場合に飛んでくるany thing elseのフローなので、Alexaに答えさせたい文章があれば、このフローのThen responds withに設定をすれば良い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/d25a560e-39eb-8f5a-ad19-40b5b2ed72f0.png)

* "起動"と"終了"は、今回作ったAlexaスキル"ワトソン"を呼び出したときに、Alexaにしゃべらせる文章を設定しているフローである。設定の中身はこれだけなのだが、このフローがないと(なくてもちゃんと動作はするのだが)、"ワトソンを起動して"、"止めて"と呼びかけた際にAlexaは何も応答をしないので、ちゃんとリクエストを受け取ったことを知らせるために設定をしている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/c97f612c-72da-5860-b18e-864a1b67a699.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/defecc5e-1b0c-ade2-b7e2-062fe203c95b.png)

* ここのLaunchRequest、StopRequestという名称は、Alexaスキルを起動・終了したときにAlexaが出力するメッセージ(request.typeフィールド)に含まれる値を指定している。このメッセージの値を取り出してWatsonに渡すための加工を、[前述(パート2)](https://qiita.com/TMR1000/items/79110dbef585dca45b2f)の”valueの値を取り出す"のノードで行なっている。

* さて、最後にハローワールドの応答文章を設定する。応答はThen respond withに好きなように登録してあげれば良い。あとは、Set to sequentialかSet to randomかの指定で、上から順番に回答文章を選ぶか、ランダムに選ぶかを設定することが出来る。ちなみに、#helloWorldの#は、これがWatson Conversationで登録したIntent名であることを示している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/ac725751-08f0-db2b-2e3e-65dd815b3dfd.png)

* Watson側の設定は、以上である。ここまでできたら、右上の対話マークをクリックして、対話のテストをしてみよう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/5213cfbb-ed88-962f-08c6-a102e5d06f94.png)

* "ハローワールド"とタイプすると、Dialogに設定したように、上から順番に"ハローワールド"、"ハローハローワールド！"、”ハローワールドだよ！”と回答できていることがわかる。それぞれの回答の下に出ている#HelloWorldは、入力されたテキストが#HelloWorkdのIntentに関するものだとちゃんと認識できていることを示している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/69ac5787-45ee-e125-987f-ba618a92be4f.png)

* もし認識できないテキストが来た場合は、"Irrelevant"と表示され、Anything-elseのフローに飛ぶ。ここでプルダウンを開いて#HelloWorldを指定してあげると、"ハロー"をHelloWorldのIntentに関連付けすることが出来る。(IntentのUser examplesに設定するのと同じ効果)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/db6e161e-3eea-28c1-affd-32ff68b7b742.png)

* 上記はあくまでこの対話ツールでしか使えない方法だが、外部からどのような入力が来てどのIntentで拾ったのか・拾えなかったかは、User concersationsの統計情報から見ることが出来るので、ここを見ながらIntentのUser examplesを充実させていくことが可能だ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224839/75a0ebed-540d-f76f-3e60-0cc3bd36ecb1.png)


* パート4に続く


# **関連記事**
* [Amazon EchoとIBM Watsonを連携させてみた - パート1 -](https://qiita.com/TMR1000/items/637751727dc02daf93b9)
* [Amazon EchoとIBM Watsonを連携させてみた - パート2 -](https://qiita.com/TMR1000/items/79110dbef585dca45b2f)
* [Amazon EchoとIBM Watsonを連携させてみた - パート4 -](https://qiita.com/TMR1000/items/d3d2c1086c9cc72e1897)

以上