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

Alexaの通知について考える / Retaining users with Alexa's Notification

Alexaの通知について考える / Retaining users with Alexa's Notification

【大阪】スマートスピーカーミーティング 2019/07/25 のLTの資料です。AlexaのリマインダーAPIを使ってユーザとの関係性を高めようという話をしてきました。もちろんVocieflowの場合もありますよ!

https://osaka-driven-dev.connpass.com/event/134869/

Kuniaki Shimizu

July 25, 2019
Tweet

More Decks by Kuniaki Shimizu

Other Decks in Technology

Transcript

  1. Alexaの通知について考える
    スマートスピーカーミーティング #11 7/25 LT

    View Slide

  2. アジェンダ
    1. 自己紹介
    2. Alexaの通知
    3. リマインダーをask-sdk/Voiceflowで
    やってみた
    4. まとめ
    5. お知らせ
    2

    View Slide

  3. About Myself
    1

    View Slide

  4. Kuniaki Shimizu (@kun432)
    - シナジーマーケティング株式会社
    - インフラエンジニア
    - Twitter/Facebook/Github/Hatena/Alexa
    - ポートフォリオ: https:/
    /kun432.github.io/
    4

    Hello!

    View Slide

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

    View Slide

  6. ● 本資料内における意見・発言等は個人の見
    解であり、所属する組織・団体の見解を代
    表するものでは、ありません。
    ● まともに説明すると結構深かったので、コー
    ドはサラッと、ポイントとなるとこだけかいつ
    まんで説明します。
    6
    Disclaimer

    View Slide

  7. Alexaの通知について
    2

    View Slide

  8. こんな経験ないですか?
    8

    View Slide

  9. こんな経験ないですか?
    9
    ● 利用者側
    ○ 有効にしたスキルの呼び出し名を間違える・
    思い出せない
    ○ スキル一覧を見て、有効にしたことを覚えて
    いないスキルがある
    ● 開発者側
    ○ スキルの利用者が増えない
    ○ スキルが継続的に利用されない、一定期間経つ
    と利用されなくなる

    View Slide

  10. スキルが利用されない理由
    10
    ● スキル名を覚えれない
    ○ VUIではそもそも覚えることが難しい
    ● 使うことを忘れる
    ○ トリガーは常にユーザ
    ● 視覚的な補助がない
    ○ 音声で簡単に有効化できてしまう
    ○ ホーム画面のようなものが存在しない
    ○ メラビアンの法則(55%は視覚から)
    ● 他の接点を作るのが面倒(メールとか)
    ユーザとの日常的な接点が非常に少ない

    View Slide

  11. スキルの継続的利用には
    ユーザとの接点を増やす
    ことが重要!
    11

    View Slide

  12. 通知を使おう!
    12

    View Slide

  13. Alexaの通知機能
    ● 以下の2種類
    13
    リマインダーAPI プロアクティブイベントAPI
    タイミングの決定 ユーザがスキル内で選択 外部から自由なタイミング
    で通知可能
    選択可能な
    通知タイミング
    ● 相対指定(現在からn秒後)
    ● 絶対指定
    ○ ○年○月○日○時○分○秒
    ○ 繰り返し(毎日・毎週)
    通知内容の柔軟性 ある程度柔軟に設定可能
    ※ただしルールはいろいろある
    決められたフォーマットから選択
    ※フォーマットが合うか次第
    実装範囲 スキルのみでOK
    ※外部から更新・削除は可能
    イベントを送るエンドポイントが必要
    (Lambdaでないとだめっぽい?)
    実装方法 ask-sdk v2のServiceClientFactory
    経由 or リマインダーAPI
    プロアクティブイベントAPI
    アクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)

    View Slide

  14. Alexaの通知機能
    ● 以下の2種類
    14
    リマインダーAPI プロアクティブイベントAPI
    タイミングの決定 ユーザがスキル内で選択 外部から自由なタイミング
    で通知可能
    選択可能な
    通知タイミング
    ● 相対指定(現在からn秒後)
    ● 絶対指定
    ○ ○年○月○日○時○分○秒
    ○ 繰り返し(毎日・毎週)
    通知内容の柔軟性 ある程度柔軟に設定可能
    ※ただしルールはいろいろある
    決められたフォーマットから選択
    ※フォーマットが合うか次第
    実装範囲 スキルのみでOK
    ※外部から更新・削除は可能
    イベントを送るエンドポイントが必要
    (Lambdaでないとだめっぽい?)
    実装方法 ask-sdk v2のServiceClientFactory
    経由 or リマインダーAPI
    プロアクティブイベントAPI
    アクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)
    今回はこっち

    View Slide

  15. Alexaの通知機能
    ● 以下の2種類
    15
    リマインダーAPI プロアクティブイベントAPI
    タイミングの決定 ユーザがスキル内で選択 外部から自由なタイミング
    で通知可能
    選択可能な
    通知タイミング
    ● 相対指定(現在からn秒後)
    ● 絶対指定
    ○ ○年○月○日○時○分○秒
    ○ 繰り返し(毎日・毎週)
    通知内容の柔軟性 ある程度柔軟に設定可能
    ※ただしルールはいろいろある
    決められたフォーマットから選択
    ※フォーマットが合うか次第
    実装範囲 スキルのみでOK
    ※外部から更新・削除は可能
    イベントを送るエンドポイントが必要
    (Lambdaでないとだめっぽい?)
    実装方法 ask-sdk v2のServiceClientFactory
    経由 or リマインダーAPI
    プロアクティブイベントAPI
    アクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)
    今回はこっち
    今回はこっち
    ※相対指定の事例は多いが
     こっちは少ない
    これを使う

    View Slide

  16. リマインダーを
    ask-sdk/Voiceflowで
    やってみた
    3

    View Slide

  17. Alexa開発者コンソール
    17
    ● アクセス権限で「リマインダー」をON

    View Slide

  18. Alexa開発者コンソール
    18
    ● インテントの確認を有効にする

    View Slide

  19. Alexaの通知機能
    ● 以下の2種類
    19
    リマインダーAPI プロアクティブイベントAPI
    タイミングの決定 ユーザがスキル内で選択 外部から自由なタイミング
    で通知可能
    選択可能な
    通知タイミング
    ● 相対指定(現在からn秒後)
    ● 絶対指定
    ○ ○年○月○日○時○分○秒
    ○ 繰り返し(毎日・毎週)
    通知内容の柔軟性 ある程度柔軟に設定可能
    ※ただしルールはいろいろある
    決められたフォーマットから選択
    ※フォーマットが合うか次第
    実装範囲 スキルのみでOK
    ※外部から更新・削除は可能
    イベントを送るエンドポイントが必要
    (Lambdaでないとだめっぽい?)
    実装方法 ask-sdk v2のServiceClientFactory
    経由 or リマインダーAPI
    プロアクティブイベントAPI
    アクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)
    再 掲

    View Slide

  20. リマインダーの確認
    20
    ● やり方は多分他にもあるが、2段階の確認が必要。
    ● 今回はスロットの確認を使った(CONFIRMATION)

    View Slide

  21. リマインダーの確認
    21
    ● やり方は多分他にもあるが、2段階の確認が必要。
    ● 今回はスロットの確認を使った(CONFIRMATION)
    審査に通るために
    必要なポリシー!
    ※もちろんこれ以外にもある

    View Slide

  22. ServiceClientFactoryを使う
    22
    exports.handler = Alexa.SkillBuilders.custom()
    .addRequestHandlers(
    ・・・)
    .addErrorHandlers(
    ErrorHandler)
    .withApiClient(new Alexa.DefaultApiClient())
    .lambda();
    ● ServiceClientFactory
    ○ Alexaの各種APIサービスへアクセスするための
    ask-sdk-v2のサービスクライアント
    ○ リスト、デバイスアドレス、リマインダー、プログレッシブ応
    答、スキル内課金などなど
    ○ 上記API叩くのに必要な処理をよしなにやってくれる
    ● custom()の場合は要初期化、standard()の場合は初期化不要
    以前の再 掲

    View Slide

  23. 権限と確認①
    23
    const ReminderIntentHandler = {
     ・・・
    },
    async handle(handlerInput) {
    const hhmm = handlerInput.requestEnvelope.request.intent.slots.hour.value; let hh, mm = hhmm.split(":");
    const consentToken = handlerInput.requestEnvelope.context.System.apiAccessToken;
    switch (handlerInput.requestEnvelope.request.intent.confirmationStatus) {
    case 'CONFIRMED':
    break;
    case 'DENIED':
    return handlerInput.responseBuilder
    .speak(`わかりました。リマインドはしないでおきますね。`)
    .getResponse();
    case 'NONE':
    default:
    console.log('NONE....');
    return handlerInput.responseBuilder
    .addDelegateDirective()
    .getResponse();
    }
    ・・・
    スキルのアクセス権
    とは別に、明示的な
    確認を取る。
    この例ではスロット
    の確認を使っている。

    View Slide

  24. 権限と確認②
    24
    if (!consentToken) {
    const speechText = 'ごめんなさい、このスキルでは、リマインダーへのアクセス権が’ +
    ‘必要になります。Alexaアプリのアクティビティーをご確認ください。';
    return handlerInput.responseBuilder
    .speak(speechText)
    .withAskForPermissionsConsentCard(PERMISSIONS)
    .getResponse();
    }
    スキルのアクセス権。カードを
    表示して、ユーザに
    アクセス権許可を促す
    handlerInput.requestEnvelope.context.System.apiAccessTo
    kenをAlexaの各種アクセス権許可の判断にしている例をよくみ
    るけど、単にAPIアクセストークンだから毎回飛んでくるし実際に
    はアクセス権許可の判断にはならないと思うんだよな・・・
    最低限必要だとしても、APIレスポンスの結果からの判断は必要
    だし、もっとかんたんに権限チェックできる方法はないものか
    ・・・・

    View Slide

  25. リマインダー設定(基本の流れ)
    25
    ・・・
    try {
    const client = handlerInput.serviceClientFactory.getReminderManagementServiceClient();
    〜〜〜リマインダーリクエストオブジェクトを作るための前処理〜〜〜
    const reminderRequest = {
         〜〜〜リマインダーリクエストオブジェクトの組み立て〜〜〜
    };
    const reminderResponse = await client.createReminder(reminderRequest);
    } catch (error) {
    if (error.name !== 'ServiceError') {
    console.log(`error: ${error.stack}`);
    const response = responseBuilder.speak(`ごめんなさい、エラーが発生しました。`).getResponse();
    return response;
    }
    throw error;
    }
    return handlerInput.responseBuilder
    .speak(`毎日 ${hhmm} にリマインドを設定しました。`)
    .getResponse();
    },
    };

    View Slide

  26. リマインダーオブジェクトの組み立て
    26
    const remindTime = moment({ hours: hh, minutes: mm}).add(1, 'minutes');
    const timeFormat = 'YYYY-MM-DDTHH:mm:ss.SSS';
    console.log('REQUEST_TIME: ' + moment().format(timeFormat));
    console.log('REMIND_TIME: ' + remindTime.format(timeFormat));
    const reminderRequest = {
    requestTime: moment().format(timeFormat),
    trigger: {
    type: 'SCHEDULED_ABSOLUTE',
    scheduledTime: remindTime.format(timeFormat),
    timeZoneId: 'Asia/Tokyo',
    recurrence: { freq: 'DAILY' },
    },
    alertInfo: {
    spokenInfo: {
    content: [{
    locale: "ja-JP",
    text: "リマインダーテストの時間"
    }]
    }
    },
    pushNotification: { status: 'ENABLED' }
    }
    SCHEDULED_ABSOLUTE
    で絶対指定
    未来であればOK(繰り返し
    の場合は意味はない)
    タイムゾーン指定すれば
    時間処理側では意識しなく
    て良い
    recurrenceで繰り返し
    “DAILY” or ”Weekly”
    “Weekly”は曜日も指定
    リマインドされる文字列
    ※色々要件あり

    View Slide

  27. サンプル動画
    27

    View Slide

  28. リマインダーのUXについて
    28
    ● リマインダーを設定させるタイミングは注意!
    アレクサ、「〇〇〇」をひらいて

    「〇〇〇」へようこそ。このスキルでは・・・(説明とかスキルの実行と
    か)・・・次回に向けて、リマインダーを設定できます。毎日何時に設
    定しますか?

    8時にセットして

    リマインダーを8時にセットします。よろしいですか?

    はい

    リマインダーのアクセス権がありません。Alexaアプリを〜

    もう、ええわっ!(怒)


    View Slide

  29. リマインダーのUXについて(成功例①)
    29
    ● アクセス権をチェックして表現を変える
    アレクサ、「〇〇〇」をひらいて

    「〇〇〇」へようこそ。このスキルでは・・・

    (リマインダーチェック)
    (アクセス権がない場合)

    あと、このスキルでは、次回に向けてリマインダーを設定できます。
    詳細はAlexaアプリをご確認ください。

    (アクセス権がある場合)

    次回に向けてリマインダーを設定できます。毎日何時にセット

    しますか?

    ReminderManagementServiceClient.getReminders()あた
    りを使うのがよい(と思われるが、良い実装求む・・・)

    View Slide

  30. Voiceflowの場合
    30

    View Slide

  31. Voiceflowの場合
    31
    ◯時◯分に
    設定して
    はい
    ◯時◯分に
    設定しても
    よいですか?
    アプリで権限を
    ・・・
    ◯時◯分に
    設定しました
    失敗しました

    View Slide

  32. Voiceflowの場合
    32

    View Slide

  33. Voiceflowの場合
    33

    View Slide

  34. Voiceflowの場合
    34
    ただし、繰り返しには非対応なのかも?確認中(日付指定だとOK
    だけど、指定がないとエラーになる)

    View Slide

  35. Voiceflowの場合
    35
    相対指定の場合は今からの時間を指定
    すればOK!

    View Slide

  36. サンプルコードや解説等は
    後日ブログで公開します!
    36

    View Slide

  37. 相対指定の解説オススメ(THANKS!)
    37
    タイマー的なスキル作れるのでオススメ!
    https://developer.amazon.com/ja/blogs/alexa/post/67953f88-d837-48ea-a8b0-ce
    9316fc4e5b/alexatraining-reminder-api
    https://qiita.com/takatama/items/c4e0b626f707706c6f50

    View Slide

  38. 絶対指定の解説オススメ(THANKS!)
    38
    https://tech.mti.co.jp/entry/2019/02/15/114756
    https://qiita.com/Mount/items/4b3323a2190380c413f2
    やっぱりリマインダーは繰り返しでやりたい!

    View Slide

  39. リマインダーのUXについて(THANKS!)
    39
    https://qiita.com/sitopp/items/591bd4af48e6fd12c6a1
    超オススメ!ぜひ一読を!

    View Slide

  40. リマインダーのガイドライン
    40
    https://developer.amazon.com/ja/docs/smapi/alexa-reminders-guidelines-for-usage.html

    View Slide

  41. Summary
    4

    View Slide

  42. まとめ
    ● リマインダーでスキルの利用を促進
    ○ ユーザ・開発者の両方にメリット
    ○ 画面付きなら告知効果高い
    ● 注意点いろいろ
    ○ 習慣的な利用が前提のスキルであること!
    ○ きちんと確認を得る、その他文言等の制限
    ○ 相対指定は簡単、絶対指定少し面倒だけどニーズ高い、
    ぜひトライ!
    ● UXを損ねないように会話フローに留意
    ○ 一通りの会話後に権限ないよ?だとやる気なくなる
    ○ 可能ならなるべく初期段階。必須 or オプションでも考慮
    ● Voiceflowでも(ちょっと制限あるかもだけど)できるよ!
    42
    積極的に使ってエンゲージメント高めていこう!

    View Slide

  43. FYI
    5

    View Slide

  44. 7/27(土)
    ● Alexaスキルアワード2019 1DAYガールズハッカソン@東京
    44
    サポート
    スタッフ
    やります!

    View Slide

  45. 8/10(土)AAJUG 京都 #1
    ● Gamification & MLがテーマ
    ● Amazon Personalizeの話もあるよ
    45

    View Slide

  46. 8/10(土)AAJUG Cafe 京都 #1
    ● おすすめのスキルや機能などを座談会形式で
    46

    View Slide

  47. 8/22(木)AAJUG大阪
    ● 真夏のもくもく&座談会!オンラインも予定してます
    ● 別途告知予定です
    47
    準備中

    View Slide

  48. Thanks!
    Any questions?

    View Slide