Alexa
AlexaSkillsKit
AmazonEchoPlus

Alexa Skill を設計する前にすれば良かったと思ったこと

本記事はサムザップ Advent Calendar 2017の17日目の記事です。
昨日は @chrno001 さんの A5:SQL Mk-2で実DBからDB定義書とER図を自動生成 でした。

はじめに

前回 Amazon Echo Plus (Alexa)のセットアップが完了しました。そこで、今回は Alexa Skill を「作成してみた」を投稿しようと思っていたのですが、設計や開発でつまったのでまとめました。(まだテスト中で、完成しなかった言い訳ですw)

最初に結論

「とりあえず作ってみよう!」と始めるのではなく、きちんと情報を整理して、かなり詳細に設計をしてから開発した方が良いです
1. Alexa 関連の単語を知っておく
2. 音声デザインガイドなどの公式ドキュメントを読む
3. 費用面:スキルを公開すると Amazon さんからプロモーションクレジットがもらえます(2017/12/17現在)。
4. 先人の体験談や情報を読む

1. Alexa 関連の単語を知っておく

Alexa関連単語集で紹介されている単語は知っていた方が良いです。上記の開発 Kit のページ内で頻出する単語の意味が分からないことで何度か詰まったので最初に読んでおくと開発が進みやすいかと思います。最初に英語だけ流し読みして開発しようとしたのがよくなかったなと反省しています。

具体例(Alexa関連単語集から引用)

スキルアダプターディレクティブ(Skill adapter directive)

AlexaスマートホームスキルAPIからスキルアダプターにリクエストを送信するための、JSON形式のデータと命令の集合。

↑ 単語集を読まずに英単語でイメージされる内容とかなり違ったので、初見では???な状態になりました。スキルアダプターに対するディレクティブとして読めば想像通りの意味になるかと思います。

インテント(Intent)

カスタムスキルに関して、ユーザーのコマンドと関連付けられている主要なリクエストまたはアクション。
例: 「Alexa、History Buffで6月3日の出来事を調べて」。この文では、「6月3日の出来事」が、特定のAlexaスキルによる処理が可能なインテントに対応付けられます。このインテントは、Alexaに対して、このユーザーが「History Buff」から特定の日付の歴史情報を取得したいということを示します。

↑ 日本語が苦手な私にはわかりにくい説明がされています。ユーザの命令(コマンド)が示すリクエストあるいはアクション(何がしたいかという意思)をインテントと呼びます。つまり、インテントはスキルが実行可能な特定の物事を指しています。

スロット(Slot)

リクエストに関する詳細情報をAlexaに提供する、インテントへの引数。例:「Alexa、History Buffで6月3日の出来事を調べて」。この文の場合、「6月3日」がリクエストを絞り込むデータスロット値です。

インテントによっては、スロットが必須の場合もあれば、オプションの場合もあります。

  • 必須(Required): Alexaがユーザーリクエストを完了するために必要な値が含まれるスロット。例: 「Alexa、Astrology Dailyで牡牛座の運勢をチェックして」。具体的な星座名がないと、Astrology Dailyは運勢を答えられません。ユーザーが必要なスロット値を提供しない場合、スロット値をユーザーに尋ねる必要があります。
  • オプション(Optional): ユーザーリクエストの絞り込みに使われるが、タスクを完了するために必須ではない値を取るスロット。例:「Alexa、History Buffで6月3日の出来事を調べて」。6月3日はオプションです。History Buffはユーザーが特定の日付を指定しない場合、今日の歴史上の出来事を答えます。このように、ユーザーの発話にオプションのスロット値が含まれていなくても、その値を尋ねる必要はありません。

スロットを必須に指定し、Alexaがそのスロット値を取得できるよう対話を進めるよう設計するには、ダイアログモデルを作成し、Dialog.Delegateディレクティブを使用します。

インテントへの引数という説明だといつどうやって使うのかよくわかりにくいのですが、ユーザーの発話内における可変部分をスロットとして、情報を特定するために使います。旅行予約スキルであれば、「日程」や「行き先」をスロットにして、特定することもできます。

呼び出し(Invocation)

特定のAlexaスキルとの対話を開始すること。
例: ユーザーは「Alexa、Astrology Dailyで私の運勢をチェックして」ということで、Alexaを起動して、Astrology Dailyスキルを呼び出すことができます。Alexaは、その呼び出しに応答して「どの星座ですか?」と尋ねます。

呼び出しのタイプ
  • フルインテント(Full intent): Alexaがリクエストに対するアクションを実行するために必要なすべての情報が含まれるユーザーリクエスト。例: 「Alexa、History Buffで8月20日の出来事を調べて」。
  • 部分インテント(Partial intent): ユーザーのインテントが含まれているが、リクエストスロットが含まれないユーザーリクエスト。例: 「Alexa、Astrology Dailyで私の運勢をチェックして」。このリクエストには運勢を調べる星座が示されていません。Alexaは、ユーザーからその情報を入手する必要があります。
  • インテントなし(No intent): インテントまたはスロットの情報がないユーザーリクエスト。例: 「Alexa、History Buffを開いて」。 各種タイプの呼び出しを処理する対話の設計方法に関する推奨事項については、Alexa音声設計ガイド: ユーザーの発話内容を参照してください。

↑ 呼び出しという単語自体には特に知る必要がないのですが、フルインテント、部分インテント、インテントなしの説明がとても有用でした。特に設計時に想定するべきパターンを見極めるために必要だと思いました。ユーザに優しいのは、すべてのユースケースを洗い出して網羅した設計ですが、作業が少し面倒になります。

2. 音声デザインガイドなどの公式ドキュメントを読む

音声デザインガイド
会話(発声ユーザーインターフェース:VUI)設計を作成したことある人以外は必読だと思いました。
単純な命令に応答するだけのスキルを作ろうとしたのですが、最初につまづいたのがここでした。自分専用のスキルを作って遊ぶ分には読まなくても大丈夫ですが、友人が遊びに来た時に「俺が作ったんだぜー」と披露したい場合は読んだ方が良いかと思います。

具体的にまとめると以下のことが役立ちました。
1. 終了までの最短ルートから設計し、パターン分岐して設計していく
2. 自分が想像した以外にコマンドは必要ないか検討する
3. Alexaのセリフの良い例、悪い例
4. ユーザーによる訂正の扱いを検討する
5. スロットの値は何度も検討して、重複削除し、できるだけシンプルに、誤字・脱字・句読点に気をつける

3. 費用面:スキルを公開すると Amazon さんからプロモーションクレジットがもらえます(2017/12/17現在)。

https://developer.amazon.com/ja/alexa-skills-kit/alexa-aws-credits

なので、「バックエンド側で無料枠対象の AWS Lambda と EC2しか使わない」といった無理な制限はする必要がありません。

そのAWS無料利用枠に加えて、スキルを公開している開発者の皆様には、100ドル分のAWSプロモーションクレジットをお申し込みいただくことができます。また、スキルの開発でAWS使用料が発生した場合は、さらに毎月100ドル分のプロモーションクレジットを受け取ることができます。

Alexaスキルの開発のためにAWS無料利用枠をご利用いただくと、毎月100万件のAWS Lambdaリクエストと最大750時間のAmazon EC2 コンピューティング時間が無料となっていました。それに加えて、今回のAWSプロモーションクレジットでは、新たにAmazon EC2、Amazon Simple Storage Service (Amazon S3)、Amazon DynamoDB、Amazon CloudFrontなども対象になりました。

ということで, DynamoDB, S3, CloudFront も使えるようです。なんらかのスキルを一つ公開するだけで、プロモーションクレジットがもらえるのは嬉しいですね。なお、スキルを公開しておかなくても、先に申し込むことができるようです。

私にはまだ資格がありません。しばらく待ってから申し込むべきでしょうか?
いいえ、是非今すぐお申し込みください。本プログラムへの資格を満たした月の翌月15日前後に、Amazon開発者アカウントで主要な連絡先に設定されているメールアドレス宛てに初回クレジットが送信されます。

(費用がかかりそうで、今月はクリスマスだから来年からやろうかなーと思っている方は費用心配しなくても大丈夫ですよーとお伝えしたい)

4. 先人の体験談や情報を読む

@yam0918さんのAlexaのカスタムスキルを設計するときのTipsまとめ

とりあえず作ってみよう!と実装に手を付ける前に、スキルの起動から終了まで会話のフローや状態管理などをきちんと検討することが大事です。

作り始めて、これを実感しました。単語、会話設計など公式ドキュメントを読み進めても、書いてない説明がありました。

@chrojuさんのAmazon Echo (Alexa) のSkillの開発に必要な基本概念を押さえる

必要な知識と情報は、ここを読めば一通り得られるありがたい記事です。設計の指針や考え方については、公式の音声デザインガイドを読んで深堀りしていくと、さらに整理ができました。

まとめ(再掲)

「とりあえず作ってみよう!」と始めるのではなく、きちんと情報を整理して、かなり詳細に設計をしてから開発した方が良いです
1. Alexa 関連の単語を知っておく
2. 音声デザインガイドなどの公式ドキュメントを読む
3. 費用面:スキルを公開すると Amazon さんからプロモーションクレジットがもらえます(2017/12/17現在)。
4. 先人の体験談や情報を読む

その他の公式ドキュメントや公式ブログには多くの情報があり、読むことが大事だなと思いました。ちなみに私は家電製品も含めてマニュアルを読まずに使い始めて、詰まったらマニュアルを読むタイプの人間です。プログラミング言語も、先に目的を決めて、そこから必要そうなものを模索し、詰まったところから深堀します。今回は設計でつまり、マニュアルを読み始めて、さらに詰まったので忘備録も兼ねて、まとめてみました。


明日は @satotin さんの 「UnityからIL2CPPビルドしたXcodeプロジェクトにブレイクポイントを貼ってデバッグしたい」 です。