Alexaに拒否不可能な当番を決めて頂くskillを作ってみた


初めに


サーバ・インフラ担当のozawaです。何事もすぐに決められない弊社は、社内のゴミ捨て当番をAlexaに選んでもらうというskillを作ってみました。
それなら公開してみようということで、若干公開用に作り直し、skillの審査をしてみて、なんとか通ったのでどういうものかを体験談として書いてみます。

Alexaアプリで、「当番ルーレット」を検索して、ぜひ使ってみてください!(カテゴリではゲーム・トリビア・アクセサリー)

用意するもの


  • Amazon Echo(dotでもOK)
  • AWSのアカウント(Amazon Echoで使用するアカウントと同一)
  • Amazon開発者ポータルのアカウント(Amazon Echoで使用するアカウントと同一)

全てのアカウントは同一のユーザーで、各サービスで登録しておきます。
echoを日本版出る前に輸入したりして、Amazon Echoのアカウントをamazon.comアカウントで紐づけていると面倒になりましたので、その場合は一度ログアウトして、amazon.co.jpのアカウントで再度サインインすることをお薦めします。

図(たぶんこんな感じ)


 

当番ルーレットSkillでやれることを考える


当番ルーレットの開始(セッション維持させるようにしないといけない)
「アレクサ、当番ルーレットを開いて(開始して)」

①抽選を開始
②ユーザー登録
③キャンセル、停止

当番ルーレットの抽選を開始
「アレクサ、当番ルーレットで抽選を開始して」

当番ルーレットにユーザーを追加
「アレクサ、当番ルーレットで太郎さんを追加して」
「太郎」をslotの変数として取得できるようにする。

当番ルーレットからユーザーを削除
「アレクサ、当番ルーレットで太郎さんを削除して」
「太郎」をslotの変数として取得できるようにする。

当番ルーレットに登録されているユーザーのリストを表示
「アレクサ、当番ルーレットでメンバー教えて」

開発者ポータルで登録しよう


awsでもなく、amazonでもなく、developer用のamazonにアクセスします。
アカウント登録し、alexaのskillを作ってみます。

https://developer.amazon.com/

skillを作成したら、以下を入力していきます。

スキル情報の入力

今回、カスタム対話モデルを作成します。スキル名と呼び出し名はとりあえず同じにしました。

対話モデル

ここでは呼び出されるIntentと発話例を書いていきます。登録された発話例をAlexaに言うと対象のIntentが呼び出されます。そのIntentがLambda側に渡すことになります。抽選を開始する際にはスロットは使用していませんが、ユーザーの登録・削除の際にはLastNameというスロットを作り、「{LastName} さんを登録して」のように発話例を登録しています。

ルーレット開始→「GetMemberIntent」→ Lambda →

設定

後ほどlamdaのarnを登録します。

公開情報

ここをちゃんと記載しておくと、alexaスキルのページで自分だけに表示されます。
また、審査で指摘される部分でしたので、ちゃんと書くべき内容でした。(当たり前)

  • skillの所属カテゴリ
  • 公開先(日本だけにしています。)
  • スキルの説明
  • サンプルフレーズ(3つ)
  • 検索キーワード
  • アイコン(デザイナーに作ってもらいました、ありがとうございます!)

プライバシーとコンプライアンス

このスキルは13歳未満の子供をターゲットにしていますか? は必ず「いいえ」だそうです。(日本ではまだいいえのみと審査で言われました。)

プライバシーポリシーURLが必須です。

Alexa Skill画面

lambdaで作ってみよう


skillはlambdaで作成可能ですので、serverless frameworkを使って環境をサクッと作ってみます。

簡単にとりあえず書いてみます。
先程設定した開発ポータルのskillのアプリケーションIDをserverless.ymlに書きましょう。
今回、alexa-sdkがdynamoに対応していましたので、セッション情報を保存できるように自動でテーブルを作成できるように記述します。

serverless.yml

index.js(人様に見せれるようなもんじゃない)

dynamoの使い方(最初alexa-sdkでできることをしらなくて、自力で呼び出してました・・・)やセッション維持の方法はAlexaブログの記事を参考にさせて頂きました。ありがとうございます。

https://developer.amazon.com/ja/blogs/alexa/author/Toshimi+Hatanaka

ここまできてようやくLambdaにデプロイをしてみます。(事前にAWSのAPIKeyはIAMで発行しておいてください(dynamoのテーブルが自動生成されるので、権限がそこそこ必要です。))

再度開発ポータルでlamdaのarnを登録しよう


AWSコンソールでも見れますが、serverlessでもコマンドでARN(DecideLambdaFunctionQualifiedArnの部分)が見れるので確認
(ただし、ここではバージョン管理をしないため末尾に「:1」は外しました。skill更新するときはlambdaのバージョンを固定してやってます。)

動作させてみよう


なんとalexaはなくても、WEB上でテストができます。

https://echosim.io/

長押し(1回ぽんと押すだけじゃないです)して、作ったskillを呼び出してみましょう。

本物でもテストしましたが、割りとみんなに聞こえてて恥ずかしい思いをします。

では審査に


甘い考えで審査に出しましたが、かなり細かい部分まで指摘されました。指摘された部分は以下でした。

  • 13歳未満の子供向けのスキルは、現時点でアメリカ合衆国においてのみ公開を認可している。
    • 公開情報で「いいえ」を選択しておく必要がありました。
  • 呼び出し名の要件を満たしていない
    • 初めは「当番」のみで申請しましたが、1単語のみでは駄目なようでした。
  • スキルの詳細カードに表示される説明には、ユーザーがスキルの使用方法について十分に理解できる正確な情報が含まれていない。
    • 公開情報のスキル説明をユーザーにわかりやすいように適切に書く必要がありました。
  • カスタマーに提示された情報だけでは、スキルのコア機能を完了できない。
    • ユーザー公開用ではなく、審査で確認するための具体的なテスト内容を公開情報に記載する必要がありました。
  • ユーザーの入力を求めるプロンプトを提示している場合は、常にセッションを開いたままにする
    • 最初はセッション維持するためにしていなかったのですが、Alexaから「〜を登録してと言ってください」などと言った内容を投げる場合は、そのままセッションをクローズせず、セッションを維持し、継続して処理を行うようにする必要がありました。
  • サポートされていない起動フレーズを使用している。
    • 「〜でスタートして」と カスタムのインテントで登録していたのですが、 「スタート」が、そもそも起動フレーズのため、「〜をスタートして」と被っていました。起動フレーズが何が使われているかを確認しておく必要がありました。
  • サンプルフレーズの内容が発話例にない。
    • インテントスキーマの発話例に「メンバーを教えて」はあったのですが、サンプルフレーズで記載されている「メンバー教えて」 がなかったことが原因でした。
  • 発話例またはスロット値は、ユーザーがスキルにリクエストする際に言う可能性の高い(フレーズ/値)にする必要がある。
    • 追加例を示してくれていたので、追加したのですが、発話例は結構いると思います。

最後に


サーバレスをやっている人にとっては、割りと簡単に作ることはできると思っています。審査はとても親切に例を出して教えてくれますが、そこそこ厳しめなのでAlexa Blogやリファレンスをちゃんと読んでから審査に出すことをお薦めします。(簡単だと思って読んでませんでした・・・。)

https://developer.amazon.com/ja/blogs/alexa/tag/Japan

https://developer.amazon.com/ja/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html