kun432's blog

技術ネタ、読書記録、など。2015年から人生をやり直し中です。

大阪スマートスピーカーミーティング #10 で LTしてきた

f:id:kun432:20190607003324p:plain

今月も@gaomarさん主催の「大阪スマートスピーカーミーティング」でLTしてきました。今回でなんと10回目!すごい!

ちなみにここでの私のLTももう4回目になります。いつもありがとうございます!>@gaomarさん

資料

動画(その2の10:30〜33:00あたり)

その1

その2

動画の撮影、いつもありがとうございます!>@diberidarshiさん

内容

今回のきっかけは、ISAO中嶋さん(@aiminakajima)のこのツイートです。

中嶋さんが #AlexaSkillsUS というハッシュタグで、USのAlexaスキルを100個日替わりで紹介するという取り組みをされている中で紹介されていたこのスキル、非常にシンプルで実用的、またAPLで試してみるにも良い題材かなと思いトライしてみました。

あと、Alexa Day 2019 の "Alexa KoBuilder Challenge supported by 神戸市” で AAJUG 田尻さん(@ayaka_pespes)が発表されていたスキル「神戸のトイレマップ」でGoogle MapをAPL使って表示していたのを見て、前からマップ連携やってみたいなーと思っていたのもあります。

神戸のトイレマップ

神戸のトイレマップ

きっかけを頂いたお二人に感謝です!

詳細は資料をご覧ください。

補足

LTの中でいくつか端折ってしまったことがあるので、補足します。

ask-sdk-v2での住所の利用許可チェックについて

該当部分のコードはこんな感じです。

async handle(handlerInput) {
    const speechText = 'こんにちは。所在地情報のテストです。';
    const deviceId = handlerInput.requestEnvelope.context.System.device.deviceId;
    try{
        const deviceAddressServiceClient = handlerInput.serviceClientFactory.getDeviceAddressServiceClient();
        const address = await deviceAddressServiceClient.getFullAddress(deviceId);
        console.log(JSON.stringify(address));
        return handlerInput.responseBuilder
            .speak(speechText + "住所の取得に成功しました。")
            .getResponse();
    } catch (error) {
        if (error.name === 'ServiceError' && error.statusCode === 403) {
            return handlerInput.responseBuilder
                .speak('住所の利用が許可されていません。アレクサアプリの設定で許可してください。')
                .withAskForPermissionsConsentCard(['read::alexa:device:all:address'])
                .getResponse();
        } else {
            return handlerInput.responseBuilder
                .speak(speechText + "住所の取得に失敗しました。")
                .getResponse();
        }
    }
}

ざっくり言ってしまうと、「住所の許可されているかどうか?はとりあえず一回普通に住所を取りに行って、エラーが返ってきたら許可されていない」という判断です。以前の所在地情報の取得に関する記事をいくつか見てみると、住所の利用が許可されている場合、Alexaからのリクエストで context.System.user.permissionsの中にconsentTokenが含まれているのでこれをチェックするというのが一般的なのですが、Alexaの公式ドキュメント では、

重要: Alexaからのリクエストには、session.user.permissionsとcontext.System.user.permissions内にconsentTokenも含まれている場合があります。このプロパティは廃止になりました。consentTokenを使用する既存のスキルは引き続き機能しますが、代わりにcontext.System.apiAccessTokenプロパティが使用されます。

となっており、consentTokenを使うやり方はobsoleteになるようです。ではどうするのか、というと、

ユーザーがスキルに権限を付与しなかった場合のテストをするには、Alexaコンパニオンアプリでスキルのアドレス権限が有効になっていないことを確認してください。スキルを開くと(「アレクサ、skill_nameを開いて」)、LaunchRequestが送信されます。このリクエストにはdeviceIdの値とapiAccessTokenの値が含まれますが、apiAccessTokenは正しい権限を指定していません。このトークンをデバイスアドレスAPIに渡すと、403 Forbidden応答コードが返されます。

ということで、おそらく apiAccessToken の中に権限情報も含まれるのではないかと推測してますが、これを読み取ることはできないようで、上に書いたようなやり方になるのだろうと思います。エラーの場合でも、レスポンスコードをきちんとチェックするようにすれば、アクセス権限がないのか、その他のエラーなのかも判断できるんで、まあ良いのではないかと思います。

Voiceflowでの所在地情報の取得

Voiceflowの場合は書いてあるとおりですが、少しだけ補足。

_systemというドキュメント的にはどこにも書いてないオブジェクトをCode Blockから取得して、デバイスアドレスAPIを叩くために必要な情報を用意してますが、ここにヒントが有りました。

https://forum.getvoiceflow.com/t/getting-the-users-time-zone-in-your-skill/314

Voiceflowの情報源としてはfacebookが一番活発だと思いますが、フォーラムにもちょいちょいチュートリアル記事が上がるのでオススメです。(ただし英語)

ということで、Voiceflowで実際に作ってみたスキルの動画も貼っときます。

最後に

次回は7/25頃だそうです。もちろん参加しますし、LTします!個人的に、イベントでLTする!と決めてから、いろいろ調べたりスキル作ったり資料作ったり、という「LT駆動型開発」、納期もある中できちんとインプットとアウトプットができる感じになるので、とてもオススメです。

ネタ探しについても、今回取り上げた「所在地情報」自体は1年ぐらい前からできる新しくもなんともない今更感あるネタですけど、Voiceflowでやってみた、とか、実際にこういうものを作ってみた、とか、やってみたらいろいろ苦労した、とかっていう切り口で共有すれば役に立つ場合もあると思うし、調査してコード書いてまとめてというところで、自分の経験値にもなるので、気にせずやってみるといいと思います。

ということで、もし興味があれば是非スマートスピーカーミーティング、お越しください。みんなでゆるーく楽しみましょう!

今日もありがとうございました!