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


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

[Amazon Alexa 事始め - Qiita](http://qiita.com/tochi/items/5a6a2098bb4017b06af8)

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

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

[1. Amazon AlexaとFire TVでHello Worldを試してみる \- Qiita](https://qiita.com/tochi/items/4da38b02b424926d1095)
[2. Amazon Alexaで音声から引数を受け取る \- Qiita](https://qiita.com/tochi/items/f96ca5979ec2ea6387d8)
[3. Amazon AlexaのCustom Slot Typesを設定する \- Qiita](https://qiita.com/tochi/items/a0342f0882b2c642d40c)
[4. Amazon AlexaからHerokuのRailsにつなぐ \- Qiita](https://qiita.com/tochi/items/183658fabd1416028065)
[5. Amazon Alexaで会話を続ける（セッションを引き継ぐ） \- Qiita](https://qiita.com/tochi/items/ec613355e4f5913a8755)
[6. Amazon Alexa のスキルを日本語化する \- Qiita](https://qiita.com/tochi/items/682adf708bb7fd0f1ca9)
[7. 自作した日本語のAlexa SkillをEcho dotで動かす \- Qiita](https://qiita.com/tochi/items/db9542e191bbdb7f77c2)

はじめに
---

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

![alexa.png](https://qiita-image-store.s3.amazonaws.com/0/4529/d0efd6b6-8e99-a565-22d1-0c0e8813e9f7.png "alexa.png")


Hello world
---

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

```
git clone git@github.com: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を開き、「一から作成」を選択。
![スクリーンショット_2017-08-27_16_54_35.png](https://qiita-image-store.s3.amazonaws.com/0/4529/91e09e3f-ef4e-cf4a-ec74-f5be5bd9a70a.png "スクリーンショット_2017-08-27_16_54_35.png")

「Alexa Skills Kit」を選択して「次へ」
![スクリーンショット_2017-08-27_16_56_31.png](https://qiita-image-store.s3.amazonaws.com/0/4529/836aa562-1748-afe6-a864-e08dfee56762.png "スクリーンショット_2017-08-27_16_56_31.png")

名前には任意の名前を入力します。今回は「helloWorld」としました。
ランタイムは「Node.js 4.3」を選択。
コードエントリータイプは「.ZIPファイルをアップロード」を選択して、関数パッケージに先程圧縮したZIPファイルを選択。
![スクリーンショット_2017-08-27_16_59_39.png](https://qiita-image-store.s3.amazonaws.com/0/4529/79625bec-bb91-b5f1-24ef-b99917037caf.png "スクリーンショット_2017-08-27_16_59_39.png")

ハンドラは「index.handler」そのまま。
ロールを「テンプレートから新しいロールを作成」を選択。
ロール名に適当な名前を入力します。今回は「lambdaRole」としました。
そして「次へ」
![スクリーンショット_2017-08-27_17_05_33.png](https://qiita-image-store.s3.amazonaws.com/0/4529/b74a69dc-b654-60d1-2ad4-14b89cf2a43a.png "スクリーンショット_2017-08-27_17_05_33.png")

確認画面で先程設定した内容になっているか確認して「関数の作成」
![スクリーンショット 2017-08-27 17.07.44.png](https://qiita-image-store.s3.amazonaws.com/0/4529/f58b5b7c-5079-b4d4-aa4a-da61e567ad97.png "スクリーンショット 2017-08-27 17.07.44.png")

Lambdaの右上のarnは後ほどAlexaの接続先として設定するので控えておきます。
![スクリーンショット_2017-08-27_17_12_00.png](https://qiita-image-store.s3.amazonaws.com/0/4529/7e23a2d1-33c0-98c4-0240-256f104c367e.png "スクリーンショット_2017-08-27_17_12_00.png")

Alexa Appを作る
----

[Amazon Developer Console](https://developer.amazon.com/ja/)のログインします。

「Alexa Skills Kit」を選択。
![スクリーンショット_2017-08-27_17_23_23.png](https://qiita-image-store.s3.amazonaws.com/0/4529/54a777d8-edef-28ce-e175-85fef4cda1d5.png "スクリーンショット_2017-08-27_17_23_23.png")

「Add a New Skill」を選択。
![スクリーンショット_2017-08-27_17_24_13.png](https://qiita-image-store.s3.amazonaws.com/0/4529/e68d6655-7bac-15ef-84f9-1eab3e17b0f0.png "スクリーンショット_2017-08-27_17_24_13.png")

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」を選択
![スクリーンショット_2017-08-27_17_41_20.png](https://qiita-image-store.s3.amazonaws.com/0/4529/3a3308a5-df69-67d0-ac38-9cdd1cf15ede.png "スクリーンショット_2017-08-27_17_41_20.png")

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
```

![スクリーンショット_2017-08-27_17_52_35.png](https://qiita-image-store.s3.amazonaws.com/0/4529/9fd22933-7aef-c1e2-5079-9ad65ced958c.png "スクリーンショット_2017-08-27_17_52_35.png")

Endpoinには「AWS Lambda ARN (Amazon Resource Name)」を選択
DefaultにはLambda作成時に控えたarnを入力します。
「Next」を選択
![スクリーンショット_2017-08-27_18_15_30.png](https://qiita-image-store.s3.amazonaws.com/0/4529/1cbf05ef-d90a-5a84-840b-97ce71c5fa8e.png "スクリーンショット_2017-08-27_18_15_30.png")

これでAlexa Appも完成したのでAlexaからLambdaを正しく呼び出せるか確認します。
HTTPS endpointに設定したarnが選択されていることを確認。
Enter Utteranceに「hello」と入力して「Ask Hello World」を押すとService Responseが返ってきます。
![スクリーンショット_2017-08-28_8_13_31.png](https://qiita-image-store.s3.amazonaws.com/0/4529/26193812-6b64-d016-581c-2fdd089aa05d.png "スクリーンショット_2017-08-28_8_13_31.png")

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回目発音が悪いのか正しく認識されていませんが。。。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">AlexaでHello world作ってみた。<a href="https://t.co/9EFxYkpLJJ">https://t.co/9EFxYkpLJJ</a></p>&mdash; tochi (@aguuu) <a href="https://twitter.com/aguuu/status/902311884157739008">2017年8月28日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

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/