Rails開発者に贈る、Alexa開発事始め

はじめに

AmazonのタイムセールでEchoを購入した。 だから、Alexa開発してみたいけど何から始めたら良い?

っと聞かれたので、Alexa開発を始めるには、まず何を理解すれば良いのかを書いてみたいと思います。 また、私の周囲にはRails開発者が多いので、できる限りRailsに例えてAlexa開発を表現してみました。 多少、こじつけに近い所もありますが、Rails開発者が理解しやすい事を優先しています。

Alexa開発の概要図

まずは、Alexa開発で基本となる要素は次の3つです。

Alexa開発の概要図

Amazon Echo

Amazon Echoはユーザーの発話(Input)を受け付けたり、Alexaからの発話(Output)を出力します。

amazon alexa

AlexaはEchoから受け取った音声をテキストに変換します。 変換したテキストにユーザー情報などを付与してJSONとしてバックエンドに渡します。 また、バックエンドから返ってきたJSONを音声に変換してEchoに渡します。 つまり、Alexaは音声の世界とWebの世界の橋渡しを行う存在です。

AWS Lambda

AWS LambdaはAlexaから渡されたJSONを元に実際の処理を行います。 開発者がプログラミングするのはここが中心です。 Alexaの開発をシンプルにするためのASK SDKもこのLambdaの部分で利用します。

AlexaのバックエンドはLambda以外を利用することも可能です。 例えば、AlexaのバックエンドをHeroku + Railsで作ることも可能です。 しかし、後ほど説明するASK CLIを利用するのであれば最初はLambdaで開発することをおすすめします。

Alexa開発で重要な要素

Alexa開発を行うにあたり、理解しておきたい要素が幾つかあります。 これらをRailsの要素に置き換えながら説明してみます。

ASK SDK

ASK SDKがRailsで言う所のRailsフレームワークのイメージです。 Alexa開発を便利に行うための便利な機能が数多くあります。 ASK SDKはNode.js、Python、Javaに対応しています。 個人的にはASK SDK for Rubyがほしい所です。

alexa/alexa-skills-kit-sdk-for-nodejs

インテント

インテントとは、ユーザーの発話に対してどの処理を呼び出すのかを決める所です。 Railsで言う所のroute.rbのイメージです。 インテントでは、ユーザーの発話パターンとインテントを関連付けます。

インテント

例えば「今日の予定は」と発話されたらTodaysScheduleIntentを呼び出すという事を決めていきます。

複数の発話パターンを1つのインテントに関連付ける事が可能です。 つまり、発話パターンとインテントはN:1の関係です。 逆に、1つの発話パターンに複数のインテントを関連付けてはいけません。 仕組み的には可能ですが、どのインテントが呼ばれるか分からないですし、スキルの審査でも指摘されます。

新しいカスタムインテントを作成する

また、インテントにはAlexa標準のビルトインインテントがあります。 これは、スキルの動作を終了するためのAMAZON.StopIntentや、画面付きEchoで画面がタッチされた時の処理を決めるもの等があります。

ビルトインインテントを実装する

インテントの設計は、プログラムをシンプルに保つためにも大変重要です。 これは、RailsでもRESTの設計が重要なのと同様です。

スロット

スロットとは、ユーザーの発話をキーワードとして取り出したい時に利用します。 例えばユーザーに番号を発話させたい時に「○番です」という発話が行われるとします。 この時に発話した番号の部分をスロットにしておきます。 Railsでいう所のparamsのイメージです。

スロット

指定方法は発話パターンの中に{キーワード}の形式でスロットを記述します。 例えば{Number} 番ですの様に記述しておくとNumberというキーでスロットから値を取得することができます。

インテントのスロットを指定する

スロットタイプ

スロットにはスロットタイプを指定します。 例えば、先程の例ではNumberに数字が入ってくることを想定しています。 この様な場合には、スロットタイプにAMAZON.NUMBERを指定すれば数字であることが保証されます。

スロットタイプ

スロットタイプを正しく設定しないと、番号が取得したいのに1番(いちばん)以外にも基板(きばん)出番(でばん)という発話に反応してしまうかもしれません。 Railsで言う所のvalidationのイメージです。

スロットタイプリファレンス

スロットタイプにはAmazonが提供してくれている標準スロットタイプ以外にも標準スロットを拡張することも可能です。 但し、開発時にはできる限り標準スロットタイプで実装できないかを検討しましょう。

セッション

Alexa開発でも複数の発話間でデータの受け渡しを行いたい場合があります。 そんな時に利用できるのがセッションです。 Railsで言う所のセッションクッキーのイメージです。 スキルが起動している間はセットしたセッションデータを取得することが可能です。

スキルセッションとセッションアトリビュートの管理

ASK CLIで新規プロジェクト作成

ASK CLIを使えばAlexa開発のためのスキルテンプレートをコマンド1発で作ってくれます。 Railsコマンドのイメージです。

例えばrails newに該当するask newコマンドがあります。 ask newコマンドでは、インテントを含むAlexa部分とプログラムに該当するLambda部分の両方のテンプレートを作成してくれます。

また、Railsコマンドには無いですが、AlexaとLambdaにデプロイするための、ask deployや、デプロイされたAlexaに設定されている内容との差分を表示するask diffなどがあります。

Alexa Skills Kitコマンドラインインターフェース(ASK CLI)

動作確認

Alexaコンソールにはブラウザから利用できるAlexaシミュレーターがあります。

Alexaシミュレーター

Alexaシミュレーターを利用すればリクエストとレスポンスのJSONを見ることが可能です。 また、AlexaコンソールにログインしているアカウントでAlexa Webを利用すれば、アカウントリンクの動作確認も行えます。

Alexa Web

つまり、Alexaシミュレーター + Alexa Webを利用すれば殆どの動作確認が行えます。 ただし、ユーザーからの発話が自然か?発話の認識が想定どおりか?などは実際に発話してみると色々と調整が必要なことが多々あります。 必ず、最後はEcho実機で動作確認を行いましょう。

Alexaの参考情報

他にもAlexaには沢山の機能あります。そこで、いつも開発時に参考にしているサイトをリストアップしておきます。

Alexa公式ドキュメント

当たり前ですが、公式ドキュメントは情報量も豊富です。 まずは全体をざっと読んでおいて、開発時に公式ドキュメントにかかれていた事を思い出してリファレスンとして使うのがオススメです。

Alexa Skills Kitによるスキルの作成 | Alexa Skills Kit

Alexa Developers JP(YouTube)

Alexaについて動画で説明されています。 Alexaの機能を丁寧に解説しています。 こちらも一式見ておきましょう。

Alexa Developers JP - YouTube

Alexa(GitHub)

では実際に実装する時にはどうすればよいのか?

開発者ならコードを見るのが早いでしょう。 AlexaのGitHubには沢山のサンプルスキルがあります。 これから作ろうとするスキルに似たサンプルスキルを見つけてきて修正すれば最速でスキル開発ができるでしょう。

Alexa

この中でも、特に参考にするのがalexa/alexa-cookbookのレポジトリです。 このレポジトリでは、機能ごとのデモスキルがあるので、自分のスキルで実装したい機能のデモを探して参考にすると良いでしょう。

まとめ

2019年後半はAlexaのキャンペーンが沢山あります。 例えば、次のキャンペーンはスキル内課金を実装したスキルを1つ公開するごとにEcho Show5が1つもらえます。

スキル開発者キャンペーン:

また、スキルチャンレジというのもあります。 こちらはスキル内課金を実装したスキルに対して賞金約100万円とISPファイナリストサミット旅行への招待が付いてくるそうです。

Alexa スキルチャレンジに参加しよう:賞金総額120,000ドル(約1300万円)超のスキル内課金コンテスト : Alexa Blogs

是非ともこの機会にAlexaスキルを作ってみてください。

Let’s enjoy Alexa development.