【祝Alexa日本上陸】とりあえず日本語でスキルを作ってみる #alexa #aws #amazon #ask
惜秋の候, 小春日和の穏やかな日が続いていますが、お変わりなくお過ごしでしょうか、せーのです。
今日は待ちに待ったAlexaの日本上陸を記念して「とりあえずなんか作ってみたい」という方むけに、簡単なスキルを一つ作ってみたいと思います。
スキルの種類
スキルは現在
- カスタムスキル: 標準のスキル。Alexaとのやり取りを「カスタム対話モデル」を使用して行う
- スマートホームスキル: 電球やエアコン等スマートホームデバイスをAlexaから操作することに特化したスキル
- フラッシュブリーフィングスキル: RSSフィードやニュース等の読み上げに特化したスキル
の3種類があります。基本的には欧米でリリースされているAlexa Skill Kitと変わりません。ですので細かい説明は英語版を解説した
【Alexa初心者向け】Alexa Skill Kitを噛み砕いて解説してみる|クラスメソッドブログ
こちらを参考にしてみて下さい。
スキルを作るのに必要なもの
さて、スキルを作るには何が必要でしょうか。とりあえず
- Amazon.comアカウント
- AWSアカウント(※)
この2つがあればスキルは作れます。
※厳密にはAlexaのリクエストをホストできるエンドポイントとなりますので独自サーバーを立てても繋がりますが、一番簡単なのはLambdaを使うことなのでこう書いてみました
まずAmazon.comアカウントを取ったら開発者ポータルにログインします。
左側の「Alexa」のリンクではなく右上の「Developer Console」をクリックします。
ここが開発者ポータルの入口です。上のメニューから[Alexa]をクリックします。
Alexa Skill Kit(ASK)とAlexa Voice Service(AVS)の2つのカテゴリが見えます。AVSとはEcho以外のデバイス(ラズパイとか)にAlexaの機能を載せるための開発になります。今回はASKをクリックします。
自分で作成したスキルの一覧が見えます。ここまでくればスキルの準備はOKです。
用語集
スキル開発には独特な言葉が結構あります。詳しくは公式ドキュメントをご覧いただくのが良いでしょう。ここではよく使う用語について押さえておきます。
インテント
カスタムスキルに関して、ユーザーのコマンドと関連付けられている主要なリクエストまたはアクション。
インテントは「意思」という意味です。ユーザーが色々な言い方でAlexaに話しかけますが、つまりこういうことを言いたいんだよ、という「意思」の形でバックエンドに届けます。例えば「パンが欲しいなあ」も「パンを買いたい」も「パンちょうだい」もみんな「パンを購入したい」という「意思」を表します。これらを例えば「BuyBreadIntent」というようなインテントを定義して、裏側にはこのインテントを送る、という仕組みになります。
スロット
リクエストに関する詳細情報をAlexaに提供する、インテントへの引数。
バックエンドで適切に処理をするには「意思」だけではなく具体的な「数値」や「日付」が必要になります。それらをスロットに定義することによってそこに当てはまる値をそのままバックエンドに流すことができます。例えば「パンが2つ欲しい」とか「アンパンと食パンとカレーパンが欲しい」という場合これらのうち「2つ」や「アンパン」「食パン」などを「AMAZON.NUMBER」や「BreadCategorySlot」というようなスロットとして定義すると、インテントとこの値がそのままバックエンドに流れます。バックエンド側では「BuyBreadIntent」「AMAZON.NUMBER: 2」という情報を受け取り、在庫や金額を計算して返す、という処理を行います。
呼び出し名
ユーザーが使用する、カスタムスキルの名前。
ユーザーがスキルを呼び出す際には「アレクサ、◯◯を開いて」や「アレクサ、◯◯でパンを2つ」といった呼びかけとなります。この〇〇の部分が「呼び出し名」です。
サンプル発話
特定のインテントを、想定されるユーザーの発話に結び付ける、構造化されたテキスト文字列。
実際にユーザーが話すであろうフレーズをサンプル発話として定義しておくと、Alexaが学習し、同じようなフレーズをインテントに結びつけてくれます。例えばインテントの例に書いた「パンが欲しいなあ」「パンを買いたい」「パンちょうだい」を「BuyBreadIntent」に結びつけてサンプル発話として定義しておけば、ユーザーが「パンが欲しい」や「パンが欲しいっす」と言っても「BuyBreadIntent」にAlexaが結びつけてくれます。ただ、この精度はあくまで学習度合いによるので、開発者としては一つのインテントに対してなるべく多くのサンプル発話を定義しておくことが望まれます。
再プロンプト
応答が聞こえない場合、またはよく理解できなかった場合にAlexaが使用する特別なプロンプト。
Alexaがユーザーの応答を待つ時間は8秒です。この間にユーザーが応答しなかった場合は「再プロンプト」に定義されたフレーズをAlexaが自動的に話し、もう8秒待ちます。それでもユーザーが応答しなかった場合はAlexaはセッションを切り、会話が終了します。
やってみた
それでは実際に簡単なスキルを作ってみましょう。今回はパン屋さんでパンを買う、という簡単なものを作ってみます。
新規スキルの作成
上のスキル一覧画面から右上の「スキルの新規作成」をクリックします。
スキルの種類は「カスタム対話モデル」、言語を「Japanese」、スキル名と呼び出し名を任意で入れます。下の「グローバルフィールド」は今回は使わないのでそのままにして「保存」をクリックし「次へ」ボタンを押します。
対話モデルはインテントスキーマ(JSON方式)を手で書く方法と「スキルビルダー」を使う方法があります。今回はスキルビルダーを使ってみたいと思います。
スキルビルダーは対話モデルをGUIで設定できる便利なIDEです。ここでインテントを作ります。「Intent」の「Add」ボタンをクリックします。
インテント名をきめてCreateボタンをクリックします。
出てきた新規インテント作成画面にサンプル発話を書いていきます。この例ではパン屋さんにパンが欲しいという意思(インテント)を伝える発話なのでひたすらパンがほしいという言い回しを書いていきます。
ある程度書き終わったら上の「Save Model」を押し、その後「Build Model」を押します。
ビルドが終わったらConfigurationをクリックします。ここで一旦開発者ポータルは置いておいて、Lambdaの作成をしましょう。
Lambdaの作成
次にバックグラウンドとなるLambdaの作成を行います。AWSにログイン後Lambdaを開き、新規Functionを作成します。リージョンは東京リージョンでよいです。
Blue Printから[Alexa]で検索をかけます。出てきたBluePrintを適当にクリックします。Alexaを使ったLambdaの作成には「alexa-sdk」というモジュールが必要になりますが、BluePrintの中には予めそれら必要なモジュールが入っているので、それを利用したほうが速いです。今回はNode.jsで書くので「alexa-skill-kit-sdk-factskill」のNode.js版を選択します。
function名を埋め、IAM roleを選択します。roleはもっともベーシックなやつで構いません。
次にコードを書きます。今回は単純にこんな感じで書いてみます。
'use strict'; const Alexa = require('alexa-sdk'); const APP_ID = undefined; // TODO replace with your app ID (OPTIONAL). const handlers = { 'LaunchRequest': function () { this.emit(':ask', 'いらっしゃいませ。何にしますか?'); }, 'BuyBreadIntent': function () { this.emit(':tell', 'ありがとうございます!今日は気分がいいので全部100円でいいです。'); }, 'AMAZON.HelpIntent': function () { this.emit(':ask', 'パン屋さんです。パンを注文できます。何にしますか?'); }, 'AMAZON.CancelIntent': function () { this.emit(':tell', 'またご来店くださいね。'); }, 'AMAZON.StopIntent': function () { this.emit(':tell', 'またご来店くださいね。'); }, }; exports.handler = function (event, context) { const alexa = Alexa.handler(event, context); alexa.APP_ID = APP_ID; // To enable string internationalization (i18n) features, set a resources object. alexa.registerHandlers(handlers); alexa.execute(); };
保存したら[Alexa Skill Kit]に繋がるようにトリガーを設定します。トリガーから「トリガーを追加」を選択し[Alexa Skill Kit]を選択します。
最後にARNをコピーします。
Service Simulatorでテスト
開発者ポータルに戻り、設定のサービスエンドポイントをLambdaにして、「デフォルト」の欄に先程コピーしたARNを入れます。
他の設定はそのままで「次へ」をクリックします。
テストの画面が出たら「サービスシミュレーター」の欄に、先程設定したサンプル発話を入れ「パン屋さんを呼び出す」をクリックします。成功していれば右下の枠にAlexaからの答えが返ってきます。「聴く」ボタンを押すと実際に音声で流れます。
同じように元々入っていたインテントであるHelpIntentやCancelIntentに繋がっている発話を入力すると、それに対応した答えが返ってきます。
簡単ですね!
まとめ
いかがでしたでしょうか。Alexa Skill Kitはやってみると実は意外と簡単です。今回はこれらスキルの作り方が習得できるトレーニング動画やブログをクラスメソッドで作成しています!
これから順次公開されていきますので是非そちらもご覧になって下さい。
また初心者向けにハンズオンなども行いますので、ブログをチェックしてくださいね!
相談会やります。
「なるほどー。おもしろいねー音声認識。で、儲かるの?」という方へ、実際にビジネスにAlexaを導入するにはどんなスキルが良いのか、というような相談会を大々的に、大々的にやります!!
「Alexaって何?」にお答えする説明会を開催します!11/9(木)〜11/22(水)でほぼ毎日開催!|クラスメソッドブログ
どんなスキルがウケるのか、これから音声認識をつかって世の中はどう変わっていくのか、という最新情報をキャッチアップしたい方はぜひぜひお越しください。