【超初心者向け】最短で、AlexaにCSVを読み込ませる方法

# 最短でAlexaにCSVを読み込ませる方法
需要があるかはわからないですが、AlexaにCSVを読み込ませることで
いろいろなことができます。例えば、オープンデータにはCSVのデータが多いので
ゴミのオープンデータを使ってゴミ出し情報のスキルを作ってみるなどいろんなことができます。
この記事の所要時間は約30分です。アカウントが作ってある場合やスキルの作り方を知っている場合は
10分もあればできると思います。

## 流れ
アカウント作成(5分)→関数の作成(3分)→スキルの作成(3分)→LambdaとAlexaSkillの連携(3分)
→ Node.jsのインストール(10分) → ファイルのダウンロード(3分) → スキル実行

## アカウント作成
[AWSアカウント](https://aws.amazon.com/jp)
[Alexaアカウント](https://developer.amazon.com/ja/alexa)


## AWSアカウントで関数の作成
AWSのlambdaというサービスを選んで関数の作成をします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/2fcda301-2008-ff69-f4dd-a8b1eb823f53.png)
関数の作成は設計図を選んで、alexa-skill-kit-sdk-factskillを選択
※この時右上の地域が東京になっていることを確認してください。オハイオなどだと出てきません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/7707bc37-b803-cf0d-1412-08e2bc60f2c3.png)

カスタムロールの作成を選ぶ。名前はなんでもオッケー。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/cda61a8f-8842-5b91-5b5e-3c54edeca913.png)
別ページに飛んだらそのまま許可を選んでください。そして、関数を作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/b29adf21-ecf5-d8ba-9648-772a5013b01c.png)
トリガーの追加でalexa skills kitを追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/8a85a0a3-d070-a27d-2f20-81f301d0c25f.png)
一度ここまで設定が終わったら,alexaアカウントの方に移動します。

## alexaアカウントでカスタムスキルの作成
あなたのAlexaコンソール→Skills→スキルの作成を選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/5d55a44e-57d0-9748-884c-8b1dc3fe8be1.png)
新しいスキルを作成
スキル名はなんでもOK 言語は日本語で。
カスタムを選択→スキル作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/e24e5272-c9dc-0cf2-11b8-1aeb6ea11e74.png)
左メニューの呼び出し名をまずは決める。なんでもオッケー。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/1b994ec6-d0ae-db2a-67e3-f47a352b0276.png)
次に左メニューからインテントの追加を選択
名前はなんでもOKですが、アッパーキャメルケースにしましょう。(例:TestIntent)
要は単語と単語の間を大文字にすればいいです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/bc699a7d-d77f-8d25-7541-df36c49cea4f.png)
サンプル発話には、テストと入れておいてください。
そしてそのまま上部にあるモデルの保存を押した後にモデルをビルドを押して下さい。
モデルビルドができたら、左下にあるエンドポイントを押してください。
その後、エンドポイントにスキルIDというのがあるので、クリップボードにコピーしておいてください。

## AWS lambdaとAlexaの連携
トリガーの設定で、先ほどコピーしたスキルIDを入れます。
そして、そのまま追加→右上の保存を押してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/3c24fe92-4484-850b-1df7-b3469294245d.png)

その後、AWSアカウント上部にあるlambdaのIDをコピーします。
ARN - arn:aws:lambda~~のarn:aws〜の部分をコピーしてください。

Alexaのエンドポイントのデフォルトの地域にコピーしたlambdaのidを入れます。
その後、上部にあるエンドポイントを保存を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/71919080-a9eb-b96b-741c-55426142d510.png)

保存できたら上部にあるテストを選択
テストを有効にして、「アレクサ、<最初に決めた呼び出し名>を開いて」と入力
下記のように表示されたらAWSとAlexaが繋がりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/68253b08-e83b-66d3-67ff-06ce60a9db77.png)

## Node.jsのインストール
そうしたら、いよいよこれからCSVを読み込めるようにしていきます。
下記を参照して,node.jsをインストールしてください。
[Node.js / npmをインストールする（for Windows）](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)
[Macにnode.jsをインストールする手順。](https://qiita.com/akakuro43/items/600e7e4695588ab2958d)

## サンプルダウンロード
こちらのサンプルをダウンロードしてね。
[github](https://github.com/yutaroud/Alexacsv)

そして、cdコマンドで先ほどダウンロードしたフォルダまで移動してください。
移動したら
node -v で node.jsが入っているか確認してね。バージョンが出たらOKです。
次にnpm installとターミナルで入れてください。
色々インストールされると思います!

``` shell
$ cd ~/Alexacsv-master
$ node -v
v10.9.0(versionの数字はなんでもOK)
$ npm install
```

## サンプルファイルのZIP化
### Windows
Zipにしたいフォルダを右クリックして、送る→フォルダを圧縮(ZIP形式)。
### Mac
ターミナルで該当フォルダの場所まで移動し、下記コマンドを実行。 

```shell
rm ../フォルダ名.zip; zip -r ../フォルダ名.zip .
```

## AWS lambdaへのアップロード
前回作成したlambda関数を編集します。

コードエントリタイプのコードをインラインで編集を
zipフォルダをアップロードに変えて、先ほどのZIPフォルダをアップロードしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/dbbf6d04-11e1-a21e-2bd1-9feacaac00f0.png)

## Alexaのテスト
サンプル1と表示されればOKです。![image.png](https://qiita-image-store.s3.amazonaws.com/0/224825/4e9c7de7-3857-636c-5254-20a3b1bcd2db.png)


# Alexaよくある質問
## AWSのlambdaでAlexaのサンプル関数が出ないんだけど？
画面右上部の地域を確認してください。
オハイオになっていたら東京にしてください。

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

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

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

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

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

## スロットって何？
大雑把にいうと、分類のために使う辞書みたいなものです。
占いに関係する用語を分類させるFortuneIntentというものを作った時にその用語をスロットとして登録しておく必要があります。例えば、星座占いなら蟹座、山羊座といった星座をseizaというような名前を付けて、スロットに登録します。
そして、カスタムインテントのサンプル発話の部分に{seiza} です。というような使い方をすると、ユーザの入力に合わせてそこのseizaの部分が変わるので、コード側でseizaの部分だけ取得することができ、その結果に応じて分岐を行ったりさせます。

## スキルからの応答に問題があります。って出たんだけど？
何らかのエラーがあります。
コードにエラーがある場合とアレクサのインテントやスロットなどにエラーがある場合があります。
コードにエラーがある場合は、SDKなどの開発環境で調べるか、paiza.ioなどを使って調べましょう。アレクサ側のエラーは、どのインテントに分類しているかなどを調べる必要があるので、CloudWatchなどのログを見るか、Alexaスキル開発の際のテストの部分でどこのIntentに分岐しているかを見て、原因を調べましょう。

### 参考
[Alexaスキル開発トレーニングシリーズ 第1回 初めてのスキル開発 (改訂版)](https://developer.amazon.com/ja/blogs/alexa/post/6e716e5c-55b0-445b-b936-9cfac4712e7b/training-1)
[Node.js / npmをインストールする（for Windows）](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)
[Macにnode.jsをインストールする手順。](https://qiita.com/akakuro43/items/600e7e4695588ab2958d)

### 最後に
長くなりましたが、AlexaでCSVを読み込ませる方法を簡潔にまとめました。
試してみて、ここが詰まったというところや、できなかった！という意見があれば、コメント欄で是非教えてください。