Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Skill Connectionsやってみた / Introduction to Alexa's Skill Connection

Skill Connectionsやってみた / Introduction to Alexa's Skill Connection

【大阪】スマートスピーカーミーティング 2020/01/30 のLTの資料です。AlexaのSkill Connectionsを試してみた話です。

Kuniaki Shimizu

January 30, 2020
Tweet

More Decks by Kuniaki Shimizu

Other Decks in Technology

Transcript

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

    View Slide

  2. About Myself
    1

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. Skill Connections
    やってみた
    2

    View Slide

  7. 最初にアンケート
    7

    View Slide

  8. 8

    View Slide

  9. ですよねー
    9

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. 13

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. 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();
    }
    });
    }
    };
    再掲

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. いろいろしゃべる
    24

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  29. 29
    なんで今日この話?

    View Slide

  30. 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

    View Slide

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

    View Slide

  32. 32
    そして

    View Slide

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

    View Slide

  34. まとめ
    3

    View Slide

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

    View Slide

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

    View Slide

  37. お知らせ
    4

    View Slide

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

    View Slide

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

    View Slide

  40. 40
    3/21 Voice Con Japan 2020

    View Slide

  41. Thanks!
    Any questions?

    View Slide