Rails開発者に贈る、Alexa開発事始め
はじめに
AmazonのタイムセールでEchoを購入した。 だから、Alexa開発してみたいけど何から始めたら良い?
っと聞かれたので、Alexa開発を始めるには、まず何を理解すれば良いのかを書いてみたいと思います。 また、私の周囲にはRails開発者が多いので、できる限りRailsに例えてAlexa開発を表現してみました。 多少、こじつけに近い所もありますが、Rails開発者が理解しやすい事を優先しています。
Alexa開発の概要図
まずは、Alexa開発で基本となる要素は次の3つです。
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シミュレーターを利用すればリクエストとレスポンスのJSONを見ることが可能です。 また、AlexaコンソールにログインしているアカウントでAlexa Webを利用すれば、アカウントリンクの動作確認も行えます。
つまり、Alexaシミュレーター + Alexa Webを利用すれば殆どの動作確認が行えます。 ただし、ユーザーからの発話が自然か?発話の認識が想定どおりか?などは実際に発話してみると色々と調整が必要なことが多々あります。 必ず、最後はEcho実機で動作確認を行いましょう。
Alexaの参考情報
他にもAlexaには沢山の機能あります。そこで、いつも開発時に参考にしているサイトをリストアップしておきます。
Alexa公式ドキュメント
当たり前ですが、公式ドキュメントは情報量も豊富です。 まずは全体をざっと読んでおいて、開発時に公式ドキュメントにかかれていた事を思い出してリファレスンとして使うのがオススメです。
Alexa Skills Kitによるスキルの作成 | Alexa Skills Kit
Alexa Developers JP(YouTube)
Alexaについて動画で説明されています。 Alexaの機能を丁寧に解説しています。 こちらも一式見ておきましょう。
Alexa(GitHub)
では実際に実装する時にはどうすればよいのか?
開発者ならコードを見るのが早いでしょう。 AlexaのGitHubには沢山のサンプルスキルがあります。 これから作ろうとするスキルに似たサンプルスキルを見つけてきて修正すれば最速でスキル開発ができるでしょう。
この中でも、特に参考にするのがalexa/alexa-cookbookのレポジトリです。 このレポジトリでは、機能ごとのデモスキルがあるので、自分のスキルで実装したい機能のデモを探して参考にすると良いでしょう。
まとめ
2019年後半はAlexaのキャンペーンが沢山あります。 例えば、次のキャンペーンはスキル内課金を実装したスキルを1つ公開するごとにEcho Show5が1つもらえます。
また、スキルチャンレジというのもあります。 こちらはスキル内課金を実装したスキルに対して賞金約100万円とISPファイナリストサミット旅行への招待が付いてくるそうです。
Alexa スキルチャレンジに参加しよう:賞金総額120,000ドル(約1300万円)超のスキル内課金コンテスト : Alexa Blogs
是非ともこの機会にAlexaスキルを作ってみてください。
Let’s enjoy Alexa development.