kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voiceflow TIPS #32 Voiceflowで日本語スキル内課金(その1)

追記2019/09/23:色々確認し直して一部修正しました。

Advent Calendar、終わってからもう半月以上、経つのですねぇ・・・。

ちょっと落ち着いたところで、折を見てVoiceflow夏休みAdvent Calendar延長戦をやっていきたいと思います。ということで延長線の第1回は今日発表されたばかりの日本語スキル内課金を2回に分けてやってみたいと思います!

※第2回はこちら kun432.hatenablog.com

で、スキル内課金の実装を始める前に、スキル内課金について最低限知っとかないといけないことがあるのですが、ざっくりポイントだけ。

  • スキル内商品のタイプは3つ。「買い切り型」「サブスクリプション型」「消費型」
  • スキル内商品の購入パターンは2つ。”Buy”と”Upsell”。
  • キャンセルも実装する必要がある。
  • 購入・キャンセルまで誘導すると、あとの会話はAlexa側で用意されたものが発話される。つまり、スキル開発者がやるのは、商品を購入している場合・未購入の場合の処理の振り分けと、購入の手前・購入後の結果を踏まえた会話フローの作り込み、になる。
  • 料金は商品登録時に設定するだけで、スキルの発話には含めないようにする。(Amazonさん側でプライム向け割引等が行われるため)
  • 実装自体はできるけど、審査を通すにはいろいろルールがある(はず)

とりあえずこんなとこかなと思います。まずは一旦作ってみてスキル内課金対応スキルがどういう動きをするのか?を知るのが大事かなと思いますので、皆さんご存じの方のサンプルを参考に、「スキル内課金対応ハローワールド」を作っていきたいと思います。ちなみに、今回は「買い切り型」のデモです。

https://github.com/toshimin/skill-sample-nodejs-simple-hello-world/

スキルの仕様はこんな感じです。

  • 「こんにちは」というと、通常は、日本語で「こんにちは」と言い返してくれる。
  • 「買い切り型」の商品「英語パック」を持っていると、「こんにちは」というと「Hello」といってくれる
  • 「英語パックを購入」で”Buy"
  • 「英語で言って」と言った場合、「英語パック」を持っている場合は上と同じく「Hello」といってくれる。「英語パック」を持っていない場合は"Upsell"として商品を紹介、購入を促す。

ではやってみましょう。

スキルの全体像

例によって、エラー処理は甘めです。大まかな機能ごとに分けてみました。

追記2019/09/23:フロー見直しました

f:id:kun432:20190923234023p:plain

結構線がすごいことになってますね・・・"Buy"が見当たりませんが、後で説明しますので気にしないでください。では順にやっていきましょう。

商品の登録

まず最初に商品を登録します。商品の登録は”Payment Block”から行います。とりあえず適当なところにドラッグ&ドロップしてください。先は繋げなくて良いです。Payment Blockのメニューが表示されるので"Add Products"をクリックします。

f:id:kun432:20190921005138p:plain

まだ商品が登録されていないので"Nop products exists"と表示されています。"Create a product"をクリックして商品を登録しましょう。

f:id:kun432:20190921005313p:plain

商品の登録画面が開きます。商品の登録は6つのステップに分かれています。まず、1つ目のステップ、"Name & Description"で商品の概要を入力しましょう。以下の通り入力してください。終わったら”Next”をクリックします。

f:id:kun432:20190921005838p:plain

2つ目のステップ、"Pricing Model"では、商品のタイプを設定します。"One-Time Purchase(売り切り型)"、"Consumable(消費型)"、"Subscription(サブスクリプション型)"から選択可能です。今回は”One-Time Purchase”で1回売り切りとします。Tax Categoryは商品によって税額が変わるそうなので実際には専門家の確認が必要らしいですが、とりあえずここは"Software"を選んでおきます。終わったら”Next”をクリックします。

f:id:kun432:20190921010445p:plain

3つ目のステップ、"Availablility"では、どの国で買えるか、いくらで買えるか、など料金の設定を行います。デフォルトだと以下のようになっています。

f:id:kun432:20190921010658p:plain

とりあえず日本国内だけにしましょう。一番上のMarketplace Availabilityの下のMARKETPLACESをクリックすると、どこのストアで買えるか?を選べますので、"amazon.co.jp(JPY)"以外のチェックを全部外します。

f:id:kun432:20190921011018p:plain

こんな感じに日本だけになればOKです。金額は適当に変えてもいいです。One-Time Purchaseの場合は99〜9999円の間で指定してください。終わったら"Next"をクリックします。

f:id:kun432:20190921011211p:plain

追記2019/09/23:この項目は大幅に見直してます

4つ目のステップ、"Phrases"では、"Buy"につなげるためのサンプル発話スキル内商品を購入する際の「説明」としてサンプル発話を入力します。ここで入力した内容は、スキルの挙動には全く影響しませんが、審査を通す場合には、実際に購入を行う際の発話内容と一致してないと審査的にはNGのようです。詳しくは公式のドキュメントをご覧ください。(ただし、この設定がどこで表示されるのかまだちょっとわかってませんし、開発者コンソール側で設定する箇所が見つからないです・・・)

ちょっとここだけ設定項目に違和感あるのですが、とりあえず気にせずに、以下のような感じで3つまで設定します。1つ入力したら右端の+をクリックすると次の項目が入力可能になります。(最初の「アレクサ、・・・」はもしかすると不要かもしれませんが未確認)。終わったら"Next"をクリックします。

f:id:kun432:20190921011619p:plain

5つ目のステップ、"Product Icons"では商品のアイコンを設定します。ストアやAlexaアプリで表示されるようです(未確認)。大小それぞれ適当に設定してください。終わったら"Next"をクリックします。

f:id:kun432:20190921011958p:plain

最後のステップ、"Details"では、ストアでの検索キーワードや、カードでの購入後確認内容、購入・キャンセル実行時の商品説明を入力し、最後に審査時のテスト方法を入力します。とりあえず以下のような形で入力してください。最後に"Create Product"をクリックすると、完了です。

f:id:kun432:20190921012930p:plain

商品が登録されると以下のように表示されます。複数の商品を登録することもできますが、今回は一つだけです。”Return to Canvas”をクリックして、フローを作っていきましょう。

f:id:kun432:20190921013127p:plain

スキルの基本機能

はい、ではフローを作っていきます。まずは右上の基本機能からです。

追記2019/09/23:フロー見直しました

f:id:kun432:20190923234101p:plain

会話イメージだとこんな感じです。「英語パック」購入/未購入で動きが変わります。まず「英語パック」未購入時。


アレクサ、「プレミアムハローワールド」をひらいて

プレミアムハローワールドへようこそ。「こんにちは」と話しかけてください。英語の「こんにちは」を聞きたい時は、「英語で言って」と言ってください。どうしますか?

こんにちは

こんにちは。もっと聞きたいですか?

はい

こんにちは。もっと聞きたいですか?

いいえ

また呼んでくださいね。


「英語パック」購入時だとこうなります。


アレクサ、「プレミアムハローワールド」をひらいて

プレミアムハローワールドへようこそ。「こんにちは」と話しかけてください。英語の「こんにちは」を聞きたい時は、「英語で言って」と言ってください。どうしますか?

こんにちは

Hello。もっと聞きたいですか?

はい

Hello。もっと聞きたいですか?

いいえ

また呼んでくださいね。


では順にやっていきます。かんたんなところは省略してポイントのところだけ説明します。

Speak Blockを2つおいてこんな感じで設定してください。

f:id:kun432:20190921013852p:plainf:id:kun432:20190921013854p:plain

Interaction Blockをおいて、「こんにちは」といった場合と、「英語で言って」といった場合の分岐を作ります。

f:id:kun432:20190921014741p:plainf:id:kun432:20190921014750p:plain

「こんにちは」といった場合の標準フローをまず作りましょう。「こんにちは」といった場合、「英語パック」の購入有無で、日本語で喋らせるのか、英語で喋らせるのかを分岐させる必要があります。商品の購入有無はUser Info Blockを使ってチェックします。"User Info Block”をおいて、Interaction Blockからつなげます。そして、"+ Add Permission Request"をクリックします。

f:id:kun432:20190921015322p:plain

"Check Permission Enabled" で "Product" を選択します。すると、"Check If Product Purchased"で対象の商品を購入しているかどうかを選択可能になりますので、ここで「英語パック」を選択します。

f:id:kun432:20190921015534p:plain

これで、「英語パック購入済」の場合と「英語パック未購入(fail)」の場合で分岐するようになりますので、それぞれSpeakで発話内容を変えておきます。英語の場合はPollyを使うようにすればよいですね。

f:id:kun432:20190921020045p:plainf:id:kun432:20190921020053p:plain

最後に「もっと聞きたいですか?」という流れに合わせて、2つのSpeak Blockからntenteraction Blockにつないで、Interaction BlockでYesIntent/NoIntentで分岐、「はい」の場合は、もう一度User Info Blockまで戻して、「いいえ」の場合はFlow BlockでStop Flowに流して終わらせます。

f:id:kun432:20190921020728p:plain

基本フローはこれで終わりです。最初のInteraction Blockの「英語で言って」のインテントはUpsellにつながるので、そこで説明したいと思います。

追記2019/09/23:全体フローの変更に伴い、少し追記しました

さて、今の時点でこんな感じになってると思います。

f:id:kun432:20190923183026p:plain

全体フローと位置取りがあっていたほうがわかりやすいと思うので、少し位置だけ調整しておきますね。スキルの挙動とは全く関係ありません。

f:id:kun432:20190923183436p:plain


現時点では、まだ購入処理ができてないので、ただの「こんにちは」と言ってくれるだけのスキル(英語の流れに行くこともない)ですが、商品の登録方法と、登録済み商品の購入有無をUser Info Blockでチェックする、ということだけ覚えていただければと思います。

購入処理を用意すると一気に面白くなりますのでお楽しみに。続きは以下。

2019年上期 振り返り&下期 修正計画

f:id:kun432:20190902231248p:plain

今年の最初に立てた「2019年の目標とやりたいこと」、毎月振り返りをきちんとやっていて、自分でも非常に良い感じです。で、少し過ぎてしまったのだけど、上期ということでもう少し大きい目線で振り返り&下期に向けた見直しをしようと思います。

ちなみに、今年の最初に立てた目標はこれです。順番に見ていきます。

上半期振り返り

資格を取る

達成。当時はAlexaスキルビルダーとか取れると思ってなかったなー。よく頑張ったと思う。

GCPは、今のところ必要性を感じてないので、もしGoogle Home向けも作りたくなったらまた考えようかなと思う。

毎月一個、テーマを持ってスキルを作る

  • 音声再生
  • 動画再生2019/01/31達成!
  • ダイアログモデル
  • APL
  • セッション
  • ユーザプロファイル
  • リマインダーAPI
  • リストAPI
  • バイスアドレスAPI 2019/07/30達成!
  • 位置情報サービス
  • アカウントリンク
  • Amazon Pay連携
  • スキル内課金
  • ノンコーディング 2019/05/03達成!
  • blueprint 2019/02/28達成!
  • 外部API連携 2019/03/31達成!
  • Clova/Google Home向けも作る

未達。でも、他に色々やっていたことを考えると、まあまあかなと思う。下期はもう少し力を入れていきたい。

アウトプット

  • LTで登壇する 2019/02/28達成!
  • Advent Calenderに2つ以上投稿する 2019/09/01達成!
  • 最低、週1でgithubにコミット見直し

達成。ここは結構頑張ったと思う。ほぼほぼ毎月LTしてるし、なんといってもAdvent Calendarも含めて、かなりアウトプットできたと思ってる。その他、ハッカソンスタッフやハンズオン講師もやったし、結構いろいろ活動できたんじゃないかと思います。

その他

  • 転職する 2019/06/01達成!

達成。

未達。でもこれホントやりたい。Macで困ってるわけじゃないけど、今後のことを考えて環境を持たない感じにしていきたい。

  • 個人名刺作る2019/02/03達成!

達成。気に入ってるんだけど、色々変わったので、そろそろ見直しも必要かなと思ってます。

  • 旅行に行く

東京にはちょろっと行ってたりするんだけど、旅行らしい旅行は今年はしてない。旅行には目的持って行きたいタイプなんだけど、そういうのなしにフラっと行って、刺激というかインスピレーション受けるような旅行がしたいなぁ、と最近は思う。

  • ライブやコンサートにコンスタンスに行く2019/02/03達成!

一応1回は行ったんだけど(それはとても良かった)、もう少し気楽に頻度増やしていきたい。音楽のある生活はほんと息抜きにもなるし刺激も受けれると思っているので。

総括

  • トータルで見ると、ほんとよく頑張ったんじゃないかなと思う。去年に比べると雲泥の差。自画自賛してもバチはあたらないんじゃないかなと思う。
  • ただ自分自身をちょっとマネージメントできてない感はある。結構詰め込みすぎてしんどいときもあった。年齢的にも無理が効くわけではないので、ここは課題。
  • あと、偏りすぎ。まあ意図したものではあるんだけど、もう少し違うこととか遊びがあったほうが視野も広がってよい気がする。

下期の取り組み

ということで下期に向けて少し見直しました。少し違うことにもチャレンジしていこうということで。

資格

自分の中でもまだそこまでやる気が固まっているわけではないけど、少し仕事で役に立つかもということで。体系的に効率よく学ぶために資格取得を目標に立ててみました。一応こちらが本職だし、新たなチャレンジとして。

  • Certified Kubernetes Administrator (CKA)
  • Certified Kubernetes Application Developer (CKAD)
  • Certified OpenStack Administrator (COA)
  • OpenStack Professional Certification by LPI-Japan (OPCEL)

毎月一個、テーマを持ってスキルを作る

これは引き続き。むしろ力を入れてアウトプットしていきたいところ。

  • 音声再生
  • ダイアログモデル
  • APL
  • セッション
  • ユーザプロファイル
  • リマインダーAPI
  • リストAPI
  • 位置情報サービス
  • アカウントリンク
  • スキル内課金
  • GameOn SDK
  • skill connection
  • フラッシュブリーフィング
  • Google Home向け
  • Clova向けも作る

アウトプット

ここも引き続きだけど、少し修正。違う分野や違うエリアで参加して活動の幅を広げていきたいのと、ハンズオンみたいなところでは裾野を広げるお手伝いを自分なりにコツコツやっていきたい。

  • LTで毎月登壇する
  • 違うテーマでLT登壇する
  • 近畿以外でLT登壇する
  • ハンズオン資料を作る
  • ハンズオンを開催する
  • イベントスタッフをやる
  • 技術同人誌を書く

その他

まあ、ここは変わらずだけど、もちょっとなんかしたいなー。思いついたらまた追加。

  • Chromebookへの移行をトライしてみる
  • 個人名刺作りなおす
  • 旅行に行く
  • ライブやコンサートにもっとコンスタンスに行く

ということで、もう下期に入っているけど、新たな目標に向けてがんばります!

まずはスキル内課金やるぞー

Voiceflowハンズオンで講師してきた

2019/09/05追記: 一部記載に不備があったので訂正して再掲します。

ブログ書くまでがハンズオン、ということで、昨日行われたVoiceflowハンズオンで初のハンズオン講師をしてきました。

今回のハンズオン、8月の中頃に突然@gaomarさんにお誘い頂いたのが発端です。以前から各所でVoiceflowのハンズオンを多数されているもっちゃんさんが大阪にいらっしゃることになり、ぜひ関西でもVoiceflowハンズオンを一緒に、ということで、躊躇なく二つ返事で引き受けてしまいました。前々から関西でもやりたいなー、と思いつつできてなかったのと、もっちゃんさんの書かれたVoiceflowの記事等を以前から見てて「うんうん、そうなんだよね」「あー、わかる」みたいな勝手な親近感を抱いてて、これは是非お会いせねば!というのが理由です。

(なので、実はAdvent Calendarで苦しんでる裏で、ハンズオン資料も作ってたりして、後半は結構苦しかったのです・・・でも今となってはやってよかったと思います!)

ということで当日のレポです。

ハンズオンレポ

会場はさくらインターネットさん、いつもお世話になります。最初に会場の説明などいろいろです。

f:id:kun432:20190905203345j:plain

今回のスタッフです。

f:id:kun432:20190905201524j:plain

いよいよ開始です!

基本編〜応用編の講師はもっちゃんさんです。いつもよりタイトなスケジュールだったのですが、ハンズオン多数されているので安定感あります!今回の資料のベースももっちゃんさんによるものです。

f:id:kun432:20190905201534j:plain

みなさん、黙々と進められています。

f:id:kun432:20190905201540j:plain

困ったり詰まったところはスタッフがサポートします。

f:id:kun432:20190905201551j:plainf:id:kun432:20190905201556j:plain

皆さんの環境もいろいろなんですが、ブラウザだけで作れるので、環境構築とか環境差異に左右されにくいのもVoiceflowのよいところですね。

f:id:kun432:20190905201601j:plain

基本編も終盤に進むと、いろんなところから、スキルテスト時のAlexaの声やスキル内で利用している効果音が聞こえてきて、なかなかカオスな感じでしたw

f:id:kun432:20190905201611j:plain

応用編は私が担当しました。VoiceflowのIntegration Blockを使って、LINEにプッシュ通知を送るというのをやってみました。

f:id:kun432:20190905201625j:plain

LINEへの通知は、Messaging APIが多分王道だと思いますが、今回はIntegration Blockを使えばかんたんにAPI連携できる、というVoiceflowの凄さを体験してもらうためにシンプルなLINE Notifyを採用しました。

f:id:kun432:20190905201630j:plain

今回のハンズオンは初心者向け設定だったのでAPI連携はちょっとむずかしいかな、というのと、時間的にもタイトだったので結構詰め込み過ぎたかな、というところはあったんですが、なんと皆さん完走されました!素晴らしい!

ということで、最後にみんなで記念撮影です。

振り返り

今回、時間がかなりタイトだったので、もっちゃんさんの基本編+応用編は多分大変だったんじゃないかなぁと思います、ほんとお疲れさまです!ただ、なんとなく雰囲気的には参加者の皆さん、エンジニアな感じもしたので全然ついてきていただけたのではないかなと思ったり。結果的には良かったんじゃないかなと思います。

自分的にも、初の講師側だったんですが、まったく緊張しなかったし、まあまあうまくできたんじゃないかなと勝手に思ってます。

ただ、今回も恒例のアレ、やっぱり起きました・・・

このあたり、結構時間をロスするところでもあって、事前準備をお願いしていたのですが、それでもやっぱり起きるのはもうしょうがないですね。次のハンズオンではアカウントセットアップ後に確認の意味も込めてアップロードして確認、復旧手順まで含めた手順を用意しようと思います。

その他は、やっぱりいつもどおり、ウイルスチェックソフトでテストが動かないとか、アップロードしたけどなんか反映されない、もっかいやればOK、みたいなのはありましたけど、このあたりは過去の経験活かせたのでよかったです。

あとは

  • 前から思ってるんだけど、ハンズオン資料で作るサンプルスキルのバリエーション、もうちょっと増やしたいです。
    • テーマごとにサンプルスキルを用意する。例えば、「親子で作る」ならキッズ向けに動物の鳴き声とかで効果音や音声データたくさん使った楽しいクイズスキルとか、会社内で使うとかだったらもう少し実用的なイメージで受付スキル、みたいな。「テーマ」があれば、より参加者の興味に近いし、
    • 難易度によって内容を変えたい。今回は初心者向けということで、基本的なブロック中心で、最後に少しだけチャレンジングな形でAPI連携という感じにしたのだけど、エンジニア寄りの難易度高めならAPI駆使して他のサービスと連携したり、Alexaの仕組みがちょっとわかってきた中級者向けならInteraction Blockを使ってインテントやスロットを使いこなす、みたいな。
    • で、申込時にスキル開発の経験とかを聞いておいて、それを踏まえてどのレベルのハンズオンにするか、とかってやれると理想的。
  • 当日終了後のアンケート、次回以降の企画のために取るようにしたい(これは忘れてた・・・)

あたりは今後に活かしていきたい。

今後について

今回急遽ということもあり、事前にいくつかのイベントで宣伝的にLTした際に結構たくさんの方に興味持ってもらったりもしたんですが、スケジュールがもう埋まってる、とか、平日は難しい、とか、いろいろタイミングが合わない方もいらっしゃったので、もう少し規模小さめでいろいろな場所でやれたらいいなーと思ってます。是非ここでやってほしい、もしくは、一緒にハンズオンイベントやりたい、という方がいらっしゃれば、お声がけください。

最後に、いろいろ事前の準備や当日の受付等までやっていただいた@gaomarさんと@xinsuzukiさん、サポートスタッフで奮闘いただいた@yucky_sun、そして、ダブル講師のもっちゃんさん、開催協力いただいたさくらインターネットさん、並びに、参加者頂いた皆様、ありがとうございました!