「筋肉ボイス」を動かしてみる 

# はじめに
[Google Homeを遊びたおす会](https://kotodama.connpass.com/event/79768/)にいってきました。Google Home の活用のお話や、Dialogflow Tipsなど盛りだくさんで大変勉強になりました。中でもちょまど（@chomado)さんの[「Microsoft のサーバーレスのサービス Azure Functions (C#) を使って Google Home 対応アプリ「筋肉ボイス」」](https://github.com/chomado/GoogleHomeHack)は、Azure Functionsとの連携をしていて、ソースも公開されている！というので、さっそく試してみました。

# 環境について
- Windows10
- Visual Studio 2017
- Azure Functions
- Azure Strage
- Dialogflow

# chomado/GoogleHomeHackのダウンロード
 ちょまど（@chomado)さんのgithubからダウンロードします。
 [chomado/GoogleHomeHack] (https://github.com/chomado/GoogleHomeHack)

# VoiceText Web API
 [VoiceText Web API](https://cloud.voicetext.jp/webapi) を使用しますので、「API無料利用登録」にてAPIキーを入手します。APIキーはメールで送られてきます。

- 「はじめる」ボタンクリック - 「無料利用登録」リンクをクリック

# Microsoft Azure 管理ポータル
## ストレージアカウントの作成
 [Microsoft Azure の 管理ポータル](http://portal.azure.com/)から、ストレージアカウントを作成します。

「+ リソースの作成」- 「Storage Account」をクリックします。

　![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/319745e7-e734-cbb0-aab2-07e3d23ec536.png)

「ストレージアカウントの作成」にて、各パラメータを設定し、「作成」ボタンをクリックします。

 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/cc1764c5-8587-4874-ae2e-7faf7c621b75.png)

# Visual Studio 2017
## APIKeysクラスの追加
 Visual Studio 2017 で、ChomadoVoiceプロジェクトを開きます。

GoogleHome.cs を開くと一部エラーになっている個所があります。VoiceTextのWebApiKeyを格納するクラスが外されているので、このクラスを追加します。

[GoogleHome.cs]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/d273b7d9-a756-fb09-eade-e2274dff3ab9.png)

ソリューションエクスプローラーで、「keys」フォルダを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/337ef934-b9d7-d8e1-a26d-88ae3f30a09e.png)

Keysフォルダを選択しながら、新しい項目を追加にて、クラスを選択、名前を「APIKeys.cs」とし、「追加」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/cf2c1210-ecb1-701d-6a63-48b75e612de4.png)

作成された「APIKeys.cs」に、public変数VoiceTextWebApiKeyを追加してください。VoiceTextWebApiKeyの値は、[VoiceText Web API](https://cloud.voicetext.jp/webapi) の「API無料利用登録」にて入手したAPIキーを記載してください。

```csharp:APIKeys.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ChomadoVoice.Keys
{
    class APIKeys
    {
        public static readonly string VoiceTextWebApiKey = "(WebAPIキーを記入)";
    }
}
```

## VoiceTextWebAPIClientの追加
 「NuGetパッケージの管理」にて、「VoiceTextWebAPIClient」を追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/33a0a3e8-7f67-9bb3-a08e-3061a24d0301.png)

## Azureクラウドサービスへ発行する
Azureクラウドサービスへ作成したFunctionを発行します。
ソリューションエクスプローラーにて「発行」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/297d362b-28c4-310c-cba7-3d337f70390a.png)

発行先を選択にて、「新規作成」を選択、「発行」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/e902ef7f-dc61-6f75-564c-1bf0fc6e8301.png)

App Serviceの作成にて、「リソースグループ」、「ストレージアカウント」をストレージアカウントの作成にて設定した値に設定します。また、ホスティングプランを新規作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/b1fbd68e-a9ad-dda7-30e2-058a63c1393f.png)

※Microsoftアカウントでログインしていない場合は、「アカウントの追加」にてログインを行ってください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/35b2b7f3-72b4-31c3-f52f-60de906a2a65.png)

ホスティングプランの構成のうち、「場所」を「Japan East」にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/7d32ea91-62e8-51fa-6d4c-8649ed53ba50.png)

App Serviceの作成にて、ホスティングプランが新規作成したものになっていることを確認し、「作成」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/2e6803ac-b923-d840-ac6e-2d7170404a6d.png)

"Publish completed."と表示されたら成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/6d969f96-336a-6d0b-f59a-4dd0ee9e30b9.png)

1回目でエラーになるケースがあるようです。もしエラーになったら「発行」ボタンで再発行してみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/10f1e8e4-d1ba-d71d-de88-09771205d8f5.png)

# Microsoft Azure 管理ポータル
## Function URL のコピー
 作成したFunction App (この例ではFunctionApp20180403015632）を  [Microsoft Azure の 管理ポータル](http://portal.azure.com/)で開きます。

 「f GoogleHome」をクリックします。

 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/3b96452c-cfc9-b14f-8db6-390e6c3d077a.png)

 「関数のURLの取得」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/680502ad-1a05-7058-29d7-8fb6664ac2a4.png)

 ポップアップ画面が開くので、コピーをクリックします。このURLを次のDialogflowのwebhookで使用します。メモ帳などで残しておいてください。　

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/69904d39-3ad4-7265-1e55-5c44eaaf079d.png)


# Dialogflow
 [Dialogflow](https://dialogflow.com/)にGoogleHomeを使用しているGoogleアカウントでログインし、Agent、Intent、Fulfillment を以下のように設定します。

| 項目             |設定値              | 補足　　　　　　       |
|:-----------------|:------------------|:----------------------|
| agent名          |任意                |例：chomadvoicetest   |


| Intents| 説明|
|:---------------|:-----------------------------------|
| anysay         | Azure Functionsと連携する音声トリガー|

| Fulfillment | 説明|
|:---------------|:------------------------------------------|
| Webhook | 「Function URL のコピー」でコピーしたURLを指定します|


## Intents 「anysay」

| 項目| 設定内容 | 補足 |
|:---------------|:-----------|:-----------|
| Intents名| anysay | |
| Training phrases | * | * に対して @sys.any を指定します |
| Responses | Set this intent as end conversation を設定 | 会話の終了|
| Fulfillment | Enable webhook call for this intent を設定 | |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/7feb9372-5c82-377c-bbf6-824e493cb9c3.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/6e7d01d5-93ca-bb1c-b665-ec975e4d28d0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/93f9f6fd-6721-7bf9-e5fa-4242fbc76103.png)

## Fulfillment
「Function URL のコピー」でコピーしたURLを指定します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/23ab9bee-f0c5-5d28-fe76-04110b03bc3a.png)

## Simulator による動作確認
 「Integrations」- 「Google Assistant」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/19a5c2b3-ea6a-65e7-0fac-2f0b71273427.png)
　
 「TEST」をクリックし、Simulatorを起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/9f9f8786-2613-fb44-4e1b-c76564fa5763.png)

　Simulatorでアプリ起動後に、「てすと」と送ると、mp3の音声がエラーになってしまっています。これは、ストレージアカウントに保存したmp3ファイルにアクセス権がないためです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/2fda222f-e415-2969-ab12-edfa84fe4851.png)
 [Microsoft Azure の 管理ポータル](http://portal.azure.com/)に戻り、mp3ファイルへのアクセス権を設定します。

# Microsoft Azure 管理ポータル
# アクセスポリシーの設定
 [Microsoft Azure の 管理ポータル](http://portal.azure.com/)にて、作成したストレージアカウント（この例では、googlehomestrage)を開き、「BLOB」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/d18f14f6-3663-cfda-78ec-29cbadcb94a6.png)

mp3レコードの右端の「...」をクリックし、「アクセスポリシー」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/20643dd7-1e60-0c6d-120f-14dc9369a794.png)


「パブリックアクセスレベル」を「BLOB」にして、「＋ポリシーの追加」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/13cc38f3-90ea-658a-6e93-c611627c4906.png)

以下のように設定し、保存ボタンをクリックします。

| 項目             |設定値              | 補足　　　　　　       |
|:-----------------|:------------------|:----------------------|
| ID　　　          |任意                |例：readonly          |
| アクセス許可　　　 |読み取り            |　　　　　　　         |
| 開始時刻　　　　　 |任意       　　　   |例：2018/4/1 00:00:00 |
| 有効期限　　　　　 |任意       　　　   |例：2018/4/30 00:00:00|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/9ca1a23f-a60b-918d-2a42-559c19f5b4e0.png)

# Dialogflow
## Simulator による動作確認
 mp3のエラーがなくなりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/a0874698-acad-b4fe-4f8d-4bd83c0ea109.png)

# おわりに
 Azure Functions を初めて使いましたが、Visual Studioから発行できるし、C#でも記述できるし、これからいろいろ使ってみようと思います。
 
# おまけ
## Postman による動作確認
 [Postman](https://www.getpostman.com/) を使用して Azure Functionsの動作確認をすることもできます。([Chrome ウエブストア](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja)の方を使いました）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/ee57504f-0f88-15ac-a080-2b3f149c2cbe.png)


| 項目             |設定値              | 補足　　　　　　           |
|:-----------------|:------------------|:--------------------------|
| 呼び出し　　      |POST               |                           |
| URL        　　　 |「Function URL のコピー」でコピーしたURL        |
| Bodyタブ　 　　　 |row を選択　　　   |                          |
|　　　　　　　　　 |JSON（application/json）を選択  　　　|　　  　|
|　　　　　　　　　 |下記のJSONを指定   |　　　　　　　　　　　  　  |

```json:
{
  "result": {
    "resolvedQuery": "テスト"
    }
}
```

　「Send」ボタンで実行します。

 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131693/0827bec8-2e93-2d47-7c53-939225badf98.png)