LoginSignup
14
7

More than 5 years have passed since last update.

「Alexaから新型ゾイドをボイスコントールするシステム」を作ってみた

Last updated at Posted at 2018-06-24

Amazon Echo(Alexa)、AWS Lambda、IFTTT、Sony MESH、ZOIDS(ゾイドワイルド ワイルドライガー)を使用して、「Alexaからゾイドをボイスコントロールするシステム」を作ってみました。

zoid1.png

使い方

使い方を解説します。

Amazon Echoに話しかけ、Alexaスキルを起動し、命令します。

(私) 「アレクサ、ジャービスを起動」
(Echo)「ジャービスです、いかがなさいましたか?」
(私) 「ゾイドを起動!」
(Echo)「承知しました。ワイルドライガーを発進します」
  ↓
ゾイドが動く!!

zoid3.PNG

こちら動画です。

システムの概要図は以下の通りです。

zoid2.png

作り方

Alexaスキルを作成

スキル作成には、以下の書籍を参考にさせていただきました。
●スマートスピーカー × AIプログラミング ~自分でつくる人工知能 Amazon Echo、Google Home対応~

Alexaスキルの作成の詳細は省略します。
概要だけ記載します。

  1. スキルの呼び出し名を設定します。今回は「ジャービス」にしました
    ※ 別のスキルと呼び出し名が被っていると誤動作する原因になります。別の名前にするのが無難です

  2. インテントに、新たに「zoidStart」を追加します。このインテントでゾイドを起動させます

  3. サンプル発話に、「ゾイドを起動」と設定します

  4. これでビルドすれば、スキル作成完了です。Amazon Echoのアプリから「DEVスキル」をチェックし、作成したスキルを有効化します

  5. 最後にエンドポイントにAWS Lambdaのアドレスを設定します。ここには後ほど作成するLamda関数のアドレスを設定します

作成した内容のJSONは以下の通りです。
単純にインテントを新たにひとつ作成しただけになります。

JSONエディター
{
    "interactionModel": {
        "languageModel": {
            "invocationName": "ジャービス",
            "intents": [
                {
                    "name": "AMAZON.CancelIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.HelpIntent",
                    "samples": []
                },
                {
                    "name": "AMAZON.StopIntent",
                    "samples": []
                },
                {
                    "name": "zoidStart",
                    "slots": [],
                    "samples": [
                        "ゾイドを起動"
                    ]
                }
            ],
            "types": []
        }
    }
}

AWS Lambda関数の作成

Lambda関数作成には、以下のサイトを参考にさせていただきました。
●Alexa Skills Kit入門シリーズ(Python、AWS Lambda使用)

AlexaとIFTTTをつなげたいので、必ずしもLambda関数は必要ではありません。
しかし、AlexaとIFTTTをダイレクトにつなぐと、Alexaから望みの応答音声を出力できないなど、自由度が低くなります。

そこでAlexaに自由な音声応答を返してもらうために、Lambda関数を間に挟みます。

私はPythonで作るのが慣れているので、Lambda関数もPythonで作成しました。

ポイントは
・立ち上げの「LaunchRequest」に対しては、'shouldEndSession': False を明示して、会話を続けるようにすること
・urllib.requestを使って、IFTTTにPOSTすること
です。

AWS_Lambda
# Alexaからeventを受け取り、zoidを起動するJSONをAlexaに返却する。同時にIFTTTを叩く
# 参考:https://qiita.com/hoto17296/items/8fcf55cc6cd823a18217
# 参考:http://tech.mof-mof.co.jp/blog/amazon-echo-alexa-skill-trash-day.html

import json
import urllib.request


def lambda_handler(event, context):
    if event['request']['type'] == "LaunchRequest":
        response = {
            'version': '1.0',
            'response': {
                'outputSpeech': {
                    'type': 'PlainText',
                    'text': 'ジャービスです。いかがなさいましたか?'
                },
                'shouldEndSession': False    
            },

        }
        return response

    else:
        intent = event['request']['intent']['name']  # intentの取得


        if intent == "zoidStart":
            # Alexaに返すJSONを作成
            response = {
                'version': '1.0',
                'response': {
                    'outputSpeech': {
                        'type': 'PlainText',
                        'text': '承知しました。ワイルドライガーを発進します'
                    }
                }
            }

            # IFTTTを叩く
            url = 'https://maker.ifttt.com/trigger/zoid_start_ifttt/with/key/[個人のIFTTTのWebhookのIDみたいなの]'
            data = {}  # JSONの中身はとくになし
            headers = {
                'Content-Type': 'application/json',
            }

            req = urllib.request.Request(url, json.dumps(data).encode(), headers)
            with urllib.request.urlopen(req) as res:
                body = res.read()

            return response
        else:
            raise ValueError("Invalid intent")

IFTTTのWebhook作成

続いてIFTTTのWebhookを作成します。

このWebhookはLambda関数からのpostを受けて、Sony MESHにイベントを送ります。

Webhook作成には、以下のサイトを参考にさせていただきました。
●SONY MESHのGPIOタグとスマホで本格IoT!大事な人の位置を知らせるメーターを作ろう!

Sony MESHのアプリ作成

続いてSony MESHのアプリを作成します。MESHタグには汎用なGPIO(General Purpose Input Output)タグを使用します。

GPIOのアプリ作成にはIFTTTと同じく、以下のサイトを参考にさせていただきました。
●SONY MESHのGPIOタグとスマホで本格IoT!大事な人の位置を知らせるメーターを作ろう!

P_20180624_121314.jpg

ゾイドとMESH GPIOをつなぐ

ここはMESH GPIOタグ用モータドライバを使用し、ゾイドの電池ボックスのプラスマイナスの端子にワニ口クリップで強引に接続しました。

GPIOと電池ボックスをひっぱっていて、カッコ悪いのはご愛敬ということで・・・

zoid3.PNG

以上で完成です。

画像引用
http://takaratomymall.jp/shop/g/g4904810111955/
http://monoist.atmarkit.co.jp/mn/articles/1509/16/news139.html

14
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
7