もふもふ技術部

IT技術系mofmofメディア

【Amazon Echo入門#7】Alexaちゃんにカイジに「ざわざわ」を演出してもらうスキルを実機で動かす

zawa

ついに ねんがんの アマゾンエコーをてにいれたぞ!

正確に言うと、こんな募集を出したところ

rental

友人であるちくちゅうさんが貸してくださいました。本当にありがとうございます!!

chikuchu

というわけで、このAmazon Echo Alexa入門シリーズで実際に開発した、カイジのざわざわを演出するスキルをついに実機で動かしてみようと思います。

こちらが完成品。

初期設定して動くようにする

とりあえずUSBケーブルをつなげてONにして話しかけてみたが反応しない。しばらく待つとAlexaアプリをインストールせよと言われる。だが実はPCでも設定できるのを知っているので無視してPCから設定を進める。

まず、https://alexa.amazon.co.jp/ を開いて、Amazonアカウントでログイン。

こんな画面が開くので、「新しいデバイスをセットアップ」をクリック。

start-setup

どのEchoかを選択する画面。今回はdotをお借りしたのでdotを選択。

select-type

言語を日本語に設定し、wifiの設定に続きます。

一旦Echoに直接接続する。

amazon-gbw

PCの画面からwifiの設定が出来るので、自宅やら職場やらのwifi接続情報を入力。

wifi-setup

完了画面が出ればOK。

complete

その後動画を見ろと行ってくるが、永遠にぐるぐるしてやがるので無視してホームに戻ろう。別に見なくても大丈夫。

movie

これで既に動くようになっているので、「Alexa、こんにちは」とか話しかけてみよう。認識精度めっちゃいい。これで何度もHey Hey言わなくて済みますね!

カスタムスキルが動くようにする

Alexaの開発者コンソールで既にスキル開発していれば、自動的に「有効なスキル」に入ってるみたい。

skills

enable-skills

Alexaに話しかけてみる。

わし「アレクサ、ざわざわするやつ開いて」 Alexaたん「スキルからの応答に問題があります」

ふーむ。とりあえずLambdaの実行ログがCloudWatchに入ってるみたいなので、エラーログを探すと該当箇所見つかった。

'intent': KeyError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 5, in lambda_handler
intent = intent_request['intent']
KeyError: 'intent'

cloud-watch

Alexaからのリクエストにintentが含まれていないのが原因ということが分かった。どうやらLaunchRequestというものがあって、Alexaに最初に話しかけて、どのスキルを発動するのかを選択されたときのリクエストらしい。そしてLaunchRequestにはintentが含まれない。

解決方法としては、このざわざわスキルは特にスロット(変数)を必要とせず、起動したらざわざわするだけだから、intentが含まれないリクエストが来た場合も、ざわざわするようにLambdaのコードを修正した。

lambda_function.py

def lambda_handler(event, context):
    intent_request = event['request']
    intent = intent_request.get('intent')
    intent_name = 'GetNewFactIntent'
    if intent != None:
        intent_name = intent_request['intent']['name']

    if intent_name == "GetNewFactIntent":
        response = {
            'version': '1.0',
            'response': {
                "outputSpeech": {
                    "type": "SSML",
                    "ssml": "<speak> <audio src=\"https://s3-ap-northeast-1.amazonaws.com/for-alexa/zawazawa_conv.mp3\" /> </speak>"
                },
            }
        }
    elif intent_name == "HelpIntent":
        session_attributes = {}
        card_title = "Welcome"
        speech_output = "ざわざわするやつをご利用いただきありがとうございます。"
        reprompt_text = "ざわざわするやつをスタート、と話しかけてください。"
        should_end_session = False
        response = build_response(session_attributes, build_speechlet_response(
            card_title, speech_output, reprompt_text, should_end_session))
    else:
        raise ValueError("Invalid intent")

    return response

ちなみにLambdaのテストのテンプレートで、Alexa Start Sessionというのがあるので、これでLaunchRequestで飛んでくるリクエストっぽいのをテスト出来ます。このテストを実行してエラー吐かなければOK。

start-session-test

一通り動作することを確認したら実機に再挑戦。

わし「アレクサ、ざわざわするやつスタート」 Alexaたん「ざわ・・・ざわ・・・」

できたあああああああああああ!!!

呼び出し名について

Alexaたんにはスキルを開始するときにの呼び出し名というのがあって、「{呼び出し名}を開始」とか「{呼び出し名}をスタート」という風に話しかけます。この後ろの「開始」とか「スタート」とかはAlexa側で固定で設定されてるみたい。

どんなワードで起動できるのは以下サイトに一覧が書いてあった。

http://redorereadblog.hatenablog.jp/entry/2017/10/31/090312

Amazonの公式情報はこっち。

ユーザーによるカスタムスキルの呼び出し