kun432's blog

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

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

Voiceflow TIPS #27 APLで画面を遷移させる

Voiceflow夏休みAdvent Calendarの27日目です。1日遅れてしまい申し訳ありません。ちょっと疲れが出てきましたがなんとかキャッチアップしていきたい・・・

今日は、APLでの画面遷移についてご紹介します。APLについては、TIPS #9で、ことはじめ、的にご紹介しましたが、単に表示できるよ、というだけで、やっぱりシーンに合わせて画面を変更したりとかしたいですよねー。Voiceflowならブロック並べるだけだしかんたんじゃん、と思われる方もおられるかと思いますが、だいたいハマります。ということで、ハマるところも含めて一度やってみましょう。

まず、スキルのイメージはこんなかんじにしましょう。画像が画面に出るような感じだと思ってください。


アレクサ、「今日の晩ごはん」をひらいて

今日の晩御飯です。晩御飯におすすめのメニューを提案するよ。今日のおすすめは・・・
f:id:kun432:20190827221349p:plain

カレーライス、
f:id:kun432:20190827221411p:plain

お寿司、
f:id:kun432:20190827221416p:plain

ハンバーグ、
f:id:kun432:20190827221422p:plain

です。どれか気に入ったものはありますか?


たしかにこうなるといいですよねー。さてできるでしょうか?

画面の設計

まず最初に今回必要な画面は以下の4つです。

  • 起動直後に表示される挨拶の画面(コックさんの画像を表示します)
  • カレーが表示される画面
  • お寿司が表示される画面
  • ハンバーグが表示される画面

それぞれのページ向けに別々にテンプレート作ってもいいんですが、同じような設定があるのも無駄ですよね。なので、一つのテンプレートの中で画像名だけを変数に入れて、画面遷移ごとに切り替えるようにします。ここは後で説明します。

画像の準備

APLで使う画像を予め用意しましょう。今回は皆さんご存知「いらすとや」さんの画像を利用させていただきました。画面表示を踏まえて少しサイズ等は調整してあります。(今回のスキルをご自身で試される場合にはダウンロードしてお使いいただけますが、著作権および利用については「いらすとや」さんの利用規約をご確認ください。)

f:id:kun432:20190827230322p:plainf:id:kun432:20190827230326p:plainf:id:kun432:20190827230333p:plainf:id:kun432:20190827230337p:plain

また、APLで画像を使う場合、Voiceflowにアップロードして使うことができませんので、どこかで別の場所において公開する必要があります。私の場合はAmazon S3に置きました。Dropbox等で公開用リンクを作るのもよいかもしれません。以下、参考までに。

www.foxism.jp

APLテンプレートの作成

APLのオーサリングツールでテンプレートを作っていきしょう。基本的に前回と同じです。Display Blockをおいて、メニューから「Add Displays」をクリックします。

f:id:kun432:20190827232925p:plain

最初なので「New Display」をクリックします。

f:id:kun432:20190827233042p:plain

テンプレート作成画面で、「AuthoringTool」をクリックします。

f:id:kun432:20190827233058p:plain

テンプレートは画像表示サンプルにします。今回の場合だとメニュー的なやつのほうが合うと思うんですが、画面遷移を試したいわけなので。

f:id:kun432:20190827233129p:plain

テンプレートが表示されたら、「コードの書き出し」でテンプレートファイル(apl_template.json)をダウンロードしてください。

f:id:kun432:20190827233143p:plain

Voiceflowに戻りましょう。先程のテンプレートをアップロードします。

f:id:kun432:20190827233201p:plain

アップロードされたら、とりあえず名前をつけましょう。"Base"にしました。で、今回は「Save」する前に少しAPLの中身をいじります。

下に黒枠が2つ表示されていると思うんですが、右側の「Default Datasource(Optional)」の下の方を、

f:id:kun432:20190827234033p:plain

以下のような記載があると思います。

・・・
        "image": {
            "contentDescription": null,
            "smallSourceUrl": null,
            "largeSourceUrl": null,
            "sources": [
                {
                    "url": "https://d2o906d8ln7ui1.cloudfront.net/images/MollyforBT7.png",
                    "size": "small",
                    "widthPixels": 0,
                    "heightPixels": 0
                },
                {
                    "url": "https://d2o906d8ln7ui1.cloudfront.net/images/MollyforBT7.png",
                    "size": "large",
                    "widthPixels": 0,
                    "heightPixels": 0
                }
            ]
        },
        "logoUrl": "https://d2o906d8ln7ui1.cloudfront.net/images/cheeseskillicon.png",
        "hintText": "Try, \"Alexa, search for blue cheese\""
    }
}

上記に2箇所同じURLがあると思います。

                 "url": "https://d2o906d8ln7ui1.cloudfront.net/images/MollyforBT7.png",

これ表示するとわかるんですが、

https://d2o906d8ln7ui1.cloudfront.net/images/MollyforBT7.png

ですね。APLのテンプレートの中心に表示されている画像のURLになってます。ここを変数に置き換えて動的に画面変更したいと思います。

上記の記載を以下のように変えてから、「Save」をクリックします。

                 "url": "{gazo}",

ここだけはいつもの"{"を入力してから変数を選択する感じじゃなくて、そのまま入力してOKです。

保存したら、キャンバスに戻ります

フロー

ではフローを作っていきましょう。

まず、最初に、APLのテンプレートの中に記載した、画像のURLを入れておくための変数、"{gazo}"を作成します。

f:id:kun432:20190827235953p:plain

で、とりあえず最初の挨拶のところまでのフローを作ります。

f:id:kun432:20190828000105p:plain

Set Block、Display Block、Speak Blockの3つだけですね。順番に見ましょう。

Set Blockでは画像のURLを変数"{gazo}"にセットします。最初 はコックさんの画像のURLにします。

f:id:kun432:20190828000501p:plain

Display Blockは一旦飛ばして、Speakブロックには最初の挨拶をセットします。

f:id:kun432:20190828000512p:plain

で、Display Blockです。前回と同じようにドロップダウンリストから作成したテンプレートを選択すると、下にテンプレートの内容が表示されます。

f:id:kun432:20190828000751p:plain

で、もう一つ、「Update Variable Changes」というチェックボックスがあるのがわかるでしょうか?

f:id:kun432:20190828000942p:plain

ここにチェックを入れると、「変数の内容が変わった場合、APLテンプレート内の変数もそれに応じて変化し、画面が更新される」のです。これすごいですね!これにチェックを入れておけば、Set Blockで変数の内容=画像のURLを変えるたびに画面が動的に変わりそうです!

まずはここまでで一旦テストしてみましょう。

f:id:kun432:20190828002025p:plain

はい、ここまでは前回とほとんど同じですね、ただきちんとSetで設定した変数がAPLで読み込まれているのがわかりますね。

ではいよいよ画面遷移させてみましょう。さっきのブロックをまるっとコピーして、以下のようにします。

f:id:kun432:20190828002251p:plain

で、少し修正します。Set Blockで指定している画像のパスを、カレーライスの画像のURLに変えてください。

f:id:kun432:20190828002812p:plain

Speak Blockのメッセージも変えます。

f:id:kun432:20190828002825p:plain

Display Blockは動的に書き換わるはず!さぁ、テストしてみましょう!

f:id:kun432:20190828003240p:plain

いきなりカレーの画像になりますね、最初に出てきていたはずのコックさんの画像が出てきません・・・

とりあえず、一旦、お寿司とハンバーグのところも続けて作ってみましょう。で、テスト・・・

f:id:kun432:20190828004521p:plain

やっぱりだめですね・・・一番最後のものしか表示されません。発話はちゃんとされているのに・・・動的に変わると書いてあったのは嘘なんでしょうか・・・・?

原因

ということで、原因を探るために、こうしてみましょう。

f:id:kun432:20190828010003p:plain

画像を表示したあとの発話のあとに、Interaction Blockをおいて「YesIntent」を設定、「はい」といった場合に進むようにしてみました。さあ今度はどうでしょうか?

f:id:kun432:20190828005716p:plainf:id:kun432:20190828005729p:plainf:id:kun432:20190828005802p:plainf:id:kun432:20190828005739p:plain

あれ、今回はうまくいきました、なぜでしょう・・・・?

実はこれ、一度過去にも説明しています。

この「1回の応答」というのはどういうことでしょうか?猫の豆知識スキルのサンプルで説明します。

f:id:kun432:20190817174726p:plain

Alexaからの発話(音声や音楽含めて)が「1回の応答」になるということですね。これをVoiceflowに置き換えてみます。

f:id:kun432:20190817181352p:plain

Speak Blockの中で音声ファイルを使っていて、その後、Interaction Blockでユーザ発話を受け取る感じですね。Speak Blockが3つに別れていますが、Interaction Blockでユーザ側の発話になるまでは、Speak Blockを何個並べても、Alexaの発話としては1回の応答になるという点に注意してください。

なので、これもブロックの数は違うけど、中身的には同じになります。

f:id:kun432:20190817182018p:plain

Speak Blockの数がアレクサからの応答の数、ではないということ、・・・

つまり、APLも同じことで、1回のアレクサからの発話の中に、APL=Display Blockは1回だけ指定できるということですね。一番最初のテストで、最後にDisplay Blockで指定した画像だけが表示されていたのは、Speakはたくさん並べるとまとめて一つになりますが、APLの場合は性質上一つにまとめることができないので、最後のものだけが表示されていたという理由なんですね。あと、これ、カードにも同じことが言えます。

要は、アレクサからの1回の発話の中には、

  • Speak Blockで話すこと
  • Display Blockで表示する内容
  • Card Blockで表示する内容

などがまとめて返されてくるということです。このあたり、ブロックを並べて実行させる感覚だと、なかなか理解しにくいところだと思いますが、非常に重要な概念なのできちんと理解してください。

余談

実は、ユーザの発話を挟まなくても動的に画面を書き換える方法があります。それが「APL Pager」です。

これを使うと、1つのAPLテンプレートの中で画像の切り替えを行ってくれます。少し難易度が高いのですが、興味があればぜひチャレンジしてみてください!


ということで、APLの話、2回目でした。VUIを始めたばかりだと、少し考え方が難しいかもしれませんが、実はこれ、プログラム書いてると普通に理解できたりするんです。なのでVoiceflowでスキル開発に慣れてきたら、すこしづつでもいいので是非プログラム書いてスキル作ることにも挑戦してみてほしいです。Voiceflowのようなノンコーディングでのスキル開発と、ask-sdkを使ったプログラムでのスキル開発、それぞれの理解を深めていくと、お互いに相乗効果でさらに効率がよいスキル開発ができると思っています。