はじめてのスキル開発（Alexa編）


EchoDotを購入しました:congratulations:
音楽を聞いたり、ピカチュウとお話したり、鬼を呼んだりと自宅で大活躍！（子供は恐怖）
もっと充実したAlexaライフを送るため、**スキル開発**をはじめてみようと思います。
ちなみに、Alexaを買ったと書くか、Echoを買ったと書くか凄く悩んだ。。。:rolling_eyes:

## スキル開発にEchoDotは不要だった！！！

以下は、Alexa Skills Kitを使ったスキル開発手順をメモした記事です。
筆者はスキル開発経験がありません。
:star: アカウントが整っていれば15分程度でスキルを1個新規作成できると思います！！！(テンプレ使って)

ちなみに。。。
Alexaがなくてもエミュレータを使ってスキル開発を楽しめるそうです。
持ってない方も是非チャレンジしてみてください！！

### 目指すゴール
アレクサに話しかけると、その内容を翻訳してくれるスキルを開発してみます。
**私** <--> **Alexa(EchoDot)** <--> **Lambda**

```
私：Alexa、翻訳アプリで"今日はいい天気ですね"を翻訳して
Alexa：The weather is good today.
```

## 1. 必要なアカウントの準備

Alexaのスキル開発には、以下のアカウントが必要です。

- amazon.co.jpのアカウント(今回は登録済みだったものを使用）
- [Amazon Developerアカウント](https://developer.amazon.com/ja)
    - コード以外の部分（呼び出し方とか）を管理するため必要です。
- [AWSアカウント](https://aws.amazon.com/jp/)
    - スキル自体のコードをLambdaで管理するため必要です。

:clipboard:メモ：
Amazon Developerアカウントの登録に関しては、アカウント作成ではなく、
amazon.co.jpのアカウントを使ってログインすれば良いそうです。
※「Amazon Developerアカウントを作成」からアカウントを作ると後々面倒に巻き込まれそう。

## 2. 難しくない！Developerコンソール上でのスキル作成

スキルを作成するにあたって、自分が作るものをどのような呼び出すか決めておく必要があります。
今回は「Alexa、ぼっちーず翻訳で"今日はいい天気ですね"を翻訳して」と呼び出そうと考えています。
よって、上記フレーズを以下のように分解します。

**呼び出し名：** ぼっちーず翻訳
**インテント（サンプル発話）：** "今日はいい天気ですね"を翻訳して
**スロット（パラメータ・動的な部分）：** "今日はいい天気ですね"

では早速[Developerコンソール](https://developer.amazon.com/alexa/console/ask)にアクセスして、
「スキルの作成」ボタンを押して作成していきます。

### 2.1. スキル作成

スキル名は呼び出し名とは異なるため、任意でOKです。（私は、分かりやすく揃えました。）
モデルは「カスタム」で、バックエンドリソースは今回Lambdaでコードを管理するので「セルフホスト」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82555/69eb9ce5-91c8-e004-93ae-a81de7f9f492.png)
この内容で作成ボタンを押します！:ok:

### 2.2. スキルビルダーのチェックリストに従って、呼び出し名などを登録

画面右に出ているスキルビルダーのチェックリストに従って、
あらかじめ決めておいた呼び出し名やインテント、スロットを登録しておきます。

#### インテントの追加に関して
カスタムインテントを追加します。インテント名はLambdaで使用する関数名と同じにするため、
「TranslateIntent」としました。

#### スロットとスロットタイプに関して
こちらも、Lambda側のコードと同じにする必要があるため、
「keyWord」というスロット名にしました。

スロットタイプは、Amazonが用意したAMAZON.XXで始まるものや、
カスタムと呼ばれる自分でカスタマイズできるものがあります。
今回はカスタムタイプ（MyType）を追加/選択し、タイプに翻訳したいワードを登録しました。
（実用性ZEROの「今日はいい天気ですね」の1件のみ）

#### サンプル発話の登録
スロットにkeyWordを登録しておくと、サンプル発話で使えるようになります。
「{keyWord} を翻訳して」を追加しました。

### スキルのビルド

スキルをビルドしましょう|'Д'*)ﾉ))
ボタンを押すだけでビルドが始まります。

まだエンドポイントの登録が終わってないので、
ココから先はエンドポイントを作っていきます。

## 3. 怖くないLambda関数作成～エンドポイント登録まで

AWSの利用って料金面が怖いですよね。。。
ネットの記事とかで怖いの見るし|ω･`)))
結論から言うと、今回のアプリ作成（非公開）でLambdaを使ったところ、
無料枠を超えることはありませんでした。余裕そう？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82555/12185590-0936-0136-2051-63e861e5259d.png)

だからといって、無料を保証するものではないので、あくまで自己管理でお願いします。
私自身も人に説明できる知識は持ってません。

### 3.1. 関数の作成

LambdaにAlexa用の設計書が用意されています。
Alexaというワードで検索をすると、いくつか発見できるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82555/2a98035c-0f03-29a7-db1d-d5ba6fb590d9.png)
今回は、「alexa-skill-sdk-factskill」というものを使って進めていきます。
名前は任意でOKです。
ロールに関しては、Alexaのスキル開発マニュアル通りに
「テンプレートから新しいロールを作成→シンプルなマイクロサービスのアクセス権限」にしました。

### 3.2. トリガー設定とエンドポイント設定

トリガーは、Alexa Akills Kitを利用します。
スキルIDが必要なので、Developerコンソールを開いて先程作成したスキルの
左メニュー「Endpoint」に記載されているYour Skill IDをコピーして貼り付けましょう！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82555/0c45aab5-6d21-8934-a9dc-de52bb53f969.png)

次にLambda関数の画面右上に表示されているARNをコピーします。
先程開いたDeveloperコンソール - Endpointのデフォルト地域に、
ARNを貼り付けます。

### 3.3. コードの修正

コードを修正していきます。
デフォルトで用意されているGetNewFactIntentを2.2で作成した
「TranslateIntent」に置き換えます。

```Javascript:TranslateIntent
'TranslateIntent': function () {
    let keyWord = this.event.request.intent.slots.keyWord.value;
    this.emit(':tell', `キーワードを受け取りました。キーワードは、${keyWord}です`);
}
```

翻訳機能は一旦忘れて、このようにしました。

## 4. 喋ってAlexa!!（スキルのテスト）

Alexaのテストをする上で、購入したEchoは一切使いませんでした。（使うこともできるけど）
Developerコンソールのテストタブから、実際の動きをテストすることができます。
マイクがあれば、音声入力だって可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82555/36c529ac-1310-b968-addb-8189c1531259.png)

シュミレータの:microphone2:ボタンを押しっぱにして、
「ぼっちーず翻訳で"今日はいい天気ですね"を翻訳して」と叫んでみます。:speaking_head:

すると。。。。

Alexa「キーワードを受け取りました。キーワードは、今日はいい天気ですねです」
ｷｪｪｪｪｪｪｱｧｧｧｧｧｧｼｬｧﾍﾞｯﾀｧｧｧｧｧｧｧ!!!:heart_eyes:

と、ココで満足しました。翻訳は時間があったら作ってみることにしますｗ


## その他

### スキルがリクエストに正しく応答できませんでした問題

記事のスキル（スロットあり）を作成する前に、スロットなしで色々喋らせて遊んでました。
そこに、スロットを追加して動的パラメーターを渡して喋らせるようにLambda側のコードを
いじったのですが、いくらテストをやっても
Alexa「スキルがリクエストに正しく応答できませんでした」というばかり。。。

原因は、スキルを**ビルドしてなかった**からでした。。。。1時間は無駄にした。

### スキル開発をやってみた感想

Alexaを自分の思ったとおりに喋らせることができたことが一番嬉しかったです。
IFTTTを利用したことはありますが、案外「トリガー」とかいうのが恥ずかし・めんどいんですよね。

Lambdaで開発ができるので、要領さえ掴めば色々できそうな感じはします。
今後も料金に気をつけながら色々試していこうと思います！


では、よきAlexaライフを！！
以上。