Slide 1

Slide 1 text

Skill Connectionsやってみた スマートスピーカーミーティング 1/31 LT

Slide 2

Slide 2 text

About Myself 1

Slide 3

Slide 3 text

Kuniaki Shimizu (@kun432) - シナジーマーケティング株式会社 - インフラエンジニア - Twitter/Facebook/Github/Hatena/Alexa - ポートフォリオ: https:/ /kun432.github.io/ - AWS認定Alexaスキルビルダー - Voiceflow Global Ambassador - Voiceflow Growth Award 2019 3 Hello!

Slide 4

Slide 4 text

My Skills & Actions 4 - Alexa (JP): 12 - Google: 1 - Clova: 1 #スキル開発100チャレンジ - Alexa (US): 1

Slide 5

Slide 5 text

● 本資料内における意見・発言等は個人の 見解であり、所属する組織・団体の見解 を代表するものでは、ありません。 ● 今日はVoiceflowの話はしません、多分。 5 Disclaimer

Slide 6

Slide 6 text

Skill Connections やってみた 2

Slide 7

Slide 7 text

最初にアンケート 7

Slide 8

Slide 8 text

8

Slide 9

Slide 9 text

ですよねー 9

Slide 10

Slide 10 text

Skill Connectionsおさらい 10 ● 単純にいうと、スキル間連携 ● スキルAから、スキルBの機能を使うために スキルBを起動する ● スキルBの処理が終わるとスキルAに戻る ● 用語 ○ プロバイダ(上で言うB) ■ 他のスキルへ機能を提供 ○ リクエスタ(上で言うA) ■ 他のスキルの機能を呼び出す

Slide 11

Slide 11 text

11 連携 開始 連携中 連携後 印刷インテントトリガー ディレクティブ送信 (StartConnection) 印刷インテントハンドラ レスポンスハンドラ (SessionResumedRequest) 処理を続ける ● リクエスタはconnectionエンドポイントに要求を投げる ● プロバイダはAlexaが決めて、要求を受け渡す ● プロバイダの実行結果をAlexaから受け取って処理を継続 Skill Connectionsの仕組み セッション切断 A B A 処理結果

Slide 12

Slide 12 text

今回はプリンタスキルと連携する リクエスタやってみた ※プロバイダだと両方作らないといけない ※プロバイダ側は特別な審査が必要らしい 12

Slide 13

Slide 13 text

13

Slide 14

Slide 14 text

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();

Slide 15

Slide 15 text

15 const 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(); }, };

Slide 16

Slide 16 text

16 ん?なんかこれ 見たことない?

Slide 17

Slide 17 text

ISPやってみた &VoiceflowでもISP スマートスピーカーミーティング #13 9/26 LT 再掲

Slide 18

Slide 18 text

18 課金 処理前 課金 処理中 課金 処理後 購入インテントトリガー ディレクティブ送信 (type=Connections.SendRequest) 購入インテントハンドラ レスポンスハンドラ (type=Connections.Response) getResponseで会話フロー をつなげる 商品・料金説明、 同意確認 認証コード確認 課金処理 ● スキル側でやるのは購入処理の手前と後だけ ● 購入処理も一連のやり取りもAlexa⇔ユーザでやってくれる スキル内課金のやりとり セッション切断 再掲

Slide 19

Slide 19 text

19 MonetizationServiceClient ● 購入を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(); } }); } }; 再掲

Slide 20

Slide 20 text

20 .getResponse(); } else { return handlerInput.responseBuilder .addDirective({ type: 'Connections.SendRequest', name: 'Buy', payload: { InSkillProduct: { productId: ENGLISH_PACK_ID } }, token: 'correlationToken' }) .getResponse(); } }); 再掲

Slide 21

Slide 21 text

21 ISPもAmazon Payも 内部的にはConnections

Slide 22

Slide 22 text

Skill Connectionsの良いところ 22 ● 自分で実装しなくて良いのはやっぱり楽 ○ ハードウェア連携は特に ○ プロバイダが増えれば機能を増やせる ● ISPとかやってれば実装そんなに難しくない。 ○ プロバイダ側への受け渡し部分とプロバイダ側 は勝手にやってくれる ○ リクエスタは所定のフォーマットで投げて、 結果に応じて続けるだけ。 ● プロバイダもAlexaがよしなに選んでくれるし、今 のところ、パターンも少ないので比較的かんたん。

Slide 23

Slide 23 text

Skill Connectionsの難しいところ 23 ● 会話の流れがつかみにくい ○ リクエスタとプロバイダが両方しゃべる。 ○ 受け渡し時のAlexa側の発話もある。 ○ テスト用のタスク(AMAZON.TestStatusCode) を使って確認 ○ プロバイダ側独自のステータスコードも。 ○ 実際にテストしながら発話の自然さをチェック。 ● 連携時は、セッション切れるので要対応 ○ Persistent Attribute ● プロバイダ少なすぎ、実質プリンタだけじゃね?

Slide 24

Slide 24 text

いろいろしゃべる 24

Slide 25

Slide 25 text

いろいろしゃべる 25 リクエスタ側 プロバイダ側 ASK側

Slide 26

Slide 26 text

現在サポートされているタスク 26 ● 印刷系 ○ AMAZON.PrintImage ○ AMAZON.PrintPDF ○ AMAZON.PrintWebPage ● 予約系 ○ AMAZON.ScheduleTaxiReservation ○ AMAZON.ScheduleFoodEstablishmentRes ervation

Slide 27

Slide 27 text

27 その他つまづいたところ ● 利用開始までのプロセスが長い ○ プリンタのWiFi接続設定 ○ プリンタ側のアカウント登録 ○ アカウントリンク ○ スキル有効化までのハードルが高い、ここでくじける人が一 定数いるはず ● 情報がない・・・ ○ DevSummit以来、特に話なくない? ○ ドキュメントが少なすぎるし、サンプルも微妙 ○ Githubのサンプルコード欲しい

Slide 28

Slide 28 text

28 モチベーションが・・・

Slide 29

Slide 29 text

29 なんで今日この話?

Slide 30

Slide 30 text

30 https://developer.amazon.com/en-US/blogs/alexa/alexa-skills-kit/2019/12/Create-Custom-Connected-Skill-Experiences-with-Tasks-and-Direct-Skill-Connections

Slide 31

Slide 31 text

31 Custom Tasks & Direct Connections ● Custom Tasks ○ Skill Connectionsにおけるプロバイダーが提供する 機能のこと ○ これまで限定された機能(プリンターへの印刷、レストラン/ タクシーの予約)しかなかったのが、自分で 定義できるようになった ○ “ask api search-task/get-task” でタスクを探して使う ● Direct Connections ○ Skill Connectionsでは、Amazonが用意していたプロバイ ダー・タスクが選択される ○ Direct Connectionsは、リクエスターがプロバイダー・タス クを選択できる

Slide 32

Slide 32 text

32 そして

Slide 33

Slide 33 text

33 Alexa Conversationsへ https://robotstart.info/2019/06/06/alexa-cross-skill-conversations.html

Slide 34

Slide 34 text

まとめ 3

Slide 35

Slide 35 text

35 まとめ ● Skill ConnectionsでやってることはISPと似てる。 ISPやったことがあれば実装は難しくない、多分 ● 現状ではユースケースが限定的。印刷ぐらいしかない 上、プリンタスキル使ってる人どんだけー ● でもCustom Tasks & Direct Connections出てきたら 可能性が広がるし面白くなるはず ● 将来的なAlexa Conversationとか見据えて、単機能な スキル企画・開発に慣れておく そのうち役に立つかも、知らんけど

Slide 36

Slide 36 text

36 まとめ ● Skill ConnectionsでやってることはISPと似てる。 ISPやったことがあれば実装は難しくない、多分 ● 現状ではユースケースが限定的。印刷ぐらいしかない 上、プリンタスキル使ってる人どんだけー ● でもCustom Tasks & Direct Connections出てきたら 可能性が広がるし面白くなるはず ● 将来的なAlexa Conversationとか見据えて、単機能な スキル企画・開発に慣れておく そのうち役に立つかも、知らんけど

Slide 37

Slide 37 text

お知らせ 4

Slide 38

Slide 38 text

38 2/9 AAJUG大阪 Alexaスキル開発ごった煮トーク

Slide 39

Slide 39 text

39 2/29 技術書典8 (Day1あ09) ● 豪華執筆陣! ● 165P、1000円(予定)

Slide 40

Slide 40 text

40 3/21 Voice Con Japan 2020

Slide 41

Slide 41 text

Thanks! Any questions?