Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

About Myself 1

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Alexaの通知について 2

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

通知を使おう! 12

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

権限と確認① 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(); } ・・・ スキルのアクセス権 とは別に、明示的な 確認を取る。 この例ではスロット の確認を使っている。

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

リマインダー設定(基本の流れ) 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(); }, };

Slide 26

Slide 26 text

リマインダーオブジェクトの組み立て 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”は曜日も指定 リマインドされる文字列 ※色々要件あり

Slide 27

Slide 27 text

サンプル動画 27

Slide 28

Slide 28 text

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


Slide 29

Slide 29 text

リマインダーのUXについて(成功例①) 29 ● アクセス権をチェックして表現を変える アレクサ、「〇〇〇」をひらいて
 「〇〇〇」へようこそ。このスキルでは・・・ 
 (リマインダーチェック) (アクセス権がない場合)
 あと、このスキルでは、次回に向けてリマインダーを設定できます。 詳細はAlexaアプリをご確認ください。 
 (アクセス権がある場合)
 次回に向けてリマインダーを設定できます。毎日何時にセット 
 しますか?
 ReminderManagementServiceClient.getReminders()あた りを使うのがよい(と思われるが、良い実装求む・・・)

Slide 30

Slide 30 text

Voiceflowの場合 30

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Voiceflowの場合 32

Slide 33

Slide 33 text

Voiceflowの場合 33

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

相対指定の解説オススメ(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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Summary 4

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

FYI 5

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

Thanks! Any questions?