Azure Logic AppsでLUISを使ってみた

この記事は、[AIスピーカーとFlashAirで鉄道模型を動かしてみた](https://qiita.com/ayasehiro/items/68d7d9e276afe1fe6074)の参照記事です。

#Azure Logic Appsとは
　Logic Appsについては、こちらの記事をお読みください。
#
- [「誰もがシステム開発者！ノンコーディングで使える「Logic Apps」を試そう」](http://ascii.jp/elem/000/001/627/1627606/)
- [「世界一やさしい「Logic Apps」の操作解説」](http://ascii.jp/elem/000/001/638/1638411/?series=1)

#今回作りたいもの
　今回作りたいものは、Webリクエストを受け付けて、受け取った文字列をLUIS - Language Understandingに受け渡し、文字列をLUISで分析することで任意のEntity（単語）を取得し、これをJSONファイルに整形して、他のWeb APIに送信するものです。

#LUIS
　あらかじめLUISで必要な文章分析のアプリケーションを作っておきます。ここでは「MiniTrainControl」というアプリケーションを作成し、「controlSpeedTrain」というIntentを作成しました。このIntentには、Entityとして速度の値を示す「trainSpeed」と方向を示す「trainDirection」を定義しています。
　LUISアプリケーションの作成方法は、こちらのサイト[「LUIS 入門（Cognitive Services - 2017年12月版 - 1/2）」](http://beachside.hatenablog.com/entry/2017/12/07/000000)が参考になります。

#Logic Appsを作成する

##全体
　今回作成するLogic Appsの全体は下図のようになります。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/89137/1b3555bf-4e7a-8034-592e-7bb25edb8b1a.png)


##トリガー
　今回作成するLogic Appsのトリガーは「HTTP要求の受信時」とします。HTTP要求ではJSONファイルをPOSTで受け取るようにします。
![logicapps1.png](https://qiita-image-store.s3.amazonaws.com/0/89137/608c25e9-cf5b-9b10-98c8-012ac88640e5.png)

　要求本文のJSONスキーマは以下のように設定します。
#
```schema.json
{
  "properties": {
    "CmdMsg": {
      "type": "string"
    },
    "Content-Type": {
      "type": "string"
    },
    "ServerName": {
      "type": "string"
    }
  },
  "type": "object"
}
```

##変数の設定
　LUISで分析して文字列から取り出した単語を代入する変数を設定します。変数はtrainSpeedとtrainDirectionの２つで、いずれも種類は文字列としました。初期値としてそれぞれ"000"と"0"を設定しておきます。

![logicapps2.png](https://qiita-image-store.s3.amazonaws.com/0/89137/c03d14eb-819e-ee13-0a3f-4b81ca04f6aa.png)

##LUISとの連携

###LUIS - Get predictionの追加
アクション「LUIS - Get prediction」を追加します。
![logicapps3-1.png](https://qiita-image-store.s3.amazonaws.com/0/89137/11e8c637-08ef-df6d-5358-678a0df752f6.png)

###あらかじめ作成したLUISの連携
あらかじめ作成したLUISアプリケーション
のAPI KeyをLUISのポータルサイトで確認します。SETTINGSの下にあるApp Setting画面に書かれているApplication IDがそれに当たります。
![luis1.png](https://qiita-image-store.s3.amazonaws.com/0/89137/7f4dfe3e-3a37-f1fa-1a25-fb146c6b22bf.png)

「LUIS - Get prediction」の「API Key」欄にApplication IDの値をコピー＆ペーストします。接続名はわかりやすい任意のもので構いません。入力したら作成ボタンを押します。
![logicapps3-2.png](https://qiita-image-store.s3.amazonaws.com/0/89137/1b11b2a5-b586-eefe-2f67-c686b85a2890.png)

###APP Idの選択
次に、App Idのプルダウンから今回利用するLUISアプリケーションを選択します。
![logicapps3-3.png](https://qiita-image-store.s3.amazonaws.com/0/89137/03cc42ad-0241-c08e-0fc3-08f8d154e049.png)

###入力値とIntentの選択
次にUtterance欄にLUISアプリケーションに送信する入力値を記載します。ここではHTTP要求の受信データのJsonデータのCmdMsg項目を指定します。
CmdMsgには、「速度120で前に進め」といったAIスピーカーで認識した文言が入ってくる想定です。
またDesired Intentでは、解釈するIntentを指定しておきます。ここでは、あらかじめ作成したIntentのうち列車の速度制御用のIntentとして「controlSpeedTrain」を指定しています。
![logicapps3-4.png](https://qiita-image-store.s3.amazonaws.com/0/89137/d2b5fa21-a3ab-9e32-799d-8c41c303936f.png)

###LUISアプリケーションからの戻り値から速度値と方向を取り出す
LUISの戻り値のなかのEntityを取り出すことで、速度値と方向を取得できる。「Entities Array」にEntityが複数格納されているため、これをFor eachで一つずつ取り出す。
条件式で、「Entity Type」が「trainSpeed」であれば速度値なので「Entity Value」に格納された値を取り出して、さきに宣言しておいた速度変数「trainSpeed」に代入する。
また「Entity Type」が「trainDirection」であれば方向なので「Entity Value」に格納された値を取り出して、さらに条件式で「前」か否かを判定し、さきに宣言しておいた方向変数「trainDirection」に「前」なら「0」、それ以外なら「1」を代入する。
![logicapps3-6.png](https://qiita-image-store.s3.amazonaws.com/0/89137/31dba549-3a73-71f7-93e9-35bea0796562.png)

##Azure Functionsとの連携
つぎにAzure Functionで作成したWebAPIを呼び出します。
アクション「Azure Functions」を選択すると、Logic Appsと同じサブスクリプションのAzure Functionsのアプリケーションが表示されるので、適したものを選択します。
![logicapps3-7-1.png](https://qiita-image-store.s3.amazonaws.com/0/89137/e3890d64-7aa0-1a84-cf6f-608feba251c7.png)

つぎにあらかじめ作成されている関数が表示されるので、適したものを選択します。
![logicapps3-7-2.png](https://qiita-image-store.s3.amazonaws.com/0/89137/bd711772-8810-0da8-5652-127921806dff.png)

最後に、選択した関数を呼び出す際に渡すデータを、「要求本文」にJSON形式で記載します。ここではデバイス名「ServerName」と方向[trainDirection」、速度「trainSpeed」を渡すように記載しています。
![logicapps3-7-3.png](https://qiita-image-store.s3.amazonaws.com/0/89137/ad6b45db-2729-4a0d-babc-90d33950eada.png)

#動作確認
以上でLogic Appsの作成は完了です。
動作確認してみましょう。

#参考資料
- [「誰もがシステム開発者！ノンコーディングで使える「Logic Apps」を試そう」](http://ascii.jp/elem/000/001/627/1627606/)
- [「世界一やさしい「Logic Apps」の操作解説」](http://ascii.jp/elem/000/001/638/1638411/?series=1)
- [Connectors - Connector Reference - LUIS](https://docs.microsoft.com/en-us/connectors/luis/)
- [LUIS 入門（Cognitive Services - 2017年12月版 - 1/2）](http://beachside.hatenablog.com/entry/2017/12/07/000000)
- [Google Homeから適当にしゃべってLUISに自然言語処理させ、カレンダーに予定を登録させるというお話（其の一） ](http://shinya.nagoya/2017/12/22/google-home%e3%81%8b%e3%82%89%e9%81%a9%e5%bd%93%e3%81%ab%e3%81%97%e3%82%83%e3%81%b9%e3%81%a3%e3%81%a6luis%e3%81%ab%e8%87%aa%e7%84%b6%e8%a8%80%e8%aa%9e%e5%87%a6%e7%90%86%e3%81%95%e3%81%9b%e3%80%81/)