Alexaに今日飲んでいいお酒の量を確認させてみる

この記事はLivesense AdvendCalendar 19日目の記事です。
昨日は @otakumesi さんの「『migemo』という便利なツールをオススメしたい」でした。

はじめまして、Livesenseでインフラエンジニアをしている @p1na9uattr0 です。
Qiitaデビューがいきなりアドベントカレンダーになってしまいましたが、書いてみます。

# はじめに

さてみなさん、:beer::sake:お酒:wine_glass::cocktail:好きですか？
私は大好きです:beers:

ついつい飲みすぎ、且つ締めに`豚骨ラーメン`:pig::ramen:食べてしまって体重が気になってしまう事もしばしばですね。
年中そんなことを言っていますが、平日の夜や土日で自転車:bicyclist:に乗ったりジョギングしたりして体を動かして帳尻を合わせています。

毎日、`MyFitnessPal`にカロリーを記録して「ああ、今日は焼酎1杯しか飲めないなー:ghost:」なんて日も多いわけですが、運動した日にどのぐらいお酒を飲んでいいかAlexaに喋らせてみようと思います。

# 用意するもの

* Echo Dots
* AWSアカウント(Lambda/Amazon Developer用)

# やったこと

## Alexa Skills KitでAlexaスキルを作る

以下の流れで`Alexa Skills Kit`でAlexaスキルを作ります。

