【大阪】スマートスピーカーミーティング 2020/01/30 のLTの資料です。AlexaのSkill Connectionsを試してみた話です。
Skill Connectionsやってみたスマートスピーカーミーティング 1/31 LT
View Slide
About Myself1
Kuniaki Shimizu (@kun432)- シナジーマーケティング株式会社- インフラエンジニア- Twitter/Facebook/Github/Hatena/Alexa- ポートフォリオ: https://kun432.github.io/- AWS認定Alexaスキルビルダー- Voiceflow Global Ambassador- Voiceflow Growth Award 20193Hello!
My Skills & Actions4- Alexa (JP): 12- Google: 1 - Clova: 1#スキル開発100チャレンジ- Alexa (US): 1
● 本資料内における意見・発言等は個人の見解であり、所属する組織・団体の見解を代表するものでは、ありません。● 今日はVoiceflowの話はしません、多分。5Disclaimer
Skill Connectionsやってみた2
最初にアンケート7
8
ですよねー9
Skill Connectionsおさらい10● 単純にいうと、スキル間連携● スキルAから、スキルBの機能を使うためにスキルBを起動する● スキルBの処理が終わるとスキルAに戻る● 用語○ プロバイダ(上で言うB)■ 他のスキルへ機能を提供○ リクエスタ(上で言うA)■ 他のスキルの機能を呼び出す
11連携開始連携中連携後印刷インテントトリガーディレクティブ送信(StartConnection)印刷インテントハンドラレスポンスハンドラ(SessionResumedRequest)処理を続ける● リクエスタはconnectionエンドポイントに要求を投げる● プロバイダはAlexaが決めて、要求を受け渡す● プロバイダの実行結果をAlexaから受け取って処理を継続Skill Connectionsの仕組みセッション切断ABA処理結果
今回はプリンタスキルと連携するリクエスタやってみた※プロバイダだと両方作らないといけない※プロバイダ側は特別な審査が必要らしい12
13
14リクエスタの実装const continueIntentHandler = {・・・handle(handlerInput) {const speakOutput = 'それではプリンタスキルを呼び出して印刷します。';return handlerInput.responseBuilder.speak(speakOutput).addDirective({'type': 'Connections.StartConnection','uri': 'connection://AMAZON.PrintPDF/1','input': {'@type': 'PrintPDFRequest','@version': '1','title': 'サンプルのPDF','description': 'スキルコネクションズのサンプルのPDFです。','url': 'https://******.s3-ap-northeast-1.amazonaws.com/sample1.pdf'},'token': 'none'}).getResponse();
15const ConnectionsResponseHandler = {canHandle(handlerInput) {const request = handlerInput.requestEnvelope.request;return request.type === 'SessionResumedRequest';},handle(handlerInput) {const statusCode = handlerInput.requestEnvelope.request.cause.status.code;const statusMessage = handlerInput.requestEnvelope.request.cause.status.message;console.log(`SessionResumedRequest: code: ${statusCode}, msg: ${statusMessage}`;let speechText; switch (statusCode) {case “200”: // 購入したspeechText = "印刷が終わりました。ご利用ありがとうございました。";break;case “204”: // ユーザキャンセルspeechText = "またご利用くださいね。";Break;・・・Default: // その他エラーspeechText = "ごめんなさい、うまく行かなかったようです。";break; }return handlerInput.responseBuilder.speak(speechText).getResponse();},};
16ん?なんかこれ見たことない?
ISPやってみた&VoiceflowでもISPスマートスピーカーミーティング #13 9/26 LT再掲
18課金処理前課金処理中課金処理後購入インテントトリガーディレクティブ送信(type=Connections.SendRequest)購入インテントハンドラレスポンスハンドラ(type=Connections.Response)getResponseで会話フローをつなげる商品・料金説明、同意確認認証コード確認課金処理● スキル側でやるのは購入処理の手前と後だけ● 購入処理も一連のやり取りもAlexa⇔ユーザでやってくれるスキル内課金のやりとりセッション切断再掲
19MonetizationServiceClient● 購入をMonetizationServiceClientにリクエストconst BuyEnglishPackIntentHandler = {・・・handle(handlerInput) {const locale = handlerInput.requestEnvelope.request.locale;const ms = handlerInput.serviceClientFactory.getMonetizationServiceClient();return ms.getInSkillProduct(locale, ENGLISH_PACK_ID).then(function (product) {if (product.entitled === "ENTITLED") {const speechText = `既に${product.name} を購入しています。続けますか?`;const repromptText = `続けますか?`;return handlerInput.responseBuilder.speak(speechText).reprompt(repromptText).getResponse();} else {return handlerInput.responseBuilder.addDirective({type: 'Connections.SendRequest',name: 'Buy',payload: { InSkillProduct: { productId: ENGLISH_PACK_ID } },token: 'correlationToken'}).getResponse();}});}};再掲
20.getResponse();} else {return handlerInput.responseBuilder.addDirective({type: 'Connections.SendRequest',name: 'Buy',payload: { InSkillProduct:{ productId: ENGLISH_PACK_ID } },token: 'correlationToken'}).getResponse();}});再掲
21ISPもAmazon Payも内部的にはConnections
Skill Connectionsの良いところ22● 自分で実装しなくて良いのはやっぱり楽○ ハードウェア連携は特に○ プロバイダが増えれば機能を増やせる● ISPとかやってれば実装そんなに難しくない。○ プロバイダ側への受け渡し部分とプロバイダ側は勝手にやってくれる○ リクエスタは所定のフォーマットで投げて、結果に応じて続けるだけ。● プロバイダもAlexaがよしなに選んでくれるし、今のところ、パターンも少ないので比較的かんたん。
Skill Connectionsの難しいところ23● 会話の流れがつかみにくい○ リクエスタとプロバイダが両方しゃべる。○ 受け渡し時のAlexa側の発話もある。○ テスト用のタスク(AMAZON.TestStatusCode)を使って確認○ プロバイダ側独自のステータスコードも。○ 実際にテストしながら発話の自然さをチェック。● 連携時は、セッション切れるので要対応○ Persistent Attribute● プロバイダ少なすぎ、実質プリンタだけじゃね?
いろいろしゃべる24
いろいろしゃべる25リクエスタ側プロバイダ側ASK側
現在サポートされているタスク26● 印刷系○ AMAZON.PrintImage○ AMAZON.PrintPDF○ AMAZON.PrintWebPage● 予約系○ AMAZON.ScheduleTaxiReservation○ AMAZON.ScheduleFoodEstablishmentReservation
27その他つまづいたところ● 利用開始までのプロセスが長い○ プリンタのWiFi接続設定○ プリンタ側のアカウント登録○ アカウントリンク○ スキル有効化までのハードルが高い、ここでくじける人が一定数いるはず● 情報がない・・・○ DevSummit以来、特に話なくない?○ ドキュメントが少なすぎるし、サンプルも微妙○ Githubのサンプルコード欲しい
28モチベーションが・・・
29なんで今日この話?
30https://developer.amazon.com/en-US/blogs/alexa/alexa-skills-kit/2019/12/Create-Custom-Connected-Skill-Experiences-with-Tasks-and-Direct-Skill-Connections
31Custom Tasks & Direct Connections● Custom Tasks○ Skill Connectionsにおけるプロバイダーが提供する機能のこと○ これまで限定された機能(プリンターへの印刷、レストラン/タクシーの予約)しかなかったのが、自分で定義できるようになった○ “ask api search-task/get-task” でタスクを探して使う● Direct Connections○ Skill Connectionsでは、Amazonが用意していたプロバイダー・タスクが選択される○ Direct Connectionsは、リクエスターがプロバイダー・タスクを選択できる
32そして
33Alexa Conversationsへhttps://robotstart.info/2019/06/06/alexa-cross-skill-conversations.html
まとめ3
35まとめ● Skill ConnectionsでやってることはISPと似てる。ISPやったことがあれば実装は難しくない、多分● 現状ではユースケースが限定的。印刷ぐらいしかない上、プリンタスキル使ってる人どんだけー● でもCustom Tasks & Direct Connections出てきたら可能性が広がるし面白くなるはず● 将来的なAlexa Conversationとか見据えて、単機能なスキル企画・開発に慣れておくそのうち役に立つかも、知らんけど
36まとめ● Skill ConnectionsでやってることはISPと似てる。ISPやったことがあれば実装は難しくない、多分● 現状ではユースケースが限定的。印刷ぐらいしかない上、プリンタスキル使ってる人どんだけー● でもCustom Tasks & Direct Connections出てきたら可能性が広がるし面白くなるはず● 将来的なAlexa Conversationとか見据えて、単機能なスキル企画・開発に慣れておくそのうち役に立つかも、知らんけど
お知らせ4
382/9 AAJUG大阪Alexaスキル開発ごった煮トーク
392/29 技術書典8 (Day1あ09)● 豪華執筆陣!● 165P、1000円(予定)
403/21 Voice Con Japan 2020
Thanks!Any questions?