Amazon Alexa(アマゾン・アレクサ)の日本語対応に首を長くして待ちわびていたエンジニアの方々も多いかと思いますが、私もその一人です!日本国内でAIスピーカーの販売開始が続々と決まり、とうとう本家(?)のAmazon Echo(アマゾン・エコー)の発売も開始となりました。
AIスピーカーですが、最大の強みは「Skill(スキル」にあると考えています。スマートフォンが世の中に出た時に、私は「アプリ」と言う仕組みに感銘を受けました。今まで電話やメールをして、少し音楽が聞けるくらいの「携帯電話」が、アプリの仕組みが出来たことで、オンラインショッピングが劇的に使いやすくなり、スケジュール管理や他のことまでも、気づけば携帯電話が中心となる生活に激変したのです。
AIスピーカーも同様のものになると信じています。今までは音楽を楽しむ機械が、「Skill」を身に付けることにより、劇的に便利なデバイスに変貌を遂げると確信しています。
さて、前置きが長くなりましたが、日本語対応をした「Alexa Skill Kit(アレクサ・スキル・キット)」を使って、アマゾン・エコー用のスキルの開発の仕方を見ていきましょう!
この記事の目次
今回作ってみるもの
今回はあくまで簡単な紹介をメインにしたいので、「触る」程度でやっていきましょう。このチュートリアルでは、「ショートジョークを返してくれるスキル」を作ってみましょう。
Alexaスキルの一番基本となる仕組み「カスタムスキル」を使って、AlexaサービスとAWS Lambdaを連携させてスキルを作ります。
なお、今回はまだ手元にAmazon Echoが届いていないので、Echo本機でのテストは行えませんので、Alexaサービス上でテストを行いましょう。(11月16日の現時点でまだ招待リクエストを送っている状態で、招待メールが私は届いていないです。。1日も早くEchoくんが届くことを祈ってます。)
Alexaスキルの種類と仕組み
まずは簡単にAlexaスキルの種類と仕組みについて説明します。すでにアメリカでは25,000を超えるスキルがエンジニアにより開発をされているAlexaスキルですが、主に3つの種類があります。
- カスタムスキル=汎用のスキル
- スマートホームスキル=家電などを制御に特化したスキル
- フラッシュブリーフィングスキル=ニュースや短いコンテンツを読み上げるスキル
Alexaに話しかけた内容を取得して、返答を返す汎用的なスキルがカスタムスキルと言われており、これが一番ベースのスキルとなります。他の2つのスマートフォームスキル、フラッシュブリーフィングスキルに関しては、専用のAPIが用意されていて、用途に特化した「専門」スキルという認識で大丈夫です。
さて次はAlexaの仕組みを簡単に紐解いていきましょう。
こちらですが、「カスタムスキル」の動きをまとめた図となります。流れとしては、下記となります。
- ユーザーがスピーカーに話しかける
- スピーカーがマイクで音声を拾って「Alexa Service」へ送る
- 「Alexa Service」が音声データを解析して外部データソースに実行命令を送る
- 外部データソースが音声データに基づいた処理を実行してAlexaサービスへ返答を返す
- Alexaサービスは「返答」に応じた音声データを作ってスピーカーへ送信
- スピーカーが音声データを再生してユーザーへ答える
大まかな仕組みとしては上記の流れとなります。今回は外部データソースをAWS Lambdaを使って作ります。
Alexaスキルを開発するための準備
さて、まず準備から始めましょう。今回ですが、下記の2つのサービスのアカウントが必要となります。
両方のサービスは無料または無料枠が用意されています。AWSの方は、確か無料枠が使えるのですが、クレジットカードの登録も必要となっているはずです。少し面倒ですが、Alexaスキルで遊ぶのに最低限Amazon Developerアカウントは必須となりますので、ぜひこの機会に登録しましょう。
早速、Alexaスキルを作ってましょう
Amazon DeveloperとAWSのアカウントの作成が完了したら、早速、Amazon Developerの開発者コンソールからAlexaスキルの作成や初期設定を行って見ましょう。
Amazon Developerへまずはログインをしていただいて、上部メニューから「Alexa」を選んでください。Alexaへ移動すると、下記の画面で「Alexa Skills Kit」の機能を作成することが可能です。
次の画面で「新しいスキルを追加する」をクリックしましょう。
さて、次はAlexaスキルの初期設定画面です。先述しましたが、今回は一番基礎となる「カスタムスキル」を使います。ですので、スキルの種類は「カスタム対話モデル」を選びましょう。
そして・・次は肝心です!長年待ちくたびれた人も多いと思いますが、とうとう日本語の選択オプションが!!言語の設定は「Japanese」を選びましょう!(涙)
スキル名ですが、今回は「ShortJoke」としました。また呼び出し名も「ショートジョーク」と設定しています。スキル名、呼び出し名共に、実際にAlexaスキルを公開する場合は重要な設定項目になります。本番開発の場合は、しっかりと吟味しましょう。
「グローバルフィールド」はデフォルトの設定のままで大丈夫です。設定の選択/入力が完了したら、「保存」をしてください。
スキルの設定が完了すると、左メニュー「スキル情報」のチェックマークが緑に変わっているのが確認できるかと思います。これで設定はばっちしです!
スキルビルダー(ベーダ版)で対話モデル作成
初期設定も無事に完了しましたので、次はAlexaサービス側でユーザーから話かけられた言葉を処理する対話モデルを作っていきましょう。
「対話モデル」のページで、下記の「スキルビルダーを起動する」をクリックしましょう。
クリックすると、スキルビルダーが立ち上がります。このビルダーですが、まだベータ版で使い勝手が少し判りづらいですが・・とりあえず今回は動かすのが目標なので、細かいところには目を瞑りましょう笑。
では、次に「インテント」を作りましょう。「インテント」については、まだ後日詳しい説明を行いますが、「ユーザーが話しかけた内容を汲み取ってコンピューターが理解できるリクエストへ関連づける」とざっくり覚えておきましょう。参考までにですが、英語のIntentは「目的」「意図」という意味です。
次の画面では、実際にインテントの追加が可能です。「Create a new custom intent」がデフォルトで選択されていますので、こちらに「TellJoke」というインテントを作成しましょう。
次に今追加した「TellJoke」にサンプル発話(Sample Utterances)を登録していきましょう。サンプル発話ですが、ユーザーが話しかける言葉(発話)を、特定のインテント(TellJoke)と紐付ける構造化された文字列と考えてください。
Amazon Dotへの話しかけ方は、それこそ人それぞれですよね。「冗談言って」「面白いこと言って」「笑わせて」などなど。このサンプル発話では、このようなユーザーの支持の「揺れ」を予め想定して登録させておくことで、Alexaがよりユーザーが意図をしている支持を汲み取りやすくしてくれます。
また、サンプル発話に登録されていなくてもAlexaが学習をして「TellJoke」のインテントへ紐付けをしてくれます。ただ、これはあくまでAlexaの学習精度によります。実際にどれくらいの精度で紐付けを行ってくれるのかは判りませんので、サンプル発話は思いつく限り、登録をしておくべきでしょう。
登録したサンプル発話
- ジョークを言って
- ジョークを教えて
- 笑たい
- 笑わせて
- 冗談教えて
- 冗談言って
上記の6つしか登録を私はしませんでしたが、まだ思いつくサンプル発話がありましたら、登録をして見てください。登録が完了したら「Save Model」(モデルを保存)をクリックした後に「Build Model」(モデル構築)を行いましょう。
モデルの構築が完了したら、「Configuration」をクリックしてAlexaスキルの画面へ戻りましょう。
次はAWS Lambdaを作りましょう
さて、一旦Alexaスキルの方が置いときましょう。次はAWS Lambdaの設定と作成を行います。AWSアカウントへログインをして、Lambdaのサービス画面へ移動しましょう。
リージョンはどこでも大丈夫なのですが、私は「アジアパシフィック(東京)」を今回使っています。同等の設定をご希望の方は、東京リージョンへ設定を行いましょう。
リージョンの確認が出来たら、次は「関数の作成」をクリックしましょう。下記のような「設計図」の選択画面へ遷移するかと思います。
フィルターの追加の検索窓に「alexa」と入力すると、Alexa関連の設計図が絞り込まれます。その中から、「alexa-skill-kit-sdk-factskill」(nodejs6.10・alexa)のリンクをクリックしましょう。この設計図を使って、関数作成の画面へ遷移します。
次に関数の基本情報の設定となります。「名前」の欄に「telljoke」と入力して、ロールを「カスタムロールの作成」をクリックしましょう。
カスタムロールの作成をクリックすると、ロール作成画面のタブが新規に立ち上がります。特に編集は必要ありませんので、右下にある「許可」をクリックしましょう。
最後に関数の作成の最終確認画面へ遷移します。最下部にある「関数の作成」をクリックすれば、関数の作成は完了です。
Lambdaの関数 – トリガーと関数コード
無事にLambdaの関数の作成は出来ましたでしょうか?関数が作成されていると、下記の画面へ遷移しているかと思います。
次はこの作成したばかりのAWS Lambdaの関数とAlexa Skill Kitが連携できるように「トリガー」の設定を行います。
「トリガー」のタブをクリックすると、トリガー設定画面が出てきます。こちらの画面の、「トリガー追加」をクリックしてください。
トリガーの追加ポップアップが出てきますので、検索窓に「alexa」と入力をしてください。「Alexa Skills Kit」と「Alexa Smart Home」の2つのトリガーオプションが出てきます。「Alexa Skills Kit」を選択して「送信」をしましょう。
さて、次は関数のコードを書いていきましょう。関数を作成した際に「設計図」を使ったので、すでにコードが入っているかと思います。よりシンプルに理解しやすくするため、すでに入っているコードを全て消して、下記のコードを入力しましょう。
5行目のAPP_IDですが、Amazon Developersにて確認が可能なので、IDとundefinedの差し替えをお願いします。
'use strict'; const Alexa = require('alexa-sdk'); const APP_ID = 'undefined'; // TODO replace with your app ID. const handlers = { 'LaunchRequest': function () { this.emit(':ask', 'あなたを笑わせるために頑張ります!'); }, 'TellJoke': function () { this.emit(':tell', '日本人は同じジョークで3度笑う。1度目は聞いたとき。意味は分からないが人に合わせて笑う。2度目は意味を聞いたとき。まだ意味が分からないが教えてくれた人のために笑う。3度目は意味を理解したとき。家で笑う'); }, '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(); };
コードの入力とAPP_IDの差し替えが完了したら、画面上部の「保存」をクリックしましょう。
AWS Lambdaでの最終ステップです。画面上部にあるAmazonリソースネーム(ARN)をコピーしておきましょう。次のステップで使います。
Alexaスキルの設定(Lambdaとの連携)
無事にAWS Lambdaの関数の作成も終えたので、またAlexaスキルのコンソールへ戻りましょう。次のステップはAlexaスキルとAWS Lambdaの連携の設定を行います。
Skillコンソールの右メニューで「設定」を選ぶと下記のような画面に遷移します。サービスエンドポイントのタイプを「AWS LambdaのARN」を選択しましょう。選択をすると、「デフォルト」という入力欄が出てきますので、こちらに先ほどコピーしておいた、AWS LambdaのARNを貼り付けましょう。
他の設定は特に変更は必要ありませんので、そのまま「次へ」をクリックします。画面が「テスト」へ遷移します。設定に問題がなければ、右メニューの「設定」にも緑色のチェックマークがつきます。
「テスト」のページで、アカウントのテストが無効となっている場合は、スライダーをクリックして「有効」へ変更をしましょう。
有効に変更すると、下にテスト用のシュミレーターが出てきます。いよいよ、Alexaスキルで設定をした内容と、AWS Lambdaで書いたコードをテストすることが出来ます!
では早速、試してみましょう!「サービスシュミレーター」の「発話を入力してください」へ「ジョークを言って」と入力して、ShotJokeを読み出すをクリックしましょう。
そうすると、下のサービスレスポンスにAlexaスキルからのレスポンスが表示されます。
{ "version": "1.0", "response": { "outputSpeech": { "ssml": "<speak> 日本人は同じジョークで3度笑う。1度目は聞いたとき。意味は分からないが人に合わせて笑う。2度目は意味を聞いたとき。まだ意味が分からないが教えてくれた人のために笑う。3度目は意味を理解したとき。家で笑う </speak>", "type": "SSML" }, "speechletResponse": { "outputSpeech": { "ssml": "<speak> 日本人は同じジョークで3度笑う。1度目は聞いたとき。意味は分からないが人に合わせて笑う。2度目は意味を聞いたとき。まだ意味が分からないが教えてくれた人のために笑う。3度目は意味を理解したとき。家で笑う </speak>" }, "shouldEndSession": true } }, "sessionAttributes": {} }
ちゃんとジョークを言ってくれますね(笑)!さらにサービスレスポンスの下にある「聴く」のアイコンをクリックすると、今回設定をしたジョークをAlexaが話してくれます。
まとめ
いかがでしたでしょうか?複数のプラットフォームを使ったので、複雑なように感じますが、実際にやっていることはシンプルですね!今回はAlexa Skill Kit(アレクサ・スキル・キット)をAWS Lambdaに連携させて、簡単なアマゾン・エコーのスキルを作ってみました!
より実践的なスキル開発も今後、取り上げていきます!