見出し画像

Alexa LIVE 2020 私的まとめ Part 1 (APL 関連)

久々の投稿です。日本時間の 7月23日(木) 深夜1:00〜5:00 に開催された Alexa LIVE 2020 で発表されたものについて、個人的に気になったものについてまとめていきたいと思います。


今年はオンラインの開催で、ビデオは全てここから見ることができます。僕も当日は眠くて寝てしまったので翌日ビデオを一気見しました。


Web や Mobile app との連携がかなり強化されたり、音声認識まわりの開発がより簡単になったりと色々あったんですが、全部書こうとすると結構なボリュームになったのでこの記事ではまず APL 関連のことだけまとめます。


APL for Audio (beta)


Amazon Presentation Language (APL) は今まで画面のレンダリングや画面に対するコマンドを作成するための機能しかなかったのですが、音声のレスポンス作成にも使えるようになりました。


今まで音声のレスポンスは SSML を渡すのみで、 SSML で表現できることしか出来なかったのですが、 APL Audio を使えば複数の音声ファイルをいい感じに合成したりが出来るようです。


APL Audio を紹介しているブログには以下のようなサンプルが上げられていました。とりあえず色々と重ねられてる感は伝わるかと思います。


どのようにこういったレスポンスを組み立てるかというと、 APL をすでに触ったことある方ならイメージつくかもしれませんが以下のように JSON 形式でコンポーネントを組み立てていく感じにやります。

{
   "type": "Speech",
   "contentType":"SSML",
   "content": "${payload.data.ssml}"
}


Speech コンポーネントを単体で使うだけなら今までの発話の組み立てとほぼ同じです。先ほどのようなレスポンスを作成するなら加えて Mixer や Sequencer などのコンポーネントを組み合わせます。


また、既存の APL と同様にデータソースを使って柔軟に発話の内容を決定したり、 Selector と呼ばれるものを使ってレスポンスの内容を条件によって変更出来たりもします。

既存の APL でもそうなんですけど、個人的にはあまりこの部分にロジックを埋め込みたくないので Selector は使わないかなぁ。テストしづらくなるし。


聞いていて全体的にエンタメ系のスキル使ってる人たちには超待望のアップデートなんだろうな。と感じる内容でした。


個人的にかなり嬉しかったのは Silence コンポーネントで、これ使いたいだけがために早く beta 抜け出してくれとお願いだとなるレベルです。

これはドキュメント読む限りただ単にレスポンスを中断して一定時間止まるだけのコンポーネントっぽいんですが、かなり重要なんです。

例えば今は Alexa 側から何かを質問する場合、すぐにユーザーの発話を受け付けるモードになってしまうためユーザーは早く答えないと上手く会話が成り立たないんですが、質問に対して少し考えたいのに急かされる感じがする時とかあってつらいんですよね。


それを抜きにしても Silence が無いと「絶え間なく会話をするスキル」以外のスキルが作りづらいんですよね。


あとちょっとニッチなニーズなんですが、 APL Audio によって音声のレスポンスと画面へ送信したコマンドの実行が同時に行われるようになったりしないかなと期待しています (これから試す予定)。


今も transformer + SpeakItem で音声レスポンスと同時にコマンドの実行をすることが出来るんですが、画面をレンダリングするタイミングでしか transformer を使えないので少し複雑な音声レスポンスパターンとコマンドを使おうとするとだいぶ辛いんですよね。

※ 7/24(金) 追記: 動かしてみた感じ既存のレスポンス発話 -> APL Audio -> APL Command の実行順序でした。残念。 aplAudioToSpeech という transformer を使って配列やオブジェクトのインフレーションを伴う SpeakItem 用のデータ作成ができるので、その画面でしうるレスポンス発話は全て予め作っておけ。ということなのかもしれない。


APL 1.4


APL のバージョン 1.4 が出ました。 結構色々なアップデートが入っています。


Authoring tool まわりのアップデートは地味に嬉しいものが多かったですね。 VSCode で APL の プレビューできるようになったのはかなり嬉しい。

あと、既存の Authoring tool のプレビューモードもまぁまぁ嬉しい。これは、ざっくり言うと見た目の調整だけでなく、コマンドの実行や、 transformer などの生成、タッチ操作による挙動確認もできるようになる機能みたいです (参考)。

JSX for APL は使ってみないとわからないなという印象でした。少なくとも JSX だけならいいんだけど React が使えるようになるのはどうなんだろう。あまり React に詳しいわけでは無いのですが今の ASK の仕様的にあまり React だからこれができるようになって嬉しい!とか簡単にこれができるようになる!が思いつかないんですよね。

すでに React 書ける人が学習コスト少なく Alexa の画面まわり実装できるようになる。というのはもちろんあると思うので、新規に Alexa Skill 書き始めるかつ Web フロントエンドか React Native 書いてました!な人にはもちろん嬉しいアップデートだと思います (参考)。


個人的に APL 1.4 で一番嬉しいのは Back Navigation の話でした。これはいわゆるブラウザバックの仕組みを提供できるようになる機能です。

ただ、セッション変数やコンテキストの管理は上手くやってないともちろん破滅するので導入の際にはそこらへんは注意が必要。

以下のような感じで特定のページ数戻らせることも特定のページへ戻らせることもできるっぽいです。そんなにページ行き来するスキルどうなんだという気はしなくもないですが。

{
 "type": "APL",
 "version": "1.4",
 "extensions": [
   {
     "name": "Backstack",
     "uri": "aplext:backstack:10"
   }
 ],
 "mainTemplate": {
   "item": {
     "type": "Container",
     "items": [
       {
         "type": "TouchWrapper",
         "item": {
           "type": "Text",
           "text": "Go back 3 documents"
         },
         "onPress": {
           "type": "Backstack:GoBack",
           "backType": "count",
           "backValue": 3
         }
       },
       {
         "type": "TouchWrapper",
         "item": {
           "type": "Text",
           "text": "Go to the first document in the backstack"
         },
         "onPress": {
           "type": "Backstack:GoBack",
           "backType": "index",
           "backValue": 0
         }
       }
     ]
   }
 }
}


その他ドキュメントでは「Use document links in RenderDocument」の項が気になりました。書いてあることから察するに、どうやら document に渡す値を従来の JSON ベタ書きではなくそのスキルの Authoring tool で作成したテンプレートへのリンクに出来るようになる。というものみたいです。


document 部分をコードから分離してコードを触らない人でも簡単なレイアウトの調整ができるようになる。ということでしょうか。あまり使いたいモチベーションはありませんがなかなか想定外な機能だったので気になってます。


あと、 sequencer プロパティの追加は細かいですが嬉しいアップデートでしょうね。これは高速モード (ユーザーが画面をスクロールした時など) に中断されるコマンド達が中断されずに実行されるようになる。というものです。

前述した SpeakItem などはまさに高速モードでは中断されてしまうんですが、 sequencer によって防げるようになるみたいです。


というわけで今回は以上。次は Skill Resumption とかスキルのインタラクションまわりのアップデートについてまとめようかな。

この記事が気に入ったらサポートをしてみませんか?