Alexaスキル 開発チュートリアル

# 1. はじめに

---

## 参考文献
今回のAlexaスキル開発チュートリアルは、以下のサイトを参考に、2018年3月時点の開発環境（Alexa Skills Kit SDK for Node.js(V6.10) Version 1）にまとめ直したものとなります。

- [Alexaスキル開発トレーニング](https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill#%E7%AC%AC1%E5%9B%9E%20%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E9%96%8B%E7%99%BA)
- [Alexa 豆知識スキルの作成](https://github.com/alexa/skill-sample-nodejs-fact/tree/ja-JP)

---
## Note

- 2018年10月16日現在、Alexa Blog（公式）に「[Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発](https://developer.amazon.com/ja/blogs/alexa/post/6e716e5c-55b0-445b-b936-9cfac4712e7b/training-1)」が更新され、Alexa Skills Kit SDK for Node.js(V8.10) Version 2 として掲載されております。こちらも、あわせてご参照ください。

---

## このスライドを見てできること
- Amazon開発者コンソールが理解できる。
- AWS Lambdaが理解できる。
- Alexaスキルのテストができるようになる。
- Alexaスキルが作成できるようになる。

---

## 今回作成するAlexaスキル

- スキル名：とっさの豆知識

```text:トークシナリオ
ユーザー：「アレクサ、<とっさの豆知識>を開いて。」
アレクサ：「知ってましたか？
           水星の一年はたった88日です。 」

```

---

# 2. 事前準備・開発環境

---
## 事前準備

- Amazon Developerアカウントの用意
- AWSアカウントの用意
- IAMロールの用意（[Setting Up Your First Lambda Role](https://github.com/alexa/alexa-cookbook/blob/master/guides/aws-security-and-setup/lambda-role.md) を参照）
- ZIPファイルの入手（https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/jp/tutorials/fact/lambda.zip ）

---

## 必要なソフトウェア

- ブラウザ：Firefox（推奨）
- エディタ：Visual Studio Code（推奨）

---

## 必要な開発環境

- マイク＆スピーカが利用できるパソコン
- インターネット（Wi-Fi）

---

# 3. アカウントの用意

---


## Amazon Developerアカウントの用意

- [Amazon Developer Portal](https://developer.amazon.com/ja/) ログイン用の、アカウントを用意する必要があります。
- アカウントをお持ちでない方は、こちらのページ（[失敗しないAlexa開発者アカウントの作り方](https://dev.classmethod.jp/voice-assistant/how-to-safety-create-alexa-developers-account/)）の手順を参考に、作成してください。
- [Amazon.co.jpアカウント](https://www.amazon.co.jp/)の使用をおすすめします。

---

## AWSアカウントの用意

- https://aws.amazon.com/jp/register-flow/ にて、アカウントを作成する必要があります。
- アカウントをお持ちでない方は、こちらのページ（[AWS アカウント作成の流れ](https://aws.amazon.com/jp/register-flow/)）の手順を参考に、作成してください。

---

# 4. Alexaスキルの作成

---

## Amazon開発者コンソール

1. 「[Amazon開発者コンソール](https://developer.amazon.com/ja/)」を開く。
2. 「Developer Console」をクリックする。
![スクリーンショット (28).png](https://qiita-image-store.s3.amazonaws.com/0/240522/7c4c8aaf-b5ef-d3c3-59a6-d99ffeb63ef1.png)

---

## Amazon開発者コンソール

- 「ログイン」する。
![スクリーンショット (29).png](https://qiita-image-store.s3.amazonaws.com/0/240522/673f1825-db5a-8443-b506-064f49bc11ae.png)

---

## Amazon開発者コンソール

- 「ALEXA」をクリックする。
![スクリーンショット (30).png](https://qiita-image-store.s3.amazonaws.com/0/240522/d39c9dba-34e3-b58d-a068-75f22c295cd7.png)

---

## Amazon開発者コンソール

- 「Alexa Skills Kit」の「始める」ボタンをクリックする。
![スクリーンショット (31).png](https://qiita-image-store.s3.amazonaws.com/0/240522/e58fdadf-1d81-80e6-2047-24824ed5afde.png)

---

## Amazon開発者コンソール

- 「スキルの作成（Create Skill）」ボタンをクリックする。
![スクリーンショット (32).png](https://qiita-image-store.s3.amazonaws.com/0/240522/ffb9dba0-9611-7c80-b942-47bc5bf6d434.png)

---

## Amazon開発者コンソール

1. 「スキル名（SkillName）」を入力する。
2.  言語を「日本語（Japanese）」に変更する。
3.  「次へ（Next）」ボタンをクリックする。
![スクリーンショット (35).png](https://qiita-image-store.s3.amazonaws.com/0/240522/b9b4ed06-1339-f2a1-1d5b-34ef23158549.png)

---

## Amazon開発者コンソール

1. 「カスタム（Custom）」スキルを選択する。
2.  「スキル作成（Create Skill）」ボタンをクリックする。
![スクリーンショット (37).png](https://qiita-image-store.s3.amazonaws.com/0/240522/a953bdc1-d357-b873-dafe-e15e91b4add4.png)

---

## Amazon開発者コンソール

- 「1. 呼び出し名（Invocation Name）」をクリックする。
![スクリーンショット (38).png](https://qiita-image-store.s3.amazonaws.com/0/240522/e1fe10c1-0cc8-89d9-c591-bc570da97463.png)

---

## Amazon開発者コンソール

1. 「スキル呼び出し名（Skill Invocation Name）」を入力する。
2. 「モデルを保存（Save Model）」ボタンをクリックする。
3. 「ビルド（Build）」をクリックして戻る。
![スクリーンショット (39).png](https://qiita-image-store.s3.amazonaws.com/0/240522/7f0144f4-0f6d-0770-f0f9-ac2e148d6d09.png)

---

## Amazon開発者コンソール

- 「2. インテント、サンプル、スロット（Intents, Samples, and Slot）」をクリックする。
![スクリーンショット (40).png](https://qiita-image-store.s3.amazonaws.com/0/240522/5993da5b-6656-fcec-8182-d5d1446a016e.png)

---

## Amazon開発者コンソール

1. 「インテント名（GetNewFactIntent）」を入力する。
2. 「カスタムインテントを作成（Creatte Custom Intent）」ボタンをクリックする。
![スクリーンショット (41).png](https://qiita-image-store.s3.amazonaws.com/0/240522/1c8ac44c-8142-6626-97cc-77b306d05304.png)

---

## Amazon開発者コンソール

1. 「サンプル発話『豆知識を教えて』」を入力する。
2. 「モデルを保存（Save Model）」ボタンをクリックする。
3. 「ビルド（Build）」をクリックして戻る。
![スクリーンショット (42).png](https://qiita-image-store.s3.amazonaws.com/0/240522/d17eed6f-2b4f-4f5d-f7d8-bc1eca1a22b9.png)

---

## Amazon開発者コンソール

- 「3. モデルをビルド（Build Model）」をクリックする。
![スクリーンショット (43).png](https://qiita-image-store.s3.amazonaws.com/0/240522/617c3a16-9650-c00f-1873-7b2e0c0b49f2.png)

---

## Amazon開発者コンソール

- 「ビルドの成功」を確認する。
![スクリーンショット (44).png](https://qiita-image-store.s3.amazonaws.com/0/240522/f7bc0c36-6034-9b73-1d38-f6e5c17dc529.png)

---

# 5. Lambda関数の作成

---

## AWS Lambda

1. 「AWS」（https://console.aws.amazon.com/ ）サインイン画面を開く。
2. 「12桁のアカウントID」または「Eメールアドレス」を入力する。
3. 「次へ」ボタンをクリックする。
![スクリーンショット (46).png](https://qiita-image-store.s3.amazonaws.com/0/240522/30e37442-4e5e-122b-500a-01f3fb3815e3.png)

---

## AWS Lambda

1. 必須項目を入力する。
2. 「サインイン」ボタンをクリックする。
![スクリーンショット (45).png](https://qiita-image-store.s3.amazonaws.com/0/240522/250b176c-86b5-b58a-6604-0f09d161daba.png)

---

## AWS Lambda

- 「Lambda」を検索し、クリックする。
![スクリーンショット (47).png](https://qiita-image-store.s3.amazonaws.com/0/240522/ed33e60d-6a49-f858-6696-20afd7665f66.png)

---

## AWS Lambda

- リージョンが「東京」であることを確認する。
![スクリーンショット (48).png](https://qiita-image-store.s3.amazonaws.com/0/240522/1efed3c3-2c9d-3f9f-ec60-3688717580c0.png)

---

## AWS Lambda

- 「関数の作成」ボタンをクリックする。
![スクリーンショット (49).png](https://qiita-image-store.s3.amazonaws.com/0/240522/23f836fe-fcc2-76f1-7e63-8c7256580eff.png)

---

## AWS Lambda

1. 「設計図」を選択する。
2. 検索キーワードに「alexa」を入力し、Enterキーを押下する。
![スクリーンショット (50).png](https://qiita-image-store.s3.amazonaws.com/0/240522/a0f31fac-0bd1-dd8c-31a4-d208ac447cc9.png)

---

## AWS Lambda

1. 「alexa-skill-sdk-facttskill」を選択する。
2. 「設定」ボタンをクリックする。
![スクリーンショット (51).png](https://qiita-image-store.s3.amazonaws.com/0/240522/e787697a-c985-7467-7cca-1e6ac36750c0.png)

---

## AWS Lambda

1. 「関数の名前（FactSkill）」を入力する。
2. 「ロール」を設定する。
![スクリーンショット (52).png](https://qiita-image-store.s3.amazonaws.com/0/240522/5040870a-dc2d-1736-2b92-a1a0b87d92af.png)

---

## IAMロールが未設定の場合

- Lambda関数用のIAMロールが未設定の場合は、[初めてLambda用ロールを作成する場合の手順](https://github.com/alexa/skill-sample-nodejs-fact/blob/ja-JP/lambda-role.md)を参考に作成してください。
- IAMロールには、Lambda と CloudWatch の権限を付与してください。

---

## AWS Lambda

- 「関数の作成」ボタンをクリックする。
![スクリーンショット (53).png](https://qiita-image-store.s3.amazonaws.com/0/240522/08a3fc7c-2ca1-70a1-1fee-a3bdf25d89a4.png)

---

## AWS Lambda

- トリガーの追加から「Alexa skills Kit」をクリックする。
![スクリーンショット (54).png](https://qiita-image-store.s3.amazonaws.com/0/240522/35a2c099-6d15-27e9-120f-bb97d7acc2e3.png)

---

## AWS Lambda

- トリガーに「Alexa skills Kit」が設定されたことを確認する。
![スクリーンショット (55).png](https://qiita-image-store.s3.amazonaws.com/0/240522/2b4d24b8-b5c9-d988-1b0c-91e5df61abd8.png)

---

## Amazon開発者コンソール

- 「あなたのAlexaコンソール」から、「スキル（新しいコンソール）」を選択する。
![スクリーンショット (57).png](https://qiita-image-store.s3.amazonaws.com/0/240522/8e128799-c28d-4ae9-80bd-07022a1b294b.png)

---

## Amazon開発者コンソール

- 「View Skill ID」をクリックし、「Skill ID」をコピーする。
![スクリーンショット (58).png](https://qiita-image-store.s3.amazonaws.com/0/240522/47705f34-428c-b16e-dab9-51e0641dd358.png)

---

## AWS Lambda

1. スキルのID検証に、Amazon開発者コンソールでコピーした「Skill ID(アプリケーションID）」をペーストする。
2. 「追加」ボタンをクリックする。 
![スクリーンショット (56).png](https://qiita-image-store.s3.amazonaws.com/0/240522/a1349901-8d86-a7e2-964a-f81aa33b0b7b.png)

---

## AWS Lambda

- 「保存」ボタンをクリックする。 
![スクリーンショット (59).png](https://qiita-image-store.s3.amazonaws.com/0/240522/7aa63f9c-c2fe-2201-1c46-662797dedbb7.png)

---

## 日本語版 ZIPファイル

- ZIPファイル（https://m.media-amazon.com/images/G/01/mobile-apps/dex/alexa/alexa-skills-kit/jp/tutorials/fact/lambda.zip ）を入手する。（ファイルサイズ：5.6MB）
- このZIPファイルは、「alexa-skill-sdk-facttskill」の日本語版となります。

---

## 日本語版 ZIPファイル

- ZIPファイルを解凍する。（所要時間：1分）
![zip1.png](https://qiita-image-store.s3.amazonaws.com/0/240522/41936eda-f9b4-fb8b-71bf-bc6279fe0019.png)

---

## Visual Studio Code

- 解凍したファイルから index.js ファイルを開く。
- 推奨ソフト：Visual Studio Code
![スクリーンショット (62).png](https://qiita-image-store.s3.amazonaws.com/0/240522/4b81c32d-6c66-0c2f-56a6-df6a36b8f1ae.png)

---

## Visual Studio Code

- ソースの10行目の APP_ID を、作成したAlexaスキルの「アプリケーションID（Skill ID）」に書き替える。

```javascript:index.js
var APP_ID = "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";
```

- 保存してから、全選択コピーをする。
![スクリーンショット (61).png](https://qiita-image-store.s3.amazonaws.com/0/240522/b510e03c-8c4a-3302-f7d6-46995b5adca7.png)

---

## AWS Lambda

- 「プログラム（FactSkill）」を選択する。 
![スクリーンショット (63).png](https://qiita-image-store.s3.amazonaws.com/0/240522/75bc7478-a582-427e-b29b-89ccfa8faca7.png)

---

## AWS Lambda

- 画面中央のインラインエディアの「index.js」ファイルを全選択し、先ほどコピーしたローカルのindex.jsファイルの内容を、ペーストする。（日本語版に上書きする。）
![スクリーンショット (64).png](https://qiita-image-store.s3.amazonaws.com/0/240522/88fd9de7-8c8f-0ed7-816d-58fd385764b9.png)

---

## AWS Lambda

- Lambdaプログラムが日本語版に上書きされたことを確認し、「保存」ボタンをクリックする。
![スクリーンショット (65).png](https://qiita-image-store.s3.amazonaws.com/0/240522/cfffe723-05e0-1b4c-1184-0c7879f48dd3.png)

---

## AWS Lambda

- 画面最上部までスクロールし、ARN を選択し、コピーする。
![スクリーンショット (66).png](https://qiita-image-store.s3.amazonaws.com/0/240522/6f7e61d6-2ccf-a8eb-e369-4df3ce01b858.png)

---

# 6. Alexaスキルの仕上げ

---

## Amazon開発者コンソール

- 作成したAlexaスキルの「編集（Edit）」ボタンをクリックする。
![スクリーンショット (67).png](https://qiita-image-store.s3.amazonaws.com/0/240522/081316a2-6912-26e1-9918-6c55c4cc251d.png)

---

## Amazon開発者コンソール

- 「4. エンドポイント（Endpoint）」をクリックする。
![スクリーンショット (68).png](https://qiita-image-store.s3.amazonaws.com/0/240522/18ccc960-c01b-ed9e-dfda-7300dd801d52.png)

---

## Amazon開発者コンソール

1. 「AWS LambdaのARN」を選択する。
2. 「デフォルトの地域（Default Region）」にARNをペーストする。
3. 「エンドポイントの保存（Save Endpoints）」をクリックする。
![スクリーンショット (69).png](https://qiita-image-store.s3.amazonaws.com/0/240522/bb541ba2-e7f8-b42c-0420-534b6efa75ab.png)

---

## Amazon開発者コンソール

- 「ビルド（Build）」をクリックし、最初の画面に戻り、4つ全て「オールグリーン」であることを確認する。
![スクリーンショット (70).png](https://qiita-image-store.s3.amazonaws.com/0/240522/7433f197-f4ba-a17f-5895-13d9498a31b1.png)

---

# 7. テスト

---

## テストシミュレータ

- 「テスト（Test）」をクリックする。
![スクリーンショット (71).png](https://qiita-image-store.s3.amazonaws.com/0/240522/af2d5bae-e35c-391f-0950-ca73e74dd7e3.png)

---

## テストシミュレータ

- マイク利用を「許可する」。
![スクリーンショット (72).png](https://qiita-image-store.s3.amazonaws.com/0/240522/0f1e61ab-d09c-5dd9-4b5c-d55e512d3406.png)

---

## テストシミュレータ

- テストを「有効（enabled）」にする。
![スクリーンショット (73).png](https://qiita-image-store.s3.amazonaws.com/0/240522/b4577791-3eff-8180-6529-9c8a1a5ce219.png)

---

## テストシミュレータ

- マイクアイコンを押下したまま、「とっさの豆知識を開いて」と話す。
![スクリーンショット (73) - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/240522/de281244-c828-6d64-c833-7c22d784f021.png)

---

## テストシミュレータ

- Alexaスキルが正常に動作したことを確認する。
![スクリーンショット (74).png](https://qiita-image-store.s3.amazonaws.com/0/240522/3f2ae7f5-9dd3-8173-21f6-6588e2e9509c.png)

---

# 8. おわりに

---

## おわりに
いかがでしたでしょうか？
うまくAlexaスキルは、動きましたか？

今回作成した FactSkill は、
Alexaスキルの基礎となります。
これを元に、いろいろ作り変えて、
新しい Alexaスキル 作ってみましょう！！

---

# 付録1. ソース解説

---

## ソース解説：メイン処理部

```javascript:index.js
// プログラムの開始位置
exports.handler = function(event, context, callback) {
    // alexa-sdkの利用宣言
    var alexa = Alexa.handler(event, context);

    // アプリケーションIDの設定
    alexa.APP_ID = APP_ID;

    // ハンドラ部へジャンプ（状態遷移分岐）
    alexa.registerHandlers(handlers);

    // Alexa応答（プログラムの終了位置）
    alexa.execute();
};

```

---

## ソース解説：ハンドラ部

```javascript:index.js
// ハンドラ部
var handlers = {
    // ユーザ発話「アレクサ、スキル呼び出し名 を開いて。」
    'LaunchRequest': function () {
        // 'GetNewFactIntent'へジャンプ
        this.emit('GetNewFactIntent');
    },

    // ユーザ発話「何か教えて。」
    'GetNewFactIntent': function () {
        // 変数宣言（ランダムに豆知識を1つ決定）
        var factArr = data;
        var factIndex = Math.floor(Math.random() * factArr.length);
        var randomFact = factArr[factIndex];

        // スピーチアウトプットの設定（Alexa応答設定）
        var speechOutput = GET_FACT_MESSAGE + randomFact;

        // tellWithCard（カード付きAlexa応答＆終了）
        this.emit(':tellWithCard', speechOutput, SKILL_NAME, randomFact);
    },

    // ユーザ発話「ヘルプ。」
    'AMAZON.HelpIntent': function () {
        // スピーチアウトプットの設定（Alexa応答設定）
        var speechOutput = HELP_MESSAGE;

        // リプロンプトの設定（聞き直し設定）
        var reprompt = HELP_REPROMPT;

        // ask（Alexa応答＋たずねる）
        this.emit(':ask', speechOutput, reprompt);
    },

    // ユーザ発話「キャンセル。」
    'AMAZON.CancelIntent': function () {
        // tell（Alexa応答＆終了）
        this.emit(':tell', STOP_MESSAGE);
    },

    // ユーザ発話「止めて。」
    'AMAZON.StopIntent': function () {
        // tell（Alexa応答＆終了）
        this.emit(':tell', STOP_MESSAGE);
    }
};


```

---

## ソース解説：メッセージ定義部

```javascript:index.js
// メッセージ定義
var GET_FACT_MESSAGE = "知ってましたか？";
var HELP_MESSAGE = "豆知識を聞きたい時は「豆知識」と、終わりたい時は「おしまい」と言ってください。どうしますか？";
var HELP_REPROMPT = "どうしますか？";
var STOP_MESSAGE = "さようなら";

```

---

## ソース解説：豆知識の定義部

```javascript:index.js
// 豆知識の定義
var data = [
    "水星の一年はたった88日です。",
    "金星は水星と比べて太陽より遠くにありますが、気温は水星よりも高いです。",
    "金星は反時計回りに自転しています。過去に起こった隕石の衝突が原因と言われています。",
    "火星上から見ると、太陽の大きさは地球から見た場合の約半分に見えます。",
    "木星の<sub alias='いちにち'>1日</sub>は全惑星の中で一番短いです。",
    "天の川銀河は約50億年後にアンドロメダ星雲と衝突します。",
    "太陽の質量は全太陽系の質量の99.86%を占めます。",
    "太陽はほぼ完璧な円形です。",
    "皆既日食は一年から二年に一度しか発生しない珍しい出来事です。",
    "土星は自身が太陽から受けるエネルギーの2.5倍のエネルギーを宇宙に放出しています。",
    "太陽の内部温度は摂氏1500万度にも達します。",
    "月は毎年3.8cm地球から離れていっています。"
];

```

---

## ソース解説：プログラム定義部

```javascript:index.js
// 厳格モードの設定
'use strict';

// alexa-sdkモジュールを利用
var Alexa = require('alexa-sdk');

// アプリケーションIDの設定
var APP_ID = "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX";

// スキル名の設定
var SKILL_NAME = "豆知識";

```

---

# 付録2. 会話を続ける ask化

---

## トークシナリオ：会話を続ける

- 会話が続くようにする。

```text:トークシナリオ
ユーザー：「アレクサ、<とっさの豆知識>を開いて。」
アレクサ：「知ってましたか？水星の一年はたった88日です。
           どうしますか？」

ユーザー：「何か教えて。」
アレクサ：「知ってましたか？太陽はほぼ完璧な円形です。
           どうしますか？」

ユーザー：「止めて。」
アレクサ：「さようなら。」

```

---

## ソース改良：会話を続ける ask化
- 'GetNewFactIntent'の中の <font color="Red">tellWithCard</font> を、 <font color="Red">ask</font> に書き替える。

```javascript:index.js
        // スピーチアウトプットの設定（Alexa応答設定）
        var speechOutput = GET_FACT_MESSAGE + randomFact + HELP_REPROMPT;

        // リプロンプトの設定（聞き直し設定）
        var reprompt = HELP_REPROMPT;

        // ask（Alexa応答＋たずねる）
        this.emit(':ask', speechOutput, reprompt);

```

# 付録3. スキル名の変更

---

## スキル名の変更

- スキル名の名称を変える。

```javascript:index.js
// スキル名の設定
var SKILL_NAME = "とっさの豆知識";

```

---

# 付録4. スキル申請時の指摘にそなえる

---

## 予期せぬ終了に対するそなえ

- <font color="Red">'SessionEndedRequest'</font>の処理を追記する。

```javascript:index.js
    // ユーザ発話「止めて。」
    'AMAZON.StopIntent': function () {
        this.emit(':tell', STOP_MESSAGE);
    },

    // 予期せぬ終了
    'SessionEndedRequest': function () {
        // 処理は書かなくてもOKらしいが、書いておく。
        this.emit(':tell', STOP_MESSAGE);
    }
```

---

## 予期せぬ発話に対するそなえ

- <font color="Red">'Unhandled'</font>の処理を追記する。
- 今回は<font color="Red">状態遷移（state）</font>をしていないので、効力は発揮されないが、状態遷移（state）する時は必須処理となる。

```javascript:index.js
    // 予期せぬ終了
    'SessionEndedRequest': function () {
        // 処理は書かなくてもOKらしいが、書いておく。
        this.emit(':tell', STOP_MESSAGE);
    }, 

    // 予期せぬ発話
    'Unhandled': function () {
        // スピーチアウトプットの設定（Alexa応答設定）
        var speechOutput = HELP_MESSAGE;

        // リプロンプトの設定（聞き直し設定）
        var reprompt = HELP_REPROMPT;

        // ask（Alexa応答＋たずねる）
        this.emit(':ask', speechOutput, reprompt);
    }
```

---

# 付録5. Alexa居酒屋っぽくする

---

## カスタムスロットの追加
- 「スロット値」の「追加」をクリックする。
![スクリーンショット (208).png](https://qiita-image-store.s3.amazonaws.com/0/240522/1277f572-7d51-844e-c7ba-eea3c3fcd82f.png)

---
## カスタムタイプ名前の設定
- スロットタイプの名前に「LIST_OF_DRINK」と入力し、「カスタムスロットタイプを作成」クリックする。
![スクリーンショット (209).png](https://qiita-image-store.s3.amazonaws.com/0/240522/1b01f474-9ee9-3bbf-02b7-cfe6e3facc5b.png)

---

## スロット値の登録
- スロット値に「アイスコーヒー（お好きな飲み物）」と入力し、「＋」印をクリックする。（たくさん登録しましょう。）
![スクリーンショット (210).png](https://qiita-image-store.s3.amazonaws.com/0/240522/f0eb5328-505d-aef7-caf9-4248d23aa5de.png)

---

## カスタムスロットの保存
- 「モデルを保存」ボタンをクリックする。
![スクリーンショット (214).png](https://qiita-image-store.s3.amazonaws.com/0/240522/005f1b49-8c64-08cc-414c-f400640cbf47.png)

---

## カスタムインテントの追加
- 「インテント」の「追加」をクリックする。
![スクリーンショット (215).png](https://qiita-image-store.s3.amazonaws.com/0/240522/80b950fe-d996-6daf-495e-09cf189e63b4.png)

---

## カスタムインテントの名前設定
- カスタムインテントの名前に「OrderIntent」と入力し、「カスタムインテントを作成」クリックする。
![スクリーンショット (216).png](https://qiita-image-store.s3.amazonaws.com/0/240522/13899dbf-9490-4d1c-25f7-021ea8baeed9.png)

---

## サンプル発話の登録
- サンプル発話に「{drink} を {number} ください」と入力し、「＋」印をクリックする。（フレーズ例をたくさん登録しましょう。）
![スクリーンショット (217).png](https://qiita-image-store.s3.amazonaws.com/0/240522/621c3791-fcc8-2150-7132-654d63b8e1d5.png)

---

## スロットタイプの設定
- 「drink」スロットのスロットタイプに「LIST_OF_DRINK」を選択する。
- 「number」スロットのスロットタイプに「AMAZON.NUMBER」を選択する。
![スクリーンショット (218).png](https://qiita-image-store.s3.amazonaws.com/0/240522/a5b37ef5-38e2-124d-d79d-7fdc615b7882.png)

---

## モデルの保存とビルド
- 「モデルを保存」ボタンをクリック後、「モデルをビルド」ボタンをクリックする。
![スクリーンショット (219).png](https://qiita-image-store.s3.amazonaws.com/0/240522/81b8afd9-b7a8-a5ce-2286-ef1af1473e10.png)

---

## 参照ライブラリを増やす

- <font color="Red">'const util = require('util');'</font>の処理を追記する。

```javascript:index.js
// 厳格モードの設定
'use strict';

// ライブラリの参照
var Alexa = require('alexa-sdk');
const util = require('util');
```

---

## メッセージ定義を修正＆増やす

- <font color="Red">'HELP_REPROMPT '</font>の文言を修正する。
- <font color="Red">'ORDER_DRINK '</font>の文言を追記する。

```javascript:index.js
let HELP_REPROMPT = "お飲み物でもいかがですか？";
var STOP_MESSAGE = "さようなら";
let ORDER_DRINK = "%sを、%s杯ですね？ご注文をお受けいたしました。またのご利用、お待ちしております。";
```

---

## OrderIntentの処理を追加する

- 'AMAZON.HelpIntent'の処理の前あたりに、<font color="Red">'OrderIntent'</font>の処理を追記する。
- コピー＆ペーストしてもらえればOKです。
- かならず、保存をクリックしましょう。

```javascript:index.js
    // ユーザ発話「{drink} を {number} ください。」
    'OrderIntent': function () {
        // スロット格納用変数
        let drink = undefined;
        let number = undefined;

        // スロット値の取得
        if ('drink' in this.event.request.intent.slots) {
            drink = this.event.request.intent.slots.drink.value;
        }

        if ('number' in this.event.request.intent.slots) {
            number = this.event.request.intent.slots.number.value;
        }

        // // セッション情報の保存
        this.attributes['drink'] = drink;
        this.attributes['number'] = number;

        // スピーチアウトプットの設定（Alexa応答設定）
        let speechOutput = util.format(ORDER_DRINK, drink, number);

        // tell（Alexa応答＆終了）
        this.emit(':tell', speechOutput);
    },

```

---

## Alexa居酒屋のプレオープンテスト

- お好きな飲み物を注文してみる。
![スクリーンショット (220).png](https://qiita-image-store.s3.amazonaws.com/0/240522/513834b6-23e7-92a1-8363-f132315b6ea8.png)


---

# 付録6. スキル申請時の必須項目の登録

---

## スキル申請時の必須項目の登録
Japanese Store Preview の設定。

1. Amazon開発者コンソールの「Launch」をクリックする。
2. 「Public Name」に、スキル名を設定する。
3. 「One Sentence Description」に、短いスキル説明文を設定する。
4. 「Detailed Description」に、長いスキル説明文を設定する。
5. 「Example Phrases」に、スキル起動フレーズを設定する。（例：「アレクサ、とっさの豆知識を開いて」）
6. 「Small Skill Icon」に、小さいアイコン（108x108 .jpg or .png）を設定する。
7. 「Large Skill Icon」に、大きいアイコン（512x512 .jpg or .png）を設定する。
8. 「Category」を設定する。
9. 「Keywords」に、検索キーワードを設定する。
10. 「Save and continue」ボタンをクリックする。

---

## スキル申請時の必須項目の登録
Privacy & Compliance の設定。

1. Amazon開発者コンソールの「Launch」をクリックする。
2. 「Privacy & Compliance」をクリックする。
3. 英語質問を和訳し、「Yes ／ No」に回答する。
4. 「Export Compliance」を和訳し、必要に応じてチェックする。
5. 「Testing Instructions」に、スキル申請をしてくださるアマゾンテスター向けコメントを明記する。
6. 「Save and continue」ボタンをクリックする。

---

## スキル申請時の必須項目の登録
Privacy & Compliance の設定。

1. Amazon開発者コンソールの「Launch」をクリックする。
2. 「Availability」をクリックする。
3. 「Public」をチェックする。
4. 「Selected countries and regions」をチェックし、「Japan」のみチェックする。
5. 「Save and continue」ボタンをクリックする。

---

# 付録7. Alexa公式ドキュメント

---

## Alexa公式ドキュメントの情報源
- [参考：Alexa Skills Kitによるスキルの作成](https://developer.amazon.com/ja/docs/ask-overviews/build-skills-with-the-alexa-skills-kit.html)
- [参考：Alexaスキルのポリシーのテスト](https://developer.amazon.com/ja/docs/custom-skills/policy-testing-for-an-alexa-skill.html)


※画面下の「Language」を「English（英語）」に切り替えることで、日本未公開の絶対領域を参照できます。

---

# 付録8. alexa-sdkを極める

---

## alexa-sdkの情報源
slotの値取得、stateによる状態遷移やcard表示の方法などが、学べます。

- [参考：本家alexa/alexa-skills-kit-sdk-for-nodejs
](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs)
- [参考：和訳Alexa Skills Kit SDK for Node.js](https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/master/Readme.jp.md)
- [参考：Alexa Skills Kit for Node.js はじめの一歩](https://dev.classmethod.jp/cloud/alexa-skills-kit-for-node-js-first/)
- [参考：Alexa Skills Kit SDK for Node.js ざっくり訳](https://qiita.com/HeRo/items/8475505a55cc9e737687)

---

# 付録9. サンプルソースたち

---

## サンプルソースの情報源
個人的には、alexa-cookbook が最強だと思ってます。

- [参考：Github alexa](https://github.com/alexa/)

---

# 付録10. ダイアログモデルを極める

---

## ダイアログモデルの情報源
slotの値取得制御の一部分を、Alexaスキル側（Amazon Developer Portal）で済ませる新技。

- [参考：ダイアログモデルでスロットを自由自在に操作するためのドキュメント](https://dev.classmethod.jp/cloud/alexa-dialog-model/)
- [参考：強制的にステータスをCOMPLETEDに遷移させることで、複雑なダイアログモデルを作成してみる](https://dev.classmethod.jp/cloud/extended-dialog-model/)

---

# 付録11. VUIのしんずいを極める

---

## VUIの情報源
- [参考：Voice UI Designer Meetup Tokyo個人メモ(雑記)](http://kbn1053.hatenablog.com/entry/2018/03/15/082334)

---

# 付録12. 奥義、Amazonに聞く

---

## Amazonフォーラム
- [参考：Amazon Developer Forums](https://forums.developer.amazon.com/spaces/293/index.html)

## Amazonお問い合わせ
- [参考：お問い合わせ](https://developer.amazon.com/ja/support/contact-us)

---

## おわりに

2018/03/10 TAKAHIRO NISHIZONO

---

# end