1. [Amazon Developer](https://developer.amazon.com/ja/)にAWSアカウントでログインして`Alexa Skills Kitl (ASK)`からスキルを作成する
2. `呼び出し名`に適宜名前をつけて`モデルを保存`する
3. `インテント`に`呼び出し名`を言った後のワードを追加し、`モデルを保存`する(多分要らない)

[こちら](https://torina.top/detail/442/)を見ながらサクサク進めます。
本当に使いこなすには用語の意味とかもっとちゃんと理解したほうが良いかもしれません。

## Lambda関数を作る

以下の流れで`Lambda`関数を用意していきます。

1. `Lambda`で`Python3.7`ランタイムの関数を作る
2. `Alexaスキル`の`エンドポイント`ページから`スキルID`をコピペする
3. `Alexaスキル`の`エンドポイント`ページの`デフォルトの地域`にLambdaのARNをコピペする
4. `Alexa Skills Kit`をイベントとして設定する

この時点でスキルを開発できるようになりました。

### Lambda関数の中身

[こちら](https://torina.top/detail/443/)のコードをベースに、以下の様に実行するインテントを複数指定します。

```python
<snip>
# 焼酎を何杯飲んでいいか回答する
def shochu():
    return OneSpeech('今日は焼酎を' + shochu_count + '杯飲んでいいですよ').build()

# 缶ビール(350ml)を何本飲んでいいか回答する
def beer():
    return OneSpeech('今日は缶ビールを' + beer_count + '本飲んでいいですよ').build()

# 日本酒を何合飲んでいいか回答する
def sake():
    return OneSpeech('今日は日本酒を' + sake_count + '合飲んでいいですよ').build()

def welcome():
    return QuestionSpeech('こんばんは、今日も1日お疲れ様でした。何を飲みたいですか？').reprompt('よく聞こえませんでした').build()

def bye():
    return OneSpeech('おやすみなさい。飲み過ぎに気をつけて下さいね。').simple_card('遊んでくれてありがとう!').build()

def lambda_handler(event, context):
    request = event['request']
    request_type = request['type']
 
    if request_type == 'LaunchRequest':
        return welcome()
    elif request_type == 'IntentRequest':
        intent_name = request['intent']['name']
        # 焼酎が何杯飲めるか確認するためのインテントを指定する
        if intent_name == 'ShochuIntent':
            return shochu()
        # 缶ビール(350ml)が何杯飲めるか確認するためのインテントを指定する
        elif intent_name == 'BeerIntent':
            return beer()
        # 日本酒が何合飲めるか確認するためのインテントを指定する
        elif intent_name == 'SakeIntent':
            return sake()
<snip>
```

`shochu_count`,`beer_count`,`sake_count`には、`Strava`からAPIで消費カロリーの情報を引っ張って来て、下表の参考値から杯・合数を計算しています。

| お酒の種類 |   量   |  カロリー  |
|:--------:|:------:|:-------:|
| 焼酎      | 100ml  | 139kcal |
| ビール     | 350ml  | 140kcal |
| 日本酒    | 1合     | 196kcal |

・・・と書きたかったんですが、　`Strava API`周りの処理を書いているところでタイムアップとなってしまいました。
また、正確な1日の消費カロリーを元に計算するために、`MyFitnessPal API`を使用したかったのですが、[API使用に関するリクエスト](https://www.myfitnesspal.com/api)の承諾が間に合いませんでした(トホホ:sob:

`alexa developer console`からの動作テストと、`Echo Dots`でAlexaが応答するところまでは確認したので、軽く紹介しておきます。

## 文字ベースでの動作テスト

以下の様に、`alexa developer console`の`テスト`タブからチャット形式で動作テストが行なえます。
スキルI/Oも入力するたびに更新されるので、データのやり取りがどの様になっているのかが追えて良いですね。

![スクリーンショット 2018-12-20 0.19.02.png](https://qiita-image-store.s3.amazonaws.com/0/159313/9d021d53-a78e-a5b2-801c-c0b6245e7f7f.png)

## 実機で動かすための準備

`alexa developer console`の`公開`タブからベータテストの設定を行います。

### 日本語(日本)

![developer.amazon.com_alexa_console_ask_publish_alexapublishing_amzn1.ask.skill.f2dea38e-d3bc-4a15-9b4b-d1353eccd33f_development_ja_JP_privacy.png](https://qiita-image-store.s3.amazonaws.com/0/159313/003577c6-88cc-6a24-3f1b-968a3ae65093.png)

### プライバシーとコンプライアンス

![developer.amazon.com_alexa_console_ask_publish_alexapublishing_amzn1.ask.skill.f2dea38e-d3bc-4a15-9b4b-d1353eccd33f_development_ja_JP_privacy (1).png](https://qiita-image-store.s3.amazonaws.com/0/159313/7a8a4bef-af74-4dbf-f93d-6f9e16e92e7b.png)

### 公開範囲

設定情報が問題なく、`alexa developer console`の`検証`タブで以下の通り「エラーは見つかりませんでした」と表示されていればベータテストが行えるようになるため、ベータテストを登録します。

![スクリーンショット 2018-12-20 0.35.56.png](https://qiita-image-store.s3.amazonaws.com/0/159313/1507d466-5b24-02ca-f057-c17a881c842d.png)

公開範囲メニューから、`Echo Dots`に登録されているアカウントのメールアドレスを登録し、招待します。
`Echo Dots`のメニューから、ベータテスト中のスキルを選択すれば`Echo Dots`で`Alexaスキル`が使えるようになります。

![developer.amazon.com_alexa_console_ask_publish_alexapublishing_amzn1.ask.skill.f2dea38e-d3bc-4a15-9b4b-d1353eccd33f_development_ja_JP_availability.png](https://qiita-image-store.s3.amazonaws.com/0/159313/fe09d60e-174c-f628-52f2-99338cd63900.png)

## Echo Dotsでの動作

Alexaに話しかけてみましょう。
今日1日の頑張りをAlexaが労いつつ、飲んで良いお酒の量を教えてくれます。
飲みすぎないように、程よく飲みましょう:beer::sake::wine_glass::cocktail:

# おわりに

データ取得周りの実装が間に合いませんでしたが、Alexaとは仲良くなれたと思います。
今回試してみて、`Strava API`でも色々やれそうなことがわかったので、後日また色々いじってみるかもしれません。
トホホ記事になってしまいましたが、最後まで読んでいただきありがとうございました:sweat_smile:

明日のアドベントカレンダー21日目は @shusuke_otani さんです。