【大阪】スマートスピーカーミーティング 2019/07/25 のLTの資料です。AlexaのリマインダーAPIを使ってユーザとの関係性を高めようという話をしてきました。もちろんVocieflowの場合もありますよ!
https://osaka-driven-dev.connpass.com/event/134869/
Alexaの通知について考えるスマートスピーカーミーティング #11 7/25 LT
View Slide
アジェンダ1. 自己紹介2. Alexaの通知3. リマインダーをask-sdk/Voiceflowでやってみた4. まとめ5. お知らせ2
About Myself1
Kuniaki Shimizu (@kun432)- シナジーマーケティング株式会社- インフラエンジニア- Twitter/Facebook/Github/Hatena/Alexa- ポートフォリオ: https://kun432.github.io/4❤Hello!
My Skills & Actions5- Alexa (JP): 11→12(予定)- Google: 1 - Clova: 1#スキル開発100チャレンジ- Alexa (US): 1
● 本資料内における意見・発言等は個人の見解であり、所属する組織・団体の見解を代表するものでは、ありません。● まともに説明すると結構深かったので、コードはサラッと、ポイントとなるとこだけかいつまんで説明します。6Disclaimer
Alexaの通知について2
こんな経験ないですか?8
こんな経験ないですか?9● 利用者側○ 有効にしたスキルの呼び出し名を間違える・思い出せない○ スキル一覧を見て、有効にしたことを覚えていないスキルがある● 開発者側○ スキルの利用者が増えない○ スキルが継続的に利用されない、一定期間経つと利用されなくなる
スキルが利用されない理由10● スキル名を覚えれない○ VUIではそもそも覚えることが難しい● 使うことを忘れる○ トリガーは常にユーザ● 視覚的な補助がない○ 音声で簡単に有効化できてしまう○ ホーム画面のようなものが存在しない○ メラビアンの法則(55%は視覚から)● 他の接点を作るのが面倒(メールとか)ユーザとの日常的な接点が非常に少ない
スキルの継続的利用にはユーザとの接点を増やすことが重要!11
通知を使おう!12
Alexaの通知機能● 以下の2種類13リマインダーAPI プロアクティブイベントAPIタイミングの決定 ユーザがスキル内で選択 外部から自由なタイミングで通知可能選択可能な通知タイミング● 相対指定(現在からn秒後)● 絶対指定○ ○年○月○日○時○分○秒○ 繰り返し(毎日・毎週)通知内容の柔軟性 ある程度柔軟に設定可能※ただしルールはいろいろある決められたフォーマットから選択※フォーマットが合うか次第実装範囲 スキルのみでOK※外部から更新・削除は可能イベントを送るエンドポイントが必要(Lambdaでないとだめっぽい?)実装方法 ask-sdk v2のServiceClientFactory経由 or リマインダーAPIプロアクティブイベントAPIアクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)
Alexaの通知機能● 以下の2種類14リマインダーAPI プロアクティブイベントAPIタイミングの決定 ユーザがスキル内で選択 外部から自由なタイミングで通知可能選択可能な通知タイミング● 相対指定(現在からn秒後)● 絶対指定○ ○年○月○日○時○分○秒○ 繰り返し(毎日・毎週)通知内容の柔軟性 ある程度柔軟に設定可能※ただしルールはいろいろある決められたフォーマットから選択※フォーマットが合うか次第実装範囲 スキルのみでOK※外部から更新・削除は可能イベントを送るエンドポイントが必要(Lambdaでないとだめっぽい?)実装方法 ask-sdk v2のServiceClientFactory経由 or リマインダーAPIプロアクティブイベントAPIアクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)今回はこっち
Alexaの通知機能● 以下の2種類15リマインダーAPI プロアクティブイベントAPIタイミングの決定 ユーザがスキル内で選択 外部から自由なタイミングで通知可能選択可能な通知タイミング● 相対指定(現在からn秒後)● 絶対指定○ ○年○月○日○時○分○秒○ 繰り返し(毎日・毎週)通知内容の柔軟性 ある程度柔軟に設定可能※ただしルールはいろいろある決められたフォーマットから選択※フォーマットが合うか次第実装範囲 スキルのみでOK※外部から更新・削除は可能イベントを送るエンドポイントが必要(Lambdaでないとだめっぽい?)実装方法 ask-sdk v2のServiceClientFactory経由 or リマインダーAPIプロアクティブイベントAPIアクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)今回はこっち今回はこっち※相対指定の事例は多いが こっちは少ないこれを使う
リマインダーをask-sdk/Voiceflowでやってみた3
Alexa開発者コンソール17● アクセス権限で「リマインダー」をON
Alexa開発者コンソール18● インテントの確認を有効にする
Alexaの通知機能● 以下の2種類19リマインダーAPI プロアクティブイベントAPIタイミングの決定 ユーザがスキル内で選択 外部から自由なタイミングで通知可能選択可能な通知タイミング● 相対指定(現在からn秒後)● 絶対指定○ ○年○月○日○時○分○秒○ 繰り返し(毎日・毎週)通知内容の柔軟性 ある程度柔軟に設定可能※ただしルールはいろいろある決められたフォーマットから選択※フォーマットが合うか次第実装範囲 スキルのみでOK※外部から更新・削除は可能イベントを送るエンドポイントが必要(Lambdaでないとだめっぽい?)実装方法 ask-sdk v2のServiceClientFactory経由 or リマインダーAPIプロアクティブイベントAPIアクセス許可 リマインダ権限+ユーザ確認 通知権限(SMAPIで有効化)再 掲
リマインダーの確認20● やり方は多分他にもあるが、2段階の確認が必要。● 今回はスロットの確認を使った(CONFIRMATION)
リマインダーの確認21● やり方は多分他にもあるが、2段階の確認が必要。● 今回はスロットの確認を使った(CONFIRMATION)審査に通るために必要なポリシー!※もちろんこれ以外にもある
ServiceClientFactoryを使う22exports.handler = Alexa.SkillBuilders.custom().addRequestHandlers(・・・).addErrorHandlers(ErrorHandler).withApiClient(new Alexa.DefaultApiClient()).lambda();● ServiceClientFactory○ Alexaの各種APIサービスへアクセスするためのask-sdk-v2のサービスクライアント○ リスト、デバイスアドレス、リマインダー、プログレッシブ応答、スキル内課金などなど○ 上記API叩くのに必要な処理をよしなにやってくれる● custom()の場合は要初期化、standard()の場合は初期化不要以前の再 掲
権限と確認①23const 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();}・・・スキルのアクセス権とは別に、明示的な確認を取る。この例ではスロットの確認を使っている。
権限と確認②24if (!consentToken) {const speechText = 'ごめんなさい、このスキルでは、リマインダーへのアクセス権が’ +‘必要になります。Alexaアプリのアクティビティーをご確認ください。';return handlerInput.responseBuilder.speak(speechText).withAskForPermissionsConsentCard(PERMISSIONS).getResponse();}スキルのアクセス権。カードを表示して、ユーザにアクセス権許可を促すhandlerInput.requestEnvelope.context.System.apiAccessTokenをAlexaの各種アクセス権許可の判断にしている例をよくみるけど、単にAPIアクセストークンだから毎回飛んでくるし実際にはアクセス権許可の判断にはならないと思うんだよな・・・最低限必要だとしても、APIレスポンスの結果からの判断は必要だし、もっとかんたんに権限チェックできる方法はないものか・・・・
リマインダー設定(基本の流れ)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();},};
リマインダーオブジェクトの組み立て26const 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
リマインダーのUXについて28● リマインダーを設定させるタイミングは注意!アレクサ、「〇〇〇」をひらいて 「〇〇〇」へようこそ。このスキルでは・・・(説明とかスキルの実行とか)・・・次回に向けて、リマインダーを設定できます。毎日何時に設定しますか? 8時にセットして リマインダーを8時にセットします。よろしいですか? はい リマインダーのアクセス権がありません。Alexaアプリを〜 もう、ええわっ!(怒)
リマインダーのUXについて(成功例①)29● アクセス権をチェックして表現を変えるアレクサ、「〇〇〇」をひらいて 「〇〇〇」へようこそ。このスキルでは・・・ (リマインダーチェック)(アクセス権がない場合) あと、このスキルでは、次回に向けてリマインダーを設定できます。詳細はAlexaアプリをご確認ください。 (アクセス権がある場合) 次回に向けてリマインダーを設定できます。毎日何時にセット しますか? ReminderManagementServiceClient.getReminders()あたりを使うのがよい(と思われるが、良い実装求む・・・)
Voiceflowの場合30
Voiceflowの場合31◯時◯分に設定してはい◯時◯分に設定してもよいですか?アプリで権限を・・・◯時◯分に設定しました失敗しました
Voiceflowの場合32
Voiceflowの場合33
Voiceflowの場合34ただし、繰り返しには非対応なのかも?確認中(日付指定だとOKだけど、指定がないとエラーになる)
Voiceflowの場合35相対指定の場合は今からの時間を指定すればOK!
サンプルコードや解説等は後日ブログで公開します!36
相対指定の解説オススメ(THANKS!)37タイマー的なスキル作れるのでオススメ!https://developer.amazon.com/ja/blogs/alexa/post/67953f88-d837-48ea-a8b0-ce9316fc4e5b/alexatraining-reminder-apihttps://qiita.com/takatama/items/c4e0b626f707706c6f50
絶対指定の解説オススメ(THANKS!)38https://tech.mti.co.jp/entry/2019/02/15/114756https://qiita.com/Mount/items/4b3323a2190380c413f2やっぱりリマインダーは繰り返しでやりたい!
リマインダーのUXについて(THANKS!)39https://qiita.com/sitopp/items/591bd4af48e6fd12c6a1超オススメ!ぜひ一読を!
リマインダーのガイドライン40https://developer.amazon.com/ja/docs/smapi/alexa-reminders-guidelines-for-usage.html
Summary4
まとめ● リマインダーでスキルの利用を促進○ ユーザ・開発者の両方にメリット○ 画面付きなら告知効果高い● 注意点いろいろ○ 習慣的な利用が前提のスキルであること!○ きちんと確認を得る、その他文言等の制限○ 相対指定は簡単、絶対指定少し面倒だけどニーズ高い、ぜひトライ!● UXを損ねないように会話フローに留意○ 一通りの会話後に権限ないよ?だとやる気なくなる○ 可能ならなるべく初期段階。必須 or オプションでも考慮● Voiceflowでも(ちょっと制限あるかもだけど)できるよ!42積極的に使ってエンゲージメント高めていこう!
FYI5
7/27(土)● Alexaスキルアワード2019 1DAYガールズハッカソン@東京44サポートスタッフやります!
8/10(土)AAJUG 京都 #1● Gamification & MLがテーマ● Amazon Personalizeの話もあるよ45
8/10(土)AAJUG Cafe 京都 #1● おすすめのスキルや機能などを座談会形式で46
8/22(木)AAJUG大阪● 真夏のもくもく&座談会!オンラインも予定してます● 別途告知予定です47準備中
Thanks!Any questions?