AWS
SQLite3
Python3
Alexa
AlexaSkillsKit

Amazon Echo(Alexa)スキル「レトロソフト検索」申請が通ったまでの経緯と愚痴

Amazon Echo(Alexa)スキル「レトロソフト検索」を公開しました。

■犯行までの動機

Alexaスキルを作ろうと思い始めたのが12月半ば、っても何を作って良いのか解らず、何が出来るのかもよくわかんない。
とりあえずそんなに件数が多くないデータベースを検索する機能がやりたかった為、ファミコンソフト(1254本)
のソフト検索を作成。
実用性は、、、ないかもな。

そんなこんなで、echo dotが年末に届き、やっと実機で動作確認。
正月明けくらいから、ほぼ毎日Amazonへスキル申請→リジェクト→修正、申請→リジェクト、、、
6回目でやっと通ったよ(´ω`)

リジェクトされた内容をまとめましたので、参考になればこれ幸いかと。

■「レトロソフト検索」スキル仕様

・AWS Lambda(python3)
・DBはsqlite、テーブルは1テーブルのみの簡単なもの。

ユーザーがゲームタイトル、メーカー名、発売日(MM/DD)を発話することで、アレクサが検索結果を返します。
3件以上あった場合は上位3件のみアレクサが発話し、リストをカードに表示。
カードに表示された番号をユーザーが発話することで、該当ゲームの詳細データをアレクサが発話します。

要はDBのLike検索でひっぱってきてるだけな簡単なお仕事です。

■■■怒濤のリジェクト内容■■■

■スキル開始サンプル発話不具合

1.コンパニオンアプリでユーザーへの提示用に選ばれたサンプルフレーズは、現在、サポートされていない
起動フレーズを使用しています。
サンプルフレーズ:アレクサ、レトロソフト検索、開始

修正例:アレクサ、レトロソフト検索を開いて

対応内容:テスト画面で「レトロソフト検索、開始」でやっていたのでそのまま入力したが、だめらしい。
開始発話を「アレクサ、レトロソフト検索を開いて」に直して対応

■Lambda側バグ

再現手順:
ユーザー:アレクサ、レトロソフト検索を開いて
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名で検索します。
~中略~
スキル:スキルからの応答に問題があります
((セッションクローズ))

対応内容:Lambda側エラーで落ちてたよ。Lambdaを修正。

■アレクサ発話内容修正

ユーザーがスキル内の「ヘルプ」をリクエストした際、
スキルはユーザーにスキルのコア機能の操作方法を示すプロンプトを返す必要があります。
また、ヘルププロンプトはユーザーへの質問で終わり、
応答を受信するまでセッションを開いたままにしておく必要があります。

1.再現手順:
ユーザー:ヘルプ
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名で検索します。
((セッションオープン))

修正例:
ユーザー:ヘルプ
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名を言ってみてください。
((セッションオープン))

2.再現手順:
ユーザー:アレクサ、レトロソフト検索を開いて。
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名で検索します。
((セッションオープン))

修正例:
ユーザー:アレクサ、レトロソフト検索を開いて。
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名で検索します。どうぞ。
((セッションオープン))

対応内容:同じ内容のリジェクトを3回ほど食らっており、最初は何ってんのか判らなかったが、ユーザーに発話させるタイミングを、アレクサ側から伝える必要があるらしい。文末に「言ってみてください」「どうぞ」を追加し対応。
そいや、アレクサ発話中にはユーザー発話は受け付けないのか(不便)

■サンプル発話修正

データのフォーマットが弊社の規定に沿っていません。サンプル発話、スロット値のデータは、
全て日本語で表示する必要があります(頭文字、イニシャリズム、アクロニムを除く)。
以下を削除の上、再度ご申請ください。

intent_SelectGameSeqNO   NO {slot_no}

対応内容:ユーザー発話として「NO(ナンバー)XX」を予測し入れていたが、ナンバーを「NO」と英語で記述しちゃダメらしい、上記サンプル発話を削除し対応。

複数のインテントに同一のサンプル発話が含まれています。
ユーザーのリクエストが正しいインテントへ送られるように、各インテントに独自のサンプル発話が必要です。
問題点:
AMAZON.StopIntent    止めて
AMAZON.StopIntent    とめて
AMAZON.CancelIntent 止めて
サンプル発話の作成について詳しくは、下記のリンク先をご参照ください。

対応内容:サンプル発話で、同じ命令「止めて」が違うインテントで被ってると、何処で認識できるのかわからなくなる模様。「AMAZON.CancelIntent 止めて」を削除し対応。

複数のインテントに類似の発話例が含まれています。
ユーザーのリクエストが正しいインテントへ送られるように、各インテントに独自の発話例が必要です。

該当箇所: AMAZON.CancelIntent  中止

注)AMAZON.StopIntent に「中止」が定義されているため、
発話例にAMAZON.CancelIntentで「中止」を入れることにより、
アレクサが混乱し違うインテントに入ってしまっています。そのため、上記の該当箇所を削除してください。

対応内容:「AMAZON.StopIntent」にはデフォルトで「中止」が含まれている為、他のインテントで定義しちゃだめらしい。(しらんがな)「AMAZON.CancelIntent  中止」を削除し対応。

■スキル説明メッセージ記述ミス

スキルの詳細ページには、タイポや文法的な誤りがないようにしてください。文法にとらわれない自由な表現は、
ブランド固有のものに限り可能です。

問題点:
該当データは複数ある場合には → 該当データが複数ある場合には

問題点:
上位3件の実お伝えします → 上位3件のみお伝えします

対応内容:ワイの記述ミス、すまんかった。

■DB検索処理不具合

再現手順:
ユーザー:アレクサ、レトロソフト検索を開い て.
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名で検索します。どうぞ

ユーザー:カケフくんのジャンプ天国スピード地獄 を探して.
スキル:該当結果はありません。発売日、ゲームタイトル、又はメーカー名を言ってください。どうぞ

想定される結果:
ユーザー:アレクサ、レトロソフト検索を開い て.
スキル:レトロソフト検索にようこそ。発売日、ゲームタイトル、又はメーカー名で検索します。どうぞ 

ユーザー:カケフくんのジャンプ天国スピード地獄を探して.
スキル:検索結果は1件あります。1.カケフ くん の ジャンプ 天国
スピード 地獄詳細は該当の番号を指定願います。又「戻る」で再度検索します。どうぞ

注:同様の問題が他のスロットの値でも起こらないよう全てのスロットの値を確認してください。

対応内容:DB上検索するデータが「カケフくんのジャンプ天国 スピード地獄」とスペースが入っており
フェッチできなかった。DBデータからスペースを削除し、検索に引っかかるように対応。

■サンプル発話内容不足

言い回しの異なるサンプル発話が不足しています。
スキルを確実に起動させ、多くのユーザーのリクエストに対応するためには、サンプル発話を充実させる必要があります。
今回ご提示いただいたサンプル発話のみでは、スキルが確実に起動しない可能性があります。
以下のようなサンプル発話を追加して、再度ご申請ください。

intent_GameTitle    {GameName} で検索して
intent_MakerName    {MakerName} のゲームを検索して
intent_MakerName    {MakerName} のゲームを教えて
など

対応内容:ゲームタイトル、メーカー名のサンプル発話が足りなかった模様。
むしゃくしゃしたから以下の様に追加してやったぜぇ。ワイルドだろう?

intent_GameTitle {GameName}
intent_GameTitle {GameName} の検索
intent_GameTitle {GameName} を検索
intent_GameTitle {GameName} で検索
intent_GameTitle {GameName} を検索して
intent_GameTitle {GameName} で検索して
intent_GameTitle {GameName} を検索してね
intent_GameTitle {GameName} で検索してね
intent_GameTitle {GameName} を探して
intent_GameTitle {GameName} で探して
intent_GameTitle {GameName} を探せ
intent_GameTitle {GameName} で探せ
intent_GameTitle {GameName} を探そう
intent_GameTitle {GameName} で探そう
intent_GameTitle {GameName} を探そうか
intent_GameTitle {GameName} で探そうか

intent_MakerName {MakerName}
intent_MakerName {MakerName} のゲームは
intent_MakerName {MakerName} のソフトは
intent_MakerName {MakerName} のカセットは
intent_MakerName {MakerName} のタイトルは
intent_MakerName {MakerName} の検索
intent_MakerName {MakerName} を検索
intent_MakerName {MakerName} で検索
intent_MakerName {MakerName} の検索して
intent_MakerName {MakerName} を検索して
intent_MakerName {MakerName} で検索して
intent_MakerName {MakerName} の検索してね
intent_MakerName {MakerName} を検索してね
intent_MakerName {MakerName} で検索してね
intent_MakerName {MakerName} のを探して
intent_MakerName {MakerName} を探して
intent_MakerName {MakerName} で探して
intent_MakerName {MakerName} のを探せ
intent_MakerName {MakerName} を探せ
intent_MakerName {MakerName} で探せ
intent_MakerName {MakerName} を探そう
intent_MakerName {MakerName} で探そう
intent_MakerName {MakerName} を探そうか
intent_MakerName {MakerName} で探そうか
intent_MakerName {MakerName} のゲームを検索して
intent_MakerName {MakerName} のゲームを教えて
intent_MakerName {MakerName} のゲームタイトルは
intent_MakerName {MakerName} のゲームタイトルを教えて

■■■怒濤の愚痴その他■■■

アレクサ認識について

・アレクサが数値(Amazon.Number)を認識すると、全角の「1」「2」や、日本語読みの「一」「二」
で認識する。半角じゃねえのかよ。

・ゲームタイトルやメーカー名のサンプル発話で、スロットに10個程入れれば、後は自動で認識してくれるもんだ、あーAIってすばらしい、楽ちん。
とそんなふうに考えていた時期が僕にもありました。

結局、ゲームタイトル、メーカーも全部入れないと、メーカー名なのにゲームタイトル(他のインテント)と認識しちゃったりする。
これもむしゃくしゃしたからゲームタイトル1254、メーカー名100社分も全部スロットに突っ込んでやったぜぇ。

1254個もスロットに突っ込むと、スキルビルダー(ベータ版)で表示したときに重くてやんなるぜぇ。
こんなので本当に1スロットに5万もはいるのかいな。

アレクサ数値発話について

・アレクサに数値を発話させる際、ゲームタイトルにより
「ドラゴンクエスト2」(ツー)
「スーパーマリオブラザーズ3」(スリー)
の様に、表示は数字だけど英語読みで発話させたい場合や、
「魂斗羅」を「コントラ」と読ませたいが、そのままでは「たましいとら」と発話したり
「源平討魔伝」(げんぺいとうまでん)を発話させると「げんぺいうちまでん」と発話したり
もう大変。

前半の数値読みはSSMLで対応してもいいんですが、後半の別名読みは日本語対応のSSMLでなさそう。
(英語ではあるみたい)

その為、DB側で表示用と発話用のカラムを分けています。
又、「2」を「つう」としていますが「ツー」と発話するよりもそれっぽい感じになります。

ゲームタイトル(表示用) ゲームタイトル(発話用)
ドラゴンクエスト2 ドラゴンクエストつう
ドラゴンクエスト4 ドラゴンクエストフォー
ロックマン6 ロックマンシックス

・「スーパーマリオ」を発話させると、どこかのスーパーマーケット店みたいな発音されるが
日本語SSMLでアクセント対応してないので、どうにもならず。

スキルの名前は大切

「ファミコン検索」とかにしたかったのですが、たぶん著作権的にダメだろうと思い
当初は「レトロゲーム検索」としてたのですが、実機でテストした際、アレクサがどうも
「レトロ ゲーム 検索」
と認識し、Amazonの買い物サイトで勝手にカートへ「レトロゲーム」を入れたがっていたので、
誤検知しない様にこの名前にしました。
ちゃんと実機でテストしないと、言いにくい名前だったりするので、名前は大切。

カード改行の謎

カードに表示させる際、改行コード"\r"で行っていますが、スマホアプリでは綺麗に改行されますが
PCのスキルポータルサイトでは改行されねえよ。

かといって、"\r\n"だと、PCのスキルポータルサイトではなんとか改行されるが、
スマホアプリでは無駄に行間が空いてどっちにしろ見づらいよ。
その為、現行は"\r"にしてます。

テストについて

はっきり言って一人だけでは、ゲームソフトすべて(1254本+メーカー+日付)のテストはむりぽよです。
あとめんどくさい(´ω`)
検索できないタイトルや、不具合がありましたら、スキル画面から申請ください(´・ω・`)。

Amazonへの質問内容については、別で投稿します。