素数大富豪がはかどる素数判定Botをビルドしてみた（Google Assistant 編）

[前回](https://qiita.com/azkiwasher/items/cd4e865186c40816b3d3)、Slack から素数判定できれば素数大富豪がはかどりそうなので試しにつくって実戦投入してみました。投入してみた結果、課題がいくつか見えてきました。この記事では、それら課題の解決にむけて検討したアップデートです。

## 課題

第２回社内素数大富豪で Slack アプリを導入してみた結果、つぎの課題が見えてきました。

- 真偽値だけでなく素因数分解した結果が知りたい。
- 場に出したカードの枚数が判定履歴から正確にはわからない。
- 素数判定のための（肉体的）負荷が高い。

ここでは、最重要課題である3つめの課題について検討したいと思います。

## スタック

各プレイヤーが自分のターンで場に出した数字が素数かどうかを、
**Google Home Mini** に問い合わせることにより、素数判定に伴う（肉体的）負荷軽減を期待したいと思います。素数判定 API バックエンドと **Dialogflow** エージェントは前回構築したものを再利用します。

![stack-with-google-home-mini.png](https://qiita-image-store.s3.amazonaws.com/0/7477/93c077eb-28f3-dfa4-5fe7-977edf02e599.png)

> 前回からの変更点

- **Dialogflow** と [**Google Assistant**](https://assistant.google.com/intl/ja_jp/) をインテグレーション。
- プレイヤーの入出力端末は、スマホではなく [**Google Home Mini**](https://store.google.com/product/google_home_mini?hl=ja) にリプレイス。


## 実装

実装はつぎのステップを踏みます。実装といってもコンフィグレーションだけです。

1. **Actions on Google** プロジェクトの追加
2. **Dialogflow** と **Google Assistant** のインテグレーション
3. 会話終了 Intent の追加
4. **Assistant app** の登録
5. **Google Home Mini** のセットアップ

### 1. **Actions on Google** プロジェクトの追加

**Actions on Google** は **Google Assisstant** にサードパーティ機能を追加するためのデベロッパープラットフォームです。 [Actions on Google コンソール](https://console.actions.google.com/)にログインしたら、GCP のプロジェクトを指定（ここでは前回同様 `prime-daifugo` を指定）して Actions on Google にプロジェクトを追加します。

![add-project-to-actions-on-goolge.png](https://qiita-image-store.s3.amazonaws.com/0/7477/53d7531d-e19e-1ef0-4707-6cf2f49138eb.png)

![project-overview-on-actions-on-goolge.png](https://qiita-image-store.s3.amazonaws.com/0/7477/09080b0c-37b3-a28d-c395-344caae62e7f.png)


### 2. **Dialogflow** と **Google Assistant** のインテグレーション

[Dialogflow コンソール](https://console.dialogflow.com/)にログインして、[前回つくったエージェント](https://qiita.com/azkiwasher/items/cd4e865186c40816b3d3#4-dialogflow-%E3%81%AB%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90)を選択します。左メニューから **Integerations** をクリックします。

![integrate-with-google-assistant.png](https://qiita-image-store.s3.amazonaws.com/0/7477/d7edb3c6-c6d1-c91c-d7c6-f3465ac998fe.png)

**Google Assistant** の **INTEGRATION SETTINGS** をクリックします。ダイアログが表示されたら、つぎのように設定します。**素数判定** は[前回追加](https://qiita.com/azkiwasher/items/cd4e865186c40816b3d3#4-dialogflow-%E3%81%AB%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90)した Intent です。

|Key|Value|
|---|-----|
|Explicit invocation*|Default Welcome Intent|
|Implicit invocation|素数判定|
|Auto-preview changes|OFF|

![manage-assistant-app.png](https://qiita-image-store.s3.amazonaws.com/0/7477/a36a3156-69ab-e5d8-269e-c04def900e76.png)

設定できたら、**MANAGE ASSISTANT APP** をクリックします。Actions on Google コンソールに移動します。**Actions** が `Dialogflow actions` になっていることを確認しておきます。

![dialogflow-actions.png](https://qiita-image-store.s3.amazonaws.com/0/7477/bc70dcd0-4f3b-c70f-a7c1-bf9e75825aa5.png)

引き続き Dialogflow コンソールで、アプリとの会話を終了するための Intent を設定します。

### 3. 会話終了 Intent の追加

Google Home Mini からアプリ（レイチェルさん）を呼んで素数判定させるのですが、一度アプリを呼ぶと、一定時間ユーザからの入力を待ち続けたのち、入力がなければ終了します。素数判定してもらったら、アプリを明示的に終了できるようにしておきましょう。

Google Assistant とインテグレーションした Dialogflow エージェントでは、会話を終了するための Intent を追加できます。

|Key|Value|
|:---|:---|
|Intent name|会話終了|
|User says|ありがとう|
|Response|こちらこそ|
|Google Assistant|End conversation をチェック|

![end-of-conversation-intent.png](https://qiita-image-store.s3.amazonaws.com/0/7477/0c1079b8-c477-6a76-3b3c-926c2335a00b.png)

**User says** と **Response** には、複数のセンテンスを登録しておきましょう。

この Intent を追加することで、たとえば、ユーザから「ありがとう」と入力があると「こちらこそ」などと返答させつつ、アプリを終了することができます。

### 4. Assistant app の登録

[Actions on Google コンソール](https://console.actions.google.com/)にログインして、さきほど追加したプロジェクトをクリックします。

![dialogflow-actions.png](https://qiita-image-store.s3.amazonaws.com/0/7477/89b390c0-2245-5845-2653-a41749151a1a.png)

**App Information** を選択して、**EDIT** をクリックします。
つぎのような内容で設定してみてください。設定が済んだら **SAVE** をクリックします。

|Key|Value|
|:--|:----|
|Assistant app name|レイチェル|
|Pronunciation|レイチェルさん|
|Assistant app introduction|[このアプリでできること] 素数判定|
|Assistant app voice|Female 1 (JA)|
|Match user's language setting|チェックなし|
|Short description|与えられた数が素数かどうか判定できます。|
|Full description|与えられた数が素数かどうか判定できます。|
|Sample invocations|[Ok Google,] レイチェル につないで|
|Large banner image (1920 x 1080)|任意のイメージ|
|Small square logo (192 x 192)|任意のイメージ|
|Developer name (optional)|開発者名|
|Email|開発者メールアドレス|
|Privacy Policy|プライバシーポリシー掲載URL|
|Category|Games & fun|
|For Families|No|
|Testing Instructions (optional)|（入力不要）|
|Transactions|チェックなし|

![app-information.png](https://qiita-image-store.s3.amazonaws.com/0/7477/02f513fe-9eba-35ab-6efc-8cb2e9cc94ad.png)

**Sample invocations** は５つまで設定できます。Google Home Mini に聞き取ってもらえないときのことを考慮して、上限まで設定しておきましょう。

**Privacy Policy** には公開するアプリのプライバシーポリシーを記載したサイトURLを入力します。Google にアプリの公開を申請する場合は、きちんとしたものを用意する必要があります。ここではアプリの公開申請はスキップします。

**App information** を **SAVE** したら、**Location targeting** を選択して、**NEXT** をクリックします。**Surface capabilities** を選択して、つぎのように設定します。

|Key|Value|
|:---|:---|
|Does your Assistant app require audio output|No|
|Does your Assistant app require a screen output|No|

ここまで設定したら、シミュレーターでテストしておきましょう。左メニューから **Simulator** をクリックします。
![click-simulator-menu.png](https://qiita-image-store.s3.amazonaws.com/0/7477/1a4e867c-f687-d976-48e2-6d89baf455e2.png)

オプションはつぎのように設定します。

|Key|Value|
|:---|:---|
|Surface|Speaker (e.g. Google Home)|
|Language|Japanese (Japan)|
|Location|（現在地などの適当な場所）|

画面左下の **Input** に「レイチェルさんにつないで」と入力して、Return(Enter) キーを押します。

![simulate-app.png](https://qiita-image-store.s3.amazonaws.com/0/7477/96529856-cd4e-29ce-9d3b-13ba6be24fe9.png)

これで、先ほど登録したレイチェルさんアプリを呼び出せるはずです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/7477/df8cde8e-f209-d8dd-16c0-902300528fd9.png" width=50%>

素数判定させてみます。**Input** から適当なセンテンスを入力してみます。 

<img src="https://qiita-image-store.s3.amazonaws.com/0/7477/97ac55b5-ebaf-576b-de98-9494a65d78fd.png" width=50%>

では、最後に Google Home Mini からレイチェルさんを呼び出して素数判定してもらいましょう。

### 5. Google Home Mini のセットアップ

Google Home Mini（以下 GHM）をセットアップしていきます。ちなみに筆者は、大阪日本橋のイヤホン屋さんで購入しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/7477/d2561763-3936-8b08-b7d3-f34414a061f5.png" width=50%>

開封したら同封されている手順にしたがって[セットアップ](https://store.google.com/product/google_home_mini_setup?hl=ja)しましょう。セットアップには、Google Home アプリ（Android/iOS）とセキュアな WI-FI 環境が必要です。

GHM デバイスと gmail アカウントを忘れずにリンクしておきましょう。セットアップが済んだら、早速アプリを呼んでみます。

**筆者**：*Ok Google,レイチェルさんにつないで*
**GHM**：*わかりました。 テストバージョンのレイチェルさんです。*
**レイチェルさん**：*こんにちは！*
**筆者**：*1729は素数ですか？*
**レイチェルさん**：*素数じゃないわ。*
**筆者**：*1009は？*
**レイチェルさん**：*素数ね。*
**筆者**：*ありがとう*
**レイチェルさん**：*こちらこそ*

このようなやりとりが実現できるはずです。ちなみに、レイチェルさんのイントネーションはとてもフラットで不自然な感じです。[^1]

また、入力値と判定結果が正しい組み合わせになっているかは、Google Home アプリの**マイアクティビティ**から確認できます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/7477/126f0c92-4ed8-2863-e2f4-fabbe412475c.png" width=50%>

## まとめ

スマホと Slack に替えて、Google Home Mini と Google Assistant で、素数大富豪のための素数判定環境を実装してみました。

今回の実装が腰痛フリーなゲーム進行をどこまで実現できたのかは、次回、第３回目となる社内有志による素数大富豪大会[^2]での評価を待ちたいと思います。

以上です。最後まで読んでいただきありがとうございます。

[^1]: イントネーションのチューニング方法があるのか、本記事執筆時（2017年12月21日）では未調査。
[^2]: 開催時期未定。