たった30分でどんな初心者でも本格的なアレクサ(Alexa)スキルが作れてしまう悪魔の書

# はじめに
みなさん。スマートスピーカー持っていますか？
[ある統計データ](https://gamebiz.jp/?p=229878&fbclid=IwAR2ibmSM_-QCbtVV2uBZkXYC5boizO197qjL808PiMsX8xgL_blxvkjrAH8)によると、10人に1人はもうスマートスピーカーのスキルを持っているらしいですよ！！！
スマートスピーカーが発売されたのは２年前くらいのことですから、浸透スピードはかなり早いのではないかと思います。
今後もますます増えていくと、私自身思っていますので、開発者目線ですが、今のうちに色々手を出していくのはかなりアドバンテージなのではないかと思います！

後、**プログラミング初心者にもAlexaスキルの開発はめちゃくちゃお勧め**だと思っています！！
なぜなら、プログラミングをやる時に誰もがつまづいたことがある、デザインの壁がない！！！
これはかなりデカイと思います。どれだけ、デザインがヘボいということで大したことないと言われたことか・・・。

ユーザーストーリーを考えるだけで、簡単にAlexaスキルを作れますので、ぜひこの記事を読んで
Alexaライフを一緒に楽しみましょう！！！


# 必要なアカウント
・[Heroku](https://jp.heroku.com/)アカウント
(Herokuとは、Webアプリケーションの開発から公開までを簡単にできるプラットフォームサービスです。)
・[AlexaSkillsKit](https://developer.amazon.com/ja/alexa-skills-kit)に接続できるアカウント(Amazon.co.jpのアカウントがあれば既に作成されている可能性が高いです。
このアカウントはAlexaスキル作成に必須です。）

# Node-RED環境の作成
## Node-REDとは？
Node-REDはIBMが開発したオープンソースソフトウェアの一つで、
ものすごく大雑把に言うと、コーディングしなくても、用意されているブロックをマウスでポチポチっと繋げていくだけで
プログラムが組めちゃうという初心者でも簡単に色々できてしまうツールです！

## Node-RED環境をHerokuで作る
Herokuのアカウント作成が終了したら、Herokuデプロイボタンを押すだけで環境が作成できます！
<a href="https://heroku.com/deploy?template=https://github.com/joeartsea/node-red-heroku"><img src="https://camo.githubusercontent.com/c0824806f5221ebb7d25e559568582dd39dd1170/68747470733a2f2f7777772e6865726f6b7563646e2e636f6d2f6465706c6f792f627574746f6e2e706e67" alt="Deploy"></a>
デプロイボタンを押すと下記のようなページに飛ばされると思うので、
App Name(アプリ名): 適当な名前
NODE_RED_PASSWORD: Node-Redに使用するパスワード
NODE_RED_USERNAME: Node-Redに使用するユーザ名
以上の3点を入力してください。
![スクリーンショット 2019-03-02 15.37.11.png](https://qiita-image-store.s3.amazonaws.com/0/224825/5b91c12a-396b-baf7-8426-e049354a1a64.png)
入力が終わった後、URLが公開されていると思うので
https://先ほど定めたapp名.herokuapp.comにアクセスします。
すると下記のページが出ますので、Go to your Node-RED flow editorをクリックします！
その後ユーザ名とパスワードの入力が求められますので、入力しましょう。
![スクリーンショット 2019-03-02 15.40.18.png](https://qiita-image-store.s3.amazonaws.com/0/224825/6c6b1d3b-df9e-5edc-9f50-e2b3824d7e6b.png)
下記のページが表示されていれば、とりあえずここまではOKです！
![スクリーンショット 2019-03-02 15.48.39.png](https://qiita-image-store.s3.amazonaws.com/0/224825/c38df969-7b51-185b-2e5c-a15e2fa46a15.png)


# Node-REDの構築
早速、じゃあ構築していきましょう！といきなりやるのも大変だと思うので、サンプルを用意しました！
GitHubからDLできます。nodered.jsonの内容をコピーしてください。
[Node-Redのサンプルjson](https://github.com/yutaroud/node-alexa/tree/master)

コピーした内容を右上のハンバーガーメニューから読み込み>クリップボードで貼り付けて
インポートしてください。
![スクリーンショット 2019-03-02 17.04.47.png](https://qiita-image-store.s3.amazonaws.com/0/224825/8e712890-b60d-5584-0d0a-ced990a99eb1.png)

すると下記のように表示されると思います！
この内容は、Alexaスキルを簡易的にテストするために私が作成したものです。
画像の表示と簡単な分岐ができるようにしてあります！
右上の***デプロイボタンからデプロイだけしておきましょう***
(デプロイとは簡単に言うと、サービスが利用できるように設定することです。
今回のような場合は、このボタンを押さない限りはサーバーに反映されません。）
![スクリーンショット 2019-03-02 17.06.16.png](https://qiita-image-store.s3.amazonaws.com/0/224825/500e851e-542a-a69e-f25f-2aa514d54e58.png)

ここのブロックの内容を解説する前に、ひとまずAlexaとの連携を先にやって行きます。

# AlexaSkillsKitの構築

## スキルの作成
[AlexaSkillsKit](https://developer.amazon.com/ja/alexa-skills-kit)にサインインします。
あなたのAlexaコンソール→Skills→スキルの作成を選ぶ
![カスタムスキルの作成](https://camo.qiitausercontent.com/5eadec1d901a4e2bdd6b7f9f566682fac8aa855a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232343832352f35643535613434652d353764302d393734382d383834632d3862316463336665386265312e706e67)

新しいスキルを作成
スキル名はなんでもOK 言語は日本語で。
カスタムを選択→スキル作成
![カスタムスキルを選択](https://camo.qiitausercontent.com/c91f8272c86dd58d2b127a1630cf91512f80cdbf/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232343832352f65323465353237322d633964632d306366322d313162382d3161656236656131316537342e706e67)
すると新しいスキルが作成されます。

## 呼び出し名の登録
右側にスキルビルダーのチェックリストというものがあります。これに沿って進めていきます。
まずは、呼び出し名を登録するので、1.呼び出し名の部分をクリックしてください。
ここでの名前はなんでも良いので登録し、画面上部にあるモデルを保存を押して次に行きます。
(ただし、これはアレクサに〜を開いての〜にあたる部分なので、呼びやすい名前にしましょう）
![呼び出し名の登録](https://camo.qiitausercontent.com/425c151c6e5950fe6b6094d642ecfe366b2f53d1/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232343832352f31623939346563362d643061652d646232612d363765332d6634376133353262303237362e706e67)

## インテントの追加
続いて、インテントの追加を行います。
**インテントの説明は後述します。**
先ほどと同じように2.インテント、サンプル、スロットをクリックしてください。
名前は一旦,**HelloWorldIntent**にしてください！
サンプル発話には、こんにちはと入れておいてください。
そこまでできたら、忘れずに画面上部のあるモデルを保存を押してください！
![スクリーンショット 2019-03-02 22.54.31.png](https://qiita-image-store.s3.amazonaws.com/0/224825/0c1152fb-4684-6690-3867-9b316765fbea.png)

## Displayインターフェースの追加,モデルをビルド
画像を表示するための許可設定を行います。
画面左にあるインターフェースを選択します。
![スクリーンショット 2019-03-02 22.58.55.png](https://qiita-image-store.s3.amazonaws.com/0/224825/1a12782b-86b2-f3a3-0f36-ae583f628714.png)

Displayインターフェースを**ON**にします。
その後、画面上部にある***インターフェースを保存を忘れないでください***
インターフェースの保存が完了したら、そのまま**モデルをビルド**しましょう。
ここまでで、Alexaスキルの作成は完了です。
続いて、Node-REDとAlexaスキルの連携をしていきます。
![スクリーンショット 2019-03-02 22.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/224825/47a11753-9cec-ee82-8a9e-15dc4a8dc388.png)


# AlexaSkillsKitとの連携
早速AlexaとNode-REDをつなげていきます。
AlexaSkillsKitの画面左にあるエンドポイントの設定を行います。
![スクリーンショット 2019-03-02 23.04.35.png](https://qiita-image-store.s3.amazonaws.com/0/224825/f70345b6-afc9-7e89-0a99-f10541584de7.png)

サービスのエンドポイントの種類はHTTPSを選択
デフォルトの地域に先ほど公開したNode-REDのURLのhttps://XXXXX/herokuapp.com/までをコピーし、
貼り付けましょう。その後、herokuapp.comの後方に/HelloWorldとくっつけてください。
ここまでできたら***エンドポイントを保存***します。
![スクリーンショット 2019-03-02 23.08.05.png](https://qiita-image-store.s3.amazonaws.com/0/224825/85600a87-c195-0d78-305f-d956e4cca302.png)

ここまでできたら、画面上部のタブにあるテストをクリックし、
もし非公開になっていたら開発中にすることでテストができます。
そして、テストを開いて、このような形で表示されていればOKです！！
（画像は自分で探してください！！！）
![スクリーンショット 2019-03-02 23.21.24.png](https://qiita-image-store.s3.amazonaws.com/0/224825/d9b04751-27b3-2283-db1e-adc4e6e2aba1.png)
もしできない場合は、よくあることとして下記が考えられます。
・Node-REDのデプロイボタンを押してない。
・インテント名が間違っている
・モデルのビルドがきちんとされていない
・インターフェースが保存されていない
・エンドポイントのURLが間違っている。

# Node-REDの解説
## プログラム処理の流れ
まずエンドポイントが/HelloWorldになっている理由から説明します。
ブロックのAlexaからの入力をダブルクリックすると下記が表示されます。
ここで受付するURLをHelloWorldにしているので、ここで決めています。
ここを変えれば好きな形にできますよ！！
![スクリーンショット 2019-03-02 23.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/224825/6d2ed9e4-c5b1-156a-3fe0-c1067d44e58d.png)

続いて、ここをいじることはよっぽどありませんが、解説をしておきます。
Alexaからはjsonという形式でリクエストが送られてきます。そのリクエストに応じて分岐をしています。
LaunchRequestは、最初にAlexaを起動した際に発言する内容の分岐です。
IntentRequestは、先ほど登録したHelloWorldIntentなどの分岐です。
SessionEndedRequestは、Alexaが終了するときに分岐します。
![スクリーンショット 2019-03-02 23.30.50.png](https://qiita-image-store.s3.amazonaws.com/0/224825/ebdd98c6-ecd7-9e61-4e3d-4fefd7ff949f.png)

続いて、LaunchRequestに進んだ時の処理を見て行きます。
最初に出力される言葉、画像のURLを追加、ここの部分の値をレスポンスを作成という部分に入れ込んでいます。
なので、この最初に出力される言葉を変更すれば、Alexaが最初に喋る内容も変わりますし、画像のURLを追加すれば画像の内容も変わるというわけです。
レスポンスにはjson形式の内容が入っていますが、Alexaはそのjson形式でデータをやりとりしているためこのような形になっています。
ここの部分は、[公式](https://developer.amazon.com/ja/docs/custom-skills/request-and-response-json-reference.html#response-object)を参照すると良いと思います。
初心者の方は、ここまで理解していなくてもなんとかなります。
あと後ろにつながっている部分はjsonにして応答を返しているだけです！
![スクリーンショット 2019-03-02 23.34.08.png](https://qiita-image-store.s3.amazonaws.com/0/224825/8965e866-4be7-ae5b-7d14-457c7833f957.png)


続いて、インテント分配の部分を見て行きましょう！
ここで、先ほど登録したHelloWorldIntentを分岐しています！
新しくインテントを追加したい場合は、画面左下にある追加を押すことで追加していけますよ！
![スクリーンショット 2019-03-02 23.39.22.png](https://qiita-image-store.s3.amazonaws.com/0/224825/962d7d33-42af-413c-02ce-4562f9a7189d.png)

HelloWorldIntentに続く部分は、ランダムに画像とテキストを出力する処理を入れています！
ここの乱数の2の値を変えることで、配列の数を増やすことができ、
textとurlの中身を変えることで、画像とテキストの中身を変えることができます！！
![スクリーンショット 2019-03-02 23.41.57.png](https://qiita-image-store.s3.amazonaws.com/0/224825/26b7427c-4ab4-c05d-5138-669c7c686495.png)

あとはだいたい一緒です！！
このサンプルを色々変えて面白いスキルを作るのも良し。
そのままサンプルを使って、Alexaスキルを試してみるも良し！
色々やって見ましょう！！

## インテントって何？
大雑把に言うと、会話の分類みたいなものです。
標準であるインテントとしてStopIntent,HelpIntent,CancelIntentがあります。

StopIntent: 終了したい時に分類される。「ストップ」「またね」などと伝えるとStopIntentが呼ばれ、動作が終了する。

HelpIntent: スキルの使い方を知りたい時に分類される。「助けて」「ヘルプ」などと伝えるとHelpIntentが呼ばれる。

CancelIntent: 発話をキャンセルしたい時に分類される。「キャンセル」「やめて」などと伝えるとCancelIntentが呼ばれる。一個前の会話をもう一度分岐させたい場合などに使用する。

カスタムインテントとして、自分でIntentを作ることもできます。
例えば、星座占いのスキルを作る場合ならFortuneIntentみたいな名前をつけて
占いに関係する用語が喋られた時にFortuneIntentに分岐をさせるといった使い方をします。
占いに関係する用語をどのように定めるかというと、次に説明するスロットを使います。
カスタムインテントにはスロットを設定することができます。

# 終わりに
かなり詳細な部分まで説明をしたので、長くなりました！
しかし、30分まとまった時間が取れれば絶対にできると思います！
プログラミングの第一歩としてはじめるもよし。気軽にAlexaスキルを作りたいと言う気持ちではじめるもよし。
まずは手を動かして、色々作ってみましょう！！！！
もしわからないことがあれば、コメントで聞いてください！！！！