Alexa
AWSLambda
AlexaSkillsKit

Alexa Skill 申請時に注意されたことのまとめ

はじめに

先日、自作の Alexa Skill「声で買い物!シミュレーション」が公開されました。
実はこの Alexa Skill, 申請時に何度かリジェクトされています。Amazon は Alexa Skill に関して対話フローやエラーハンドリングに対し厳しい基準を設けているようで、対応するのはなかなか大変でした。
そこで今回は具体的に、対話フローやエラーハンドリングの注意点についてまとめたいと思います。API ドキュメント通りに実装を行ったとしても、ユーザ発話には開発者が想像しないようなパターンが多数存在しており、頑強な対話フロー設計は音声対話システムにおいて非常に重要です。
なお、AWS Lambda 関数を書く方法は

Alexa Skill のための AWS Lambda 関数を Python で書く

にまとめてあり、今回開発した Skill のソースコードはすべて僕の GitHub レポジトリ に公開しています。

呼び出し名の要件

Alexa Skill の呼び出し名に「で」を含めることはできない
僕の開発したスキルの場合、最初は「声で買い物」が呼び出し名だったのですが、この理由により認められませんでした。
おそらく「アレクサ、(スキル名)で○○して」という発話と区別がつかなくなるため、上記のような制限があるのだと思います。最終的には呼び出し名を「買い物シミュレーション」にして対応しました。

スキルの説明不足

ユーザーの誤解を防ぐため、スキルの説明に注意事項を明記する
これはスキルの種類によると思いますが、今回僕が開発したスキルはあくまで VUI1 による買い物をシミュレーションするものであり、実際に買い物を行えるわけではありません。そのため Alexa Skill Store で表示されるスキル説明文には

注意事項: このスキルは音声での注文を疑似体験するためのものであり、スキル内で注文を送信しても実際に注文されるわけではありません。

のような注意事項を記入する必要がありました。

サンプルフレーズ

最初のサンプルフレーズには、ウェイクワードとスキルの呼び出し名の両方を含める
サンプルフレーズとは Alexa Skill Store で各スキルのページ上で表示されるユーザのサンプル発話のことです。これは申請時に開発者が記入します。
上記の制限はすなわち

  • 買い物シミュレーションで買い物を始めて

のようなサンプルフレーズは駄目で、

  • アレクサ、買い物シミュレーションで買い物を始めて

のようにしなければならない、ということです。

ヘルプリクエスト

ヘルプリクエストへのレスポンスは詳細に
ユーザがヘルプリクエストを発話した場合、スキルは端的な説明ではなく、詳細な説明をしなければならないようです。例えば、買い物シミュレーションの場合、スキルを開くと

「このスキルでは、音声による買い物を体験することができます。注文できる商品は10種類の軽食です。まず、買い物を始めてと言ってください。

というレスポンスが返るのですが、ヘルプの場合はこれよりも詳細な説明をしなければなりません。すなわち、

「このスキルでは、音声による買い物を体験することができます。注文できる商品は10種類の軽食です。あなたは買い物中、商品をカートに追加したり、商品の値段を確認することができます。買い物を始めるには、まず、買い物を始めてと言ってください。」

のように詳細な説明を返す必要がありました。

Alexa の発話とセッションオープン

Alexa の応答後、セッションがオープンしている場合はユーザの発話を促すようなレスポンスでなければならない
セッションがオープンしているとは Alexa の応答後もそのスキルが終了していない、ということであり、スキルは何らかのユーザ発話を期待しています。そのため例えばユーザ発話によりカートに商品を追加した後、

「たこ焼きを一パックカートに追加しました。」

とだけ発話するのではなく、

「たこ焼きを一パックカートに追加しました。続けてご注文をどうぞ。」

のようにユーザに発話を促す必要があります。

コード参照の表示

ホームカードにコード参照を表示してはならない
コード参照とはインテント名2のようなプログラム中の変数に入っている値を、ホームカード3に表示してしまうことです。ユーザーフレンドリーなコンテンツにするために、コード参照は表示してはいけない模様です。

インテントのスロットフィリングエラー

スロットに値が入っていない、または無効な値が入っている場合にも対応しなければならない
この問題は先に挙げたどの問題よりも複雑で、しかも予想しづらいものです。Alexa Skill におけるユーザ発話は基本的にスロットフィリングです。例えばカートに商品を追加したいとき

「(商品名)を(数量)追加して」

のような発話をしなければならない、ということを開発者が定義します。また(商品名)や(数量)にどんな値が入るか、ということも事前に定義します。買い物シミュレーションであれば(商品名)には

  • たこ焼き
  • フランクフルト
  • からあげ
  • もんじゃ焼き
  • フライドポテト
  • 大判焼き
  • たい焼き
  • サンドイッチ
  • 焼きそば
  • おにぎり

という値しか入らないことになっています。しかし Alexa の発話理解は上記のルールに厳密に適用されるものではなく、例えば

「一パック追加して」
「カレーライスを一皿追加して」

のように、必要なスロット値が満たされていなかったり、無効なスロット値が入っているような発話も有効なインテントとして AWS Lambda へ送信してしまいます。これに対応するためには、Lambda 関数が Python であれば

item = intent['slots']['Item'].get('value', '')

で値が取得できるかどうか確認したり、取得できなかった場合には

speech_output = "追加する商品が指定されていないか、無効な商品が指定されています。"
speech_output += "例えば、たこ焼きを一パック追加して、のように言ってみてください。"

のように正しい発話をするようユーザに促す必要があります。

まとめ

今回は Alexa Skill を開発するにあたり、ドキュメントを眺めるだけでは気づきにくい対話フロー設計やエラーハンドリングにおける注意点をまとめました。
上記のような注意点に対応するために、なんと4回もスキルの申請がリジェクトされてしまいました。ユーザフレンドリーな音声対話システムを設計するということが、如何に大変なことかが分かりました。
ただし Alexa Skill の申請チェック部門の返信は非常に丁寧で、どこをどう直せば良いのかしっかり指摘してくれるので、そこまで恐れる必要はないと思います。
皆さんもどんどん音声対話アプリケーションを作成して、VUI が当たり前な世の中を目指しましょう!


  1. Voice User Interface の略 

  2. HelpIntent など、ユーザ発話の意図を表すもの 

  3. Alexa アプリや Amazon Echo Show など画面のある Alexa 対応デバイスに表示されるレスポンスのタイトル