するめごはんのIT日記

主にITネタを書いていくのさ

Alexaで位置情報を取得するReal-Time Location Services for Alexa Skillsの設定と流れるJSON

ごきげんよう

この記事は
ADVENTARの「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」
の24日目の記事です。

AlexaDevSummitの1日目で会場をふらふらしてたら、岡本さんから
「showさんやばいっす!これみてくださいよ!!」
と、ノートPCを開きながらめっちゃ興奮されてたので、そのPCをみたらAlexaが位置情報に対応してた画面でした。

岡本さんありがとうございました。

僕もその日の夜に「おおおー」となってました。

で、既に試されてる方々がブログに上がっているわけですが、僕は僕で改めて試して、流れるJSONがたしかに変わったなーと思ったのでここに記載します。

Real-Time Location Services for Alexa Skills

これについては公式のサイトをみてください。

Enhance Your Customer Experience with Real-Time Location Services for Alexa Skills : Alexa Blogs

先に確認できた記事類

これらをみればわかると思います。

■情報提供元、岡本さんの記事
・Alexaから位置情報を取得可能になったので試してみた

alexa.wp-kyoto.net

■さっそくためした @MYamate_jp さんの記事
・Alexa Real Time Location Serviceを使う

qiita.com

■ @MYamate_jp さんの他の記事
・Alexa Skill開発でよく使いそうな関数をまとめたnpmモジュールを作った

qiita.com

僕も試してみた

まず、APL対応した画面を、スマートスピーカーを遊びたおす会で録画したかったがためのスキル
「ヒロインのテスト」
で、試します。

が、別に何でもいいです。SDK v2であるだけです。

1.Alexa Developer Consoleのアクセス権限を押す

いつもの左下箇所です。

f:id:surumegohan:20181224203450p:plain
アクセス権限を押す

2.位置情報のトグルをONにする

いつの間にか、しれっとでてきていた、位置情報サービスのトグルをONにします。

f:id:surumegohan:20181224203514p:plain
位置情報サービスのトグルをON

3.LambdaでJSONを確認してみる

単純にJSONの中身を出力します。

console.log(JSON.stringify(handlerInput));

LaunchRequestのHandlerにでも入れてみてください。

4.スマホからスキルを起動する

スマホからスキルを起動してみたら "alexa::devices:all:geolocation:read" が追記されていました。
が、アクセス権を許可していないのでDENIEDになっています。

    "requestEnvelope": {
        "version": "1.0",
        "session": {
            "new": true,
            "sessionId": "amzn1.echo-api.session.fad41c95-9292-XXXXXXXXXXXXXXX",
            "application": {
                "applicationId": "amzn1.ask.skill.fd6f4522-518c-XXXXXXXXXXXXXX"
            },
            "user": {
                "userId": "amzn1.ask.account.XXXXXXXXXXXXXXXX",
                "permissions": {
                    "scopes": {
                        "alexa::devices:all:geolocation:read": {
                            "status": "DENIED"
                        }
                    }
                }
            }
        },
        "context": {
            "System": {
                "application": {
                    "applicationId": "amzn1.ask.skill.fd6f4522-518c-40b3-8508-71e6d205ed1e"
                },
                "user": {
                    "userId": "amzn1.ask.account.XXXXXXXXXXXXXX",
                    "permissions": {
                        "scopes": {
                            "alexa::devices:all:geolocation:read": {
                                "status": "DENIED"
                            }
                        }
                    }
                },
                "device": {
                    "deviceId": "amzn1.ask.device.XXXXXXXXXXXXXXXXXX",
                    "supportedInterfaces": {
                        "Geolocation": {}
                    }
                },
                "apiEndpoint": "https://api.fe.amazonalexa.com",
                "apiAccessToken": "XXXXXXXXXXXXXXXXXXXXXXXXX"
            }
        },

5.スマホのAlexaで位置情報を許可してみる

スマホ(僕はAndroid)のAlexaスキルアプリを呼び出して、スキルへの位置情報提供を許可します。

一応、スクリーンショットをとってみました。
まずは起動してメニューを表示しましょう。

f:id:surumegohan:20181224203616p:plain
いつも通りまずはメニューを開く

上記で「スキル・ゲーム」を選びます。

f:id:surumegohan:20181224203645p:plain
お馴染みのスキルストア

はい。いつもの画面です。
ここでいつも通り、有効なスキルを選びましょう。

今回の「ヒロインのテスト」は開発中のスキルなので
開発スキル を選びます。

f:id:surumegohan:20181224203715p:plain
開発中のスキルを選択

そして、画面をスクロールして目的のスキルを選びましょう。

f:id:surumegohan:20181224203742p:plain
自分の開発中のスキルを選ぶ

目的のスキルを選んだら、グレーになっている「設定」をタップ。
※個人的に選べなさそうな色にみえる。

f:id:surumegohan:20181224203804p:plain
「設定」をタップ

Alexa Developer Consoleで位置情報サービスのトグルをONにしているので、権限を聞かれます。
ここで位置情報サービスの権限を許可して保存します。

f:id:surumegohan:20181224203826p:plain
位置情報サービスの権限を許可する

スマホで位置情報が取得できているなら、位置情報サービスのアクセス権に許可がされたことが確認できます。

f:id:surumegohan:20181224203849p:plain
有効にされた画面

6.もう1回、スマホからスキルを呼び出してみる

再度スマホから、「ヒロインのテスト」を起動します。

するとJSONが変化しています。

"alexa::devices:all:geolocation:read"がGRANTEDに変化して、位置情報のJSONとしてGeolocationが追記されています。

※位置情報の有効桁数はそのままで、適当な数字をいれてます。

    "requestEnvelope": {
        "version": "1.0",
        "session": {
            "new": true,
            "sessionId": "amzn1.echo-api.session.0c9XXXXXXXXXXXXXXXX",
            "application": {
                "applicationId": "amzn1.ask.skill.XXXXXXXXXXX"
            },
            "user": {
                "userId": "amzn1.ask.accounXXXXXXXXXXXXXXXXXXXXXX",
                "permissions": {
                    "consentToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "scopes": {
                        "alexa::devices:all:geolocation:read": {
                            "status": "GRANTED"
                        }
                    }
                }
            }
        },
        "context": {
            "System": {
                "application": {
                    "applicationId": "amzn1.asXXXXXXXXXXXXXXXXXXXXXXXX"
                },
                "user": {
                    "userId": "amzn1.ask.account.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "permissions": {
                        "consentToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
                        "scopes": {
                            "alexa::devices:all:geolocation:read": {
                                "status": "GRANTED"
                            }
                        }
                    }
                },
                "device": {
                    "deviceId": "amzn1.ask.device.AXXXXXXXXXXXXXXXXXXXXXXXXX",
                    "supportedInterfaces": {
                        "Geolocation": {}
                    }
                },
                "apiEndpoint": "https://api.fe.amazonalexa.com",
                "apiAccessToken": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            },
            "Geolocation": {
                "timestamp": "2018-12-24T10:12:06Z",
                "coordinate": {
                    "latitudeInDegrees": 79.1235586,
                    "longitudeInDegrees": 283.1111355,
                    "accuracyInMeters": 33.1111104196167
                },
                "altitude": {
                    "altitudeInMeters": 40.111111525878906,
                    "accuracyInMeters": 29.23455004196167
                },
                "heading": {
                    "directionInDegrees": 0
                },
                "speed": {
                    "speedInMetersPerSecond": 0
                }
            }
        },
        "request": {
            "type": "LaunchRequest",
            "requestId": "amzn1.echo-api.request.XXXXXXXXXXXXXXXXXXX",
            "timestamp": "2018-12-24T10:13:44Z",
            "locale": "ja-JP",
            "shouldLinkResultBeReturned": false
        }
    },

位置情報っぽいような数値がたくさんでてきましたが、個人的にアツいと思っているのが
speedInMetersPerSecond です。

まだドキュメントを読んでいないので正確なことはわからないのですが、そのまま解釈すると1秒当たりの移動速度がメートル単位ででてくる・・・??マジで?

となると、例えば車などの乗り物に搭載されたAlexaデバイスとかも想定してるのだろうかと個人的には考えています。

というわけで

位置情報を使ったスキルを組み込むことが可能になったと思われます。
もちろん日本語版で。

となるとエラーハンドリングとかも大変そうですが、IoTやりたい勢としては実世界との融和性が高まるので・・オラ、わくわくしてきたぞ!

以上です。