Amazon.StopIntentではなくカスタムインテントと判断されてしまう時の対応過程

# 事の発端
スキルストアにて、こんなコメントをいただきました。
>「止めて」とか「閉じて」ではスキルが閉じられず、しかもずーっと話続けるので困りました。

大変申し訳ない。
Amazon.StopIntentのサンプル発話が足りてなかったのかもと見返したのですが、どうやら闇雲に足せばいいだけではないと分かったので、自分が行った対応方法をまとめてみました。

(この記事は2019/10/14時点の検証結果を記載しています。Alexaの改良により最新の状態と結果が異なる可能性があることはご了承ください)

# どんなスキル？
[カラーコーディネーターさん](https://www.amazon.co.jp/dp/B07WRGN1RL)
指定した色と相性の良い色、差し色、合う色について教えるスキルです。
(開発時間は2日、20時間くらいだったので評価があまりできていなかったのが大きな問題・・・)

# 実際の挙動を確認
Alexa Developer Consoleでアノテーションセットを作って、NLU評価をしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/af35ef5c-2243-68a5-4f72-016c57940ab1.png)

「やめて」の場合はAmazon.CancelIntentに、「とじて」「閉じて」の場合はColorOnlyIntent(カスタムインテント)と判断されてしまいました。

因みに公開スキルにて、
Amazon.StopIntentに登録していたサンプル発話
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/1b935fa7-afd4-2a75-ae46-57381776c93d.png)

Amazon.CancelIntentに登録していたサンプル発話
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/d6a9d24c-4cf9-843f-505d-82de7c7e4609.png)

少なすぎる・・・。

# StopIntent出ない単語をサンプル発話に登録すればいいだけでは？
Amazon.StopIntentに「やめて」「とじて」「閉じて」を増やして、再度評価すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/d454be50-6237-7510-42bd-3b5b0393157a.png)
「やめて」「とじて」がColorOnlyIntent(カスタムインテント)と判断されてしまいました。

# 平仮名でスロット値が入ることはあるの？
これはあります。
Lambdaでログを出してみたところ、「やめて」が入ってカスタムインテントと判断されていました。
平仮名も対応できることが望ましいといえます。

# カスタムインテントが誤認識されやすいものになっているのでは？
それは勿論あるとは思います。
カラーコーディネーターさんでは、色をユーザーが指定する必要があったので、ColorOnlyIntent(カスタムインテント)では、Amazon.Colorをインテントスロットにして、インテントスロットだけのサンプル発話```{Amazon.Colorのインテントスロット}```のみを登録しています。
例えば、サンプル発話を```{Amazon.Colorのインテントスロット}です。```などインテントスロットにですますを付けたカスタムインテントのみを作ったとしても、やはり「やめて」「とじて」はColorOnlyIntent(カスタムインテント)と判断されてしまうので、色を指定するこのスキルではカスタムインテントの変更は難しいかなという印象です。
(他に良い方法があれば教えてください・・・)

# どう対応した？
色々サンプル発話を登録して試した結果、一番ましな結果になったのはこちら。

Amazon.StopIntentに登録していたサンプル発話
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/183b3f7d-a219-3931-b56e-45f9a1c33953.png)
Amazon.CancelIntentに登録していたサンプル発話
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/481b81dd-4573-2ca2-c8a0-61aee87f3a27.png)

評価結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245399/73656fca-8444-10bc-da70-95ec5fcdb46b.png)
(カラーコーディネーターさんではAmazon.CancelIntentとAmazon.StopIntentは同じ挙動なので一応意図通りには動く)

Amazon.StopIntentのサンプル発話に「やめて」を入れると「やめて」はColorOnlyIntent(カスタムインテント)になるので外しました。

何故「やめて」だけサンプル発話に入れると誤認識されるのか考え、[公式ドキュメントのビルドインテントの発話例](https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html#available-standard-built-in-intents)で「止めて」があるので二重に登録されているのが悪さしているのではないかと推測しました。
しかし、他の例「ストップ」「中止して」だと、Amazon.StopIntentと判断します。
ただし、「すとっぷ」「ちゅうしして」は、ColorOnlyIntent(カスタムインテント)と判断されます。
~~しかし、Amazon.StopIntentのサンプル発話に「すとっぷ」「ちゅうしして」を追加したら、Amazon.StopIntentと判断するようになりました。~~
しかし、Amazon.StopIntentのサンプル発話に「すとっぷ」、Amazon.CancelIntentのサンプル発話に「ちゅうしして」を追加したら、それぞれAmazon.StopIntent、Amazon.CancelIntentと判断するようになりました。
「中止して」「ちゅうしして」は、[公式ドキュメントのビルドインテントの発話例](https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html#available-standard-built-in-intents)にあるようにAmazon.CancelIntentとして登録しましょう。そうしないと、申請が却下されます。(2019/10/15追記)
この現象は平仮名「やめて」がサンプル発話に登録してもカスタムインテントと判断される現象は固有なのかもしれません。
(因みに発話例とかぶって二重に登録されている場合、発話の競合で確認できようですね)

また、[公式ドキュメント](https://developer.amazon.com/ja/docs/custom-skills/implement-the-built-in-intents.html#when-not-using-the-built-in-intents)にあるように、Amazon.StopIntentに変わるカスタムインテントを作成するのも手なのですが、ドキュメントにもあるように非推奨（今後自分たちでカスタムインテントをメンテするのも大変だと思う）なので今回はやめました。

## もっとAmazon.StopIntentの精度を上げたい
基本的にAmazon.StopIntentのサンプル発話がない状態だと
[公式ドキュメントのビルドインテントの発話例](https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html#available-standard-built-in-intents)にある発話例くらいしか拾ってもらえないため多めに追加した方が良いという印象です。
例えば、「終わり」「閉じる」「停止」はAmazon.StopIntentで判断されなかったです。
また今回の例のように平仮名で認識される場合も想定して登録しておくのが良いと思います。ただ、今回のように誤認識もあるので、必ず評価をしておきましょう。

あと、「カラーコーディネート終わり」などスキル固有の終わり方もサンプル発話として登録しておかなければいけないですね。
こればかりは運用して発話を集めるしかなさそうかなと思います。

# 結論
- [公式ドキュメントのビルドインテントの発話例](https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html#available-standard-built-in-intents)以外のサンプル発話は出来るだけ多く登録しておくこと。
- 平仮名で認識される場合もあるので、サンプル発話として登録しておこう。
ただし、平仮名を登録すると誤認識してカスタムインテントと判断される場合があるので、必ず評価しよう。
__(NLU評価ツールとアノテーションセットはとても楽に評価できるのでおすすめ)__

## カラーコーディネーターさんの今後
Amazon.StopIntentのサンプル発話を20以上に増やして申請中です。
申請が承認され次第、コメントをお返しします。
貴重なご意見ありがとうございました。
今後は気を付けます。