// 下階層用テンプレート #topicpath ---- //ここにコンテンツを記述します。 #contents Amazon Echoに搭載されてるAmazon Alexaは、スキルという仕組みを使うことで、自前のプログラムをEcho上で走らすことができます。 Amazon Echo経由で呼び出されたAmazon Alexaのスキルからは、AWS Lambdaの関数を呼び出せるので、そこにロジックを書いていくわけですね。 **やってみる [#ecd1c214] 実際に、[[Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発 : Alexa Blogs>https://developer.amazon.com/ja/blogs/alexa/post/6e716e5c-55b0-445b-b936-9cfac4712e7b/training-1]] ここの情報ほぼそのままなんですが、Amazon EchoからAWS Lambdaの関数を呼び出してみようと思います。 AWS/Amazon Developer Servicesアカウント作成メモ で作成したアカウントで https://developer.amazon.com/ からログインし、右上のDeveloper Consoleを選択。Devloper Consoleが表示されたら上部メニューの「ALEXA」を選択します。 #ref(IMG_3741.png_new.png) Alexa Skills Kit を選択。 #ref(IMG_3742.png_new.png) ***呼び出し名の定義 [#o390e5d1] 右上の「新しいスキルを追加する」を選択 #ref(IMG_3743.png_new.png) 言語やスキル名、呼び出し名を指定して、保存をクリック。 #ref(IMG_3745.png_new.png) スキル名: HelloWorld 呼び出し名: うちゅうのまめちしき としました。これで「アレクサ、宇宙の豆知識を開いて」みたいにアプリを起動することができるようになります。 *** インテントスキーマの設定 [#o34b3b0e] いわゆる呼び出すメソッドを定義します。 下記のように「GetNewFactIntent」というメソッドを定義してみます。 #ref(IMG_3746.png_new.png) { "intents": [ { "intent": "GetNewFactIntent" }, { "intent": "AMAZON.HelpIntent" }, { "intent": "AMAZON.StopIntent" }, { "intent": "AMAZON.CancelIntent" } ] } って定義しました。インテント名: GetNewFactIntent ってのはこのあと出てくる「サンプル発話」で日本語に関連付けられます。 インテント名には引数とかその他の設定もあるのですが、今回はこのままで。 って定義しました。インテント名: GetNewFactIntent ってのは、いまココで定義したモノで、このあと出てくる「サンプル発話」で日本語に関連付けられます。その他のインテントはあらかじめAmazonが用意してあるビルトインされたインテントです。 ちなみにインテントスキーマについては インテントの設定には引数などその他の項目もあるのですが、今回はいったんこのままで。 ちなみにインテントのスキーマについては -[[音声インターフェースを定義する | Custom Skills>https://developer.amazon.com/ja/docs/custom-skills/define-the-interaction-model-in-json-and-text.html#h2_sample_utterances]] この辺に整理されていて、そこには { "intents": [ { "intent": "GetHoroscope", "slots": [ ↓ GetHoroscope ってインテントはSignとDateっていう引数を持つって意味 { "name": "Sign", "type": "LIST_OF_SIGNS" }, ←型が LIST_OF_SIGNS っていうカスタム型 { "name": "Date", "type": "AMAZON.DATE" } ←型が ビルトインのAMAZON.DATE 型 ] }, { "intent": "GetLuckyNumbers" } ] } こんな感じのサンプルがあります こんな感じの、引数を定義した場合のサンプルがあります。 ***サンプル発話の設定 [#fd764b0b] サンプル発話に以下のように定義します。サンプル発話を指定することで、先のインテント名を日本語に関連付けます。 「サンプル発話」の欄は以下のように定義します。 #ref(IMG_3747.png_new.png) GetNewFactIntent 豆知識 GetNewFactIntent 豆知識を教えて GetNewFactIntent 他の豆知識 GetNewFactIntent 雑学 GetNewFactIntent 雑学を教えて GetNewFactIntent 他の雑学 GetNewFactIntent 知識 GetNewFactIntent 何か GetNewFactIntent 何か教えて としました。 上記のようにサンプル発話を指定することで、先の GetNewFactIntent などのインテント名を日本語に関連付けます。 サンプル発話の仕様についても、先とおなじサイトに説明があって -[[音声インターフェースを定義する | Custom Skills>https://developer.amazon.com/ja/docs/custom-skills/define-the-interaction-model-in-json-and-text.html#h2_sample_utterances]] ココをみると GetHoroscope {Sign} の運勢を教えて GetHoroscope {Sign} の {Date} の運勢を教えて というようにインテントの定義で定義したSign/Date などをプレースホルダとして指定することが出来るようですね。 というように、インテントの定義で定義したSign/Date などの引数をプレースホルダとして指定することが出来るようですね。 *** ロジックを記述したLambdaのアップロード [#z7ee9758] つづいてAlexaが起動した後に実際に動くビジネスロジックを設定しますが、今回は参考にしているサイトにあるLambda関数を使用します。具体的には、 https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/jp/tutorials/fact/lambda.zip をあらかじめダウンロードしておき、任意のAWSのアカウントにこのLambda関数をアップロードしておけばOKです。 #ref(lambda.png) 上記のキャプチャのように、Lambda関数のARN名が arn:aws:lambda:ap-northeast-1:422641601508:function:MyFactSkill であることを確認しておきます。 ちなみにこのLambda関数(index.js)はだいたい以下の通りになっているようです。 'use strict'; var Alexa = require('alexa-sdk'); ... 割愛 var data = [ "水星の一年はたった88日です。", "金星は水星と比べて太陽より遠くにありますが、気温は水星よりも高いです。", "金星は反時計回りに自転しています。過去に起こった隕石の衝突が原因と言われています。", "火星上から見ると、太陽の大きさは地球から見た場合の約半分に見えます。", ... "月は毎年3.8cm地球から離れていっています。" ]; exports.handler = function(event, context, callback) { var alexa = Alexa.handler(event, context); alexa.APP_ID = APP_ID; alexa.registerHandlers(handlers); alexa.execute(); }; var handlers = { 'LaunchRequest': function () { this.emit('GetNewFactIntent'); }, 'GetNewFactIntent': function () { var factArr = data; var factIndex = Math.floor(Math.random() * factArr.length); var randomFact = factArr[factIndex]; var speechOutput = GET_FACT_MESSAGE + randomFact; this.emit(':tellWithCard', speechOutput, SKILL_NAME, randomFact) }, 'AMAZON.HelpIntent': function () { var speechOutput = HELP_MESSAGE; var reprompt = HELP_REPROMPT; this.emit(':ask', speechOutput, reprompt); }, 'AMAZON.CancelIntent': function () { this.emit(':tell', STOP_MESSAGE); }, 'AMAZON.StopIntent': function () { this.emit(':tell', STOP_MESSAGE); } }; *** 動くロジックの指定 [#r503bb95] サンプル発話の設定 で「次へ」をクリックしたら、次は実際に動くロジックを指定します。先ほどAWS Lambda のARNを確認しておいたので、そのARN名を指定して「次へ」を選びます。 #ref(IMG_3748.png_new.png) ***テストしてみる [#p8c6de65] 次画面で、実際にLambdaのロジックを呼び出したらどうなるかをテストすることが出来ます。 下記画面の サービスシミュレータの「発話を入力してください」のテキストボックスに「宇宙の豆知識を開いて」と入力し「HelloWorldを呼び出す」ボタンをクリックすると、実際にLambdaの関数を呼び出した結果が出力されます。 #ref(IMG_3749.png_new.png) ***その他公開情報の設定 [#hb847531] Echo上でスキルを公開するための情報を記載します。下の図のように、Alexaのスキル一覧のどのカテゴリに表示させるかとか、スキルのアイコンになるアイコン画像などを指定します。 #ref(IMG_3753.png_new.png) #ref(IMG_3754.png_new.png) ***プライバシーとコンプライアンス [#g7593ced] 下の図のように、プライバシーとコンプラに関する情報を設定します。最後に「保存」ボタンを押せば完了です。 #ref(IMG_3755.png_new.png) ***まとめ [#q4d3b01f] 以上で、スキルの定義からAWs Lambda関数の紐付け、またドライバ(テスト画面)から起動、最後に公開情報の登録までが完了です。 ちなみに、これまで入力していた情報がもれなく入力されていると、左のメニュー部のチェック(緑のチェック)がすべて緑になり、またおなじくメニュー部の「Skills Beta Testing」のステータスが「まだ利用できません」から「開始されていません」にかわります。ここまで行うと実機でのテストが出来るようになりますが、それはまたあらためて説明します。 #ref(IMG_3756.png_new.png) **関連リンク [#j7d38c18] -[[Alexa | アレクサ | Alexaスキル開発トレーニング>https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill]] まずはコレをやる -[[開発中のAlexaスキルを実機テストする方法 - Qiita>https://qiita.com/hayao_k/items/a13b0c9327c49934eda3]] 仕様がころころかわるからか、実機テストするにはもうひと頑張り必要でした。参考になりました! -[[カスタムスキルのAWS Lambda関数を作成する | Custom Skills>https://developer.amazon.com/ja/docs/custom-skills/host-a-custom-skill-as-an-aws-lambda-function.html]] 公式 -[[スキルのテストがシミュレーター「Echosim.io」で可能になりました : Alexa Blogs>https://developer.amazon.com/ja/blogs/alexa/post/183200a2-1668-4831-aa8f-69f676e07957/echosim-io]] 試してないけど実機検証に近いことができるぽい -[[日本語のAlexaスキルの作り方(30分あればAmazon Echoがなくても試せるよ) - KAYAC engineers' blog>http://techblog.kayac.com/lets-make-alexa-skill-2017]] -[[Amazon Echo (Alexa) のSkillの開発に必要な基本概念を押さえる - Qiita>https://qiita.com/chroju/items/3f30fe424df36e4b4d80]] -[[Alexa Skill 開発メモ 開発用Amazonアカウント用意と、Alexa.appの入手方法 - Qiita>https://qiita.com/sitopp/items/1704c338206be7ebfced]] ---- この記事は #vote(おもしろかった,そうでもない) #comment #topicpath SIZE(10){現在のアクセス:&counter;}