1. Amazon AlexaとFire TVでHello Worldを試してみる


前回まではiPhoneのアプリでAlexaと繋いで試していたんですが、やっぱりハードウェアが無いとモチベーション上がらないんです。

Amazon Alexa 事始め - Qiita

でも、未だにAmazon Echo関連製品が国内では発売されていません。
しかし先日、Amazon Fire TVがAlexaに対応していることを知りました。
ということでFire TVを購入してHello Worldを試してみました。

連載記事

前後関係があるため順番に読んでもらえると分かりやすくなっています。

1. Amazon AlexaとFire TVでHello Worldを試してみる - Qiita
2. Amazon Alexaで音声から引数を受け取る - Qiita
3. Amazon AlexaのCustom Slot Typesを設定する - Qiita
4. Amazon AlexaからHerokuのRailsにつなぐ - Qiita
5. Amazon Alexaで会話を続ける(セッションを引き継ぐ) - Qiita
6. Amazon Alexa のスキルを日本語化する - Qiita
7. 自作した日本語のAlexa SkillをEcho dotで動かす - Qiita

はじめに

今回は下記の様な構成です。
Fire TVに「tell hello world say hello」と声で指示をだします。
その結果をLambdaで処理してFire TVに返してFire TVに発声させます。
また今回の手順ではAmazonのUSアカウントが必要です。

Hello world

今回はAmazonが提供しているAlexaのHello worldのnode.js版を利用します。
git cloneでファイルを持ってきます。

git clone [email protected]:alexa/skill-sample-nodejs-hello-world.git

取得ソースの/src/index.jsがLambda側で処理するプログラムです。
Alexaから HelloWorldIntent が呼び出され this.emit(':tell', 'Hello World!'); で結果として返すテキストを指定しています。

#index.js
'use strict';
var Alexa = require("alexa-sdk");

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.registerHandlers(handlers);
    alexa.execute();
};

var handlers = {
    'LaunchRequest': function () {
        this.emit('SayHello');
    },
    'HelloWorldIntent': function () {
        this.emit('SayHello')
    },
    'SayHello': function () {
        this.emit(':tell', 'Hello World!');
    },
};

Lambdaを作る

先程、取得したindex.jsをZIPで圧縮してLambdaに登録できるようにします。
下記のコマンドを実行します。

cd skill-sample-nodejs-hello-world/src/
npm install --save alexa-sdk
zip -r helloWorld.zip index.js node_modules

AWS Lambdaを開き、「一から作成」を選択。

「Alexa Skills Kit」を選択して「次へ」

名前には任意の名前を入力します。今回は「helloWorld」としました。
ランタイムは「Node.js 4.3」を選択。
コードエントリータイプは「.ZIPファイルをアップロード」を選択して、関数パッケージに先程圧縮したZIPファイルを選択。

ハンドラは「index.handler」そのまま。
ロールを「テンプレートから新しいロールを作成」を選択。
ロール名に適当な名前を入力します。今回は「lambdaRole」としました。
そして「次へ」

確認画面で先程設定した内容になっているか確認して「関数の作成」

Lambdaの右上のarnは後ほどAlexaの接続先として設定するので控えておきます。

Alexa Appを作る

Amazon Developer Consoleのログインします。

「Alexa Skills Kit」を選択。

「Add a New Skill」を選択。

Skill Typeに「Custom Interaction Model」を選択。
Languageに「English(U.S.)」を選択。
Nameには任意の名前を入れます。今回は「Hello world」としました。
Invocation Nameに「hello world」と入力します。Invocation NameはAlexaに音声で指示する時のアプリ名になります。
「Alexa tell hello world ...」という風に「tell」の後にInvocation Nameに設定したアプリ名を指示するとAlexaのアプリが起動します。
「save」して「Next」を選択

Intent Schemaに下記のように入力します。
これはどういったIntentがあるかの定義になります。
今回は index.js に書かれた HelloWorldIntent という名前のIntentが定義されているということです。

{
  "intents": [
    {
      "intent": "HelloWorldIntent"
    }
  ]
}

Sample Utterancesには下記のように入力します。
Utterancesは入力音声に紐づくIntentのセットを表しています。
「Hello」「say hello」「say hello world」と話しかけると「HelloWorldIntent」が呼び出すという組み合わせを指定します。

HelloWorldIntent hello
HelloWorldIntent say hello
HelloWorldIntent say hello world

Endpoinには「AWS Lambda ARN (Amazon Resource Name)」を選択
DefaultにはLambda作成時に控えたarnを入力します。
「Next」を選択

これでAlexa Appも完成したのでAlexaからLambdaを正しく呼び出せるか確認します。
HTTPS endpointに設定したarnが選択されていることを確認。
Enter Utteranceに「hello」と入力して「Ask Hello World」を押すとService Responseが返ってきます。

Service Responseの中の<speak> Hello World! </speak> の部分がFire TVが話す部分です。

"outputSpeech": {
  "ssml": "<speak> Hello World! </speak>",
  "type": "SSML"
},

それでは実際にFire TVに話しかけて結果を喋らせてみましょう。
Fire TVもAmazon USアカウントでログインするとAlexaが利用できます。
"tell hello world say hello."と発話した動画はこちらです。(2回目発音が悪いのか正しく認識されていませんが。。。

Fire TVはAlexaを起動してリモコンのボタンを押して始めてAlexaに音声で指示が出せます。
しかし、Echo showなどは音声だけで操作ができます。
日本での発売が楽しみです。

参考

Amazon AlexaのCustom SkillのサンプルをService Simulatorで試してみる | Developers.IO
http://dev.classmethod.jp/cloud/aws/amazon-alexa-custom-skill-service-simulator/