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/

5caee8d2ccdb42a940545c47c6c01373?s=128

Kuniaki Shimizu

July 25, 2019
Tweet

Transcript

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

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

    5. お知らせ 2
  3. About Myself 1

  4. Kuniaki Shimizu (@kun432) - シナジーマーケティング株式会社 - インフラエンジニア - Twitter/Facebook/Github/Hatena/Alexa -

    ポートフォリオ: https:/ /kun432.github.io/ 4 ❤ Hello!
  5. My Skills & Actions 5 - Alexa (JP): 11→12(予定) -

    Google: 1 - Clova: 1 #スキル開発100チャレンジ - Alexa (US): 1
  6. • 本資料内における意見・発言等は個人の見 解であり、所属する組織・団体の見解を代 表するものでは、ありません。 • まともに説明すると結構深かったので、コー ドはサラッと、ポイントとなるとこだけかいつ まんで説明します。 6 Disclaimer

  7. Alexaの通知について 2

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

  9. こんな経験ないですか? 9 • 利用者側 ◦ 有効にしたスキルの呼び出し名を間違える・ 思い出せない ◦ スキル一覧を見て、有効にしたことを覚えて いないスキルがある

    • 開発者側 ◦ スキルの利用者が増えない ◦ スキルが継続的に利用されない、一定期間経つ と利用されなくなる
  10. スキルが利用されない理由 10 • スキル名を覚えれない ◦ VUIではそもそも覚えることが難しい • 使うことを忘れる ◦ トリガーは常にユーザ

    • 視覚的な補助がない ◦ 音声で簡単に有効化できてしまう ◦ ホーム画面のようなものが存在しない ◦ メラビアンの法則(55%は視覚から) • 他の接点を作るのが面倒(メールとか) ユーザとの日常的な接点が非常に少ない
  11. スキルの継続的利用には ユーザとの接点を増やす ことが重要! 11

  12. 通知を使おう! 12

  13. Alexaの通知機能 • 以下の2種類 13 リマインダーAPI プロアクティブイベントAPI タイミングの決定 ユーザがスキル内で選択 外部から自由なタイミング で通知可能

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

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

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

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

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

  19. Alexaの通知機能 • 以下の2種類 19 リマインダーAPI プロアクティブイベントAPI タイミングの決定 ユーザがスキル内で選択 外部から自由なタイミング で通知可能

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

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

  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()の場合は初期化不要 以前の再 掲
  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(); } ・・・ スキルのアクセス権 とは別に、明示的な 確認を取る。 この例ではスロット の確認を使っている。
  24. 権限と確認② 24 if (!consentToken) { const speechText = 'ごめんなさい、このスキルでは、リマインダーへのアクセス権が’ +

    ‘必要になります。Alexaアプリのアクティビティーをご確認ください。'; return handlerInput.responseBuilder .speak(speechText) .withAskForPermissionsConsentCard(PERMISSIONS) .getResponse(); } スキルのアクセス権。カードを 表示して、ユーザに アクセス権許可を促す handlerInput.requestEnvelope.context.System.apiAccessTo kenをAlexaの各種アクセス権許可の判断にしている例をよくみ るけど、単にAPIアクセストークンだから毎回飛んでくるし実際に はアクセス権許可の判断にはならないと思うんだよな・・・ 最低限必要だとしても、APIレスポンスの結果からの判断は必要 だし、もっとかんたんに権限チェックできる方法はないものか ・・・・
  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(); }, };
  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”は曜日も指定 リマインドされる文字列 ※色々要件あり
  27. サンプル動画 27

  28. リマインダーのUXについて 28 • リマインダーを設定させるタイミングは注意! アレクサ、「〇〇〇」をひらいて
 「〇〇〇」へようこそ。このスキルでは・・・(説明とかスキルの実行と か)・・・次回に向けて、リマインダーを設定できます。毎日何時に設 定しますか?
 8時にセットして
 リマインダーを8時にセットします。よろしいですか?

    
 はい
 リマインダーのアクセス権がありません。Alexaアプリを〜 
 もう、ええわっ!(怒)

  29. リマインダーのUXについて(成功例①) 29 • アクセス権をチェックして表現を変える アレクサ、「〇〇〇」をひらいて
 「〇〇〇」へようこそ。このスキルでは・・・ 
 (リマインダーチェック) (アクセス権がない場合)
 あと、このスキルでは、次回に向けてリマインダーを設定できます。

    詳細はAlexaアプリをご確認ください。 
 (アクセス権がある場合)
 次回に向けてリマインダーを設定できます。毎日何時にセット 
 しますか?
 ReminderManagementServiceClient.getReminders()あた りを使うのがよい(と思われるが、良い実装求む・・・)
  30. Voiceflowの場合 30

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

    ◯時◯分に 設定しました 失敗しました
  32. Voiceflowの場合 32

  33. Voiceflowの場合 33

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

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

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

  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

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

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

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

  41. Summary 4

  42. まとめ • リマインダーでスキルの利用を促進 ◦ ユーザ・開発者の両方にメリット ◦ 画面付きなら告知効果高い • 注意点いろいろ ◦

    習慣的な利用が前提のスキルであること! ◦ きちんと確認を得る、その他文言等の制限 ◦ 相対指定は簡単、絶対指定少し面倒だけどニーズ高い、 ぜひトライ! • UXを損ねないように会話フローに留意 ◦ 一通りの会話後に権限ないよ?だとやる気なくなる ◦ 可能ならなるべく初期段階。必須 or オプションでも考慮 • Voiceflowでも(ちょっと制限あるかもだけど)できるよ! 42 積極的に使ってエンゲージメント高めていこう!
  43. FYI 5

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

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

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

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

  48. Thanks! Any questions?