1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Alexa モーションAPI(Smart Motion extension)を公開中のスキルに追加した

Last updated at Posted at 2021-04-18

はじめに

Alexaの首振りデバイスである、Echo Show 10 が日本でも発売されたので、プライマリーユーザーを追尾(首振り)するモーションAPIを試してみた。

モーションAPIとは

Echo Show 10などのスクリーンが自動的に回転する、モーション対応のデバイスを制御するためのAPIで、APL Extensions で制御する。Extensionsは、APLランタイムに追加のデータソース、コマンド、イベントハンドラーを提供する拡張機能で、APL 1.4 以上で使用可能となっている。

スキルマニフェストとAPLドキュメントの双方に設定が必要で、APLドキュメントで設定された情報が優先される。

Echo Show 10

公開中のスキルに追加してみた

中学一年の英単語(Alexaスキル)APL Smart Motion extension を仕込んで再申請したところ、無事に審査をパスした。ひとまず turnToWakeWordPlayNamedChoreo で首を振るだけの簡単な追加。審査が通っていることが重要で、今後はAPLドキュメントの修正のみでアップデートが可能なのでいろいろ追加していきたい。

:point_down_tone3: こんな感じで動く(クリック) :point_down_tone3:

turnToWakeWordの動作確認

どんな事ができるのか

  • ウェイクワードが発話された時のビルトインモーションを指定する。
  • コマンドを実行してデバイスを制御する。
  • あらかじめ用意されている一定のモーションを再生する。(コレオ
  • デバイスの現状を含むプロパティ値を取得する。(ライブデータプロパティ
  • イベントハンドラーを使用して、デバイスの状態の変化を検知する。

Smart Motion extension を有効にするには

skill.json の interfaces に追加する。
スキル内で使用している全てのAPLドキュメントに適用させる場合は autoInitializedExtensions プロパティに追加する。

        "interfaces": [
          {
            "type": "ALEXA_PRESENTATION_APL"
          },
          {
            "type": "ALEXA_EXTENSION",
            "requestedExtensions": [
              {
                "uri": "alexaext:smartmotion:10"
              }
            ],
            "autoInitializedExtensions": [
              {
                "uri": "alexaext:smartmotion:10",
                "settings": {
                  "wakeWordResponse": "followOnWakeWord"
                }
              }
            ]
          }
        ]

Alexa Developer Console で設定する場合は、メニューから ビルド スロットタイプ インターフェース と辿り Alexa Extensions に、ウェイクワードレスポンスの選択と、使用するエクステンションのチェックをする。

image.png

APLドキュメントの記述

Smart Motion extension はAPLで制御するため、スキルにAPLを追加する必要がある。

extensions

まず、extensionsSmart Motion extension を使用できるようにする。
以下の例では SmartMotion という名前(任意)を割り当てたので、以降の操作は SmartMotion に対して行うことになる。

{
  "type": "APL",
  "version": "1.5",
  "theme": "dark",
  "extensions": [
    {
      "name": "SmartMotion",
      "uri": "alexaext:smartmotion:10"
    }
  ],

settings

settings には、deviceStateNamewakeWordResponse が設定できる。設定方法は以下。

settings.AssignedName

AssignedName は、extensionsで Smart Motion extension に割り当てた名前。ここではSmartMotionがそれ。この SmartMotion にプロパティdeviceStateName を設定することで DeviceState 情報を取得できるようになる。そして、スキルマニフェストとは異なる動作にする場合は、wakeWordResponse を設定することでウェイクワードを発話した時のビルトインモーションを変更できる。

  "settings": {
    "SmartMotion": {                           ←--- AssignedName
      "deviceStateName": "MyDeviceState",    ←---  データバインディングコンテキスト(※1)
      "wakeWordResponse": "followOnWakeWord"   ←--- ビルトインモーションの設定
    }
  },

※1 Smart Motion extension では、データバインディングコンテキストにライブデータオブジェクト DeviceState が追加される。 DeviceState は、現在のデバイスの物理的な状態とデバイスの機能を表すオブジェクトで、DeviceState に含まれるプロパティがライブデータプロパティである。

deviceStateName に名前(任意)を設定することで、DeviceStateにアクセス可能となる。この設定そのものが無かったっり、設定値が""の場合は、ライブデータプロパティにはアクセスできないので注意。ライブデータプロパティは、APLドキュメントのライフサイクル中に変更できるデータオブジェクト。

DeviceStateプロパティ

No. プロパティ名 動作
1. error 文字 読み取り可能なエラーメッセージ。エラーがない場合は""。
2. errorCode 数値 エラーコード。エラーがない場合は0。
3. motionLimit オブジェクト モーションの範囲。
4. poise オブジェクト モーションと位置の状態。
5. screenAngle 数値 表示方向(度単位)。

APL Extensionのライブデータとは
APL Extensionsは、ドキュメントのグローバルデータバインディングコンテキストに、カスタムの「ライブ」データオブジェクトを追加できます。ドキュメント読み込み時のextensionの静的な状態のみを報告するenvironment.extension環境プロパティと異なり、これらの「ライブ」データオブジェクトは、ドキュメントのライフサイクルを通じ、extensionのユースケースに応じて変化します。

データバインディングコンテキストとは
データバインディングを目的としてAPLドキュメントで使用できるデータソースとデータのコレクションです。データはキーと値のペアで構成され、APLドキュメント、デバイスのviewportに関する情報(viewport.widthなど)、デバイスの機能、環境情報(environment.aplVersionなど)に付随するデータソースを含みます。

wakeWordResponse は スキルマニュフェストとAPLドキュメントの両方に設定することが可能だが、両方設定されている場合はAPLドキュメントの設定が優先される。

No. 設定値 動作
1. turnToWakeWord 話者の方向に向きを変え、動きを止める。
2. followOnWakeWord 移動を続けながら同じユーザーを追尾する。(※2)
3. doNotMoveOnWakeWord デバイスは動かない。

※2 コマンドでモーションが中断または変更されるまで、ユーザーの追尾を続ける。

イベントハンドラー

イベントハンドラーには OnDeviceStateChanged が設定できる。 DeviceState に変化があった場合に実行される。

AssignedName:EventHandlerName

AssignedName には、extensionsで設定した名前 SmartMotion を設定し、EventHandlerNameにはハンドラーの名前OnDeviceStateChanged を設定し SmartMotion:OnDeviceStateChanged とする。イベントが発生した時に SetValue 等で値を変更する。その際 componentId で対象のコンポーネントと関連づけ、property で値を紐づける。

No. ハンドラ名 動作
1. OnDeviceStateChanged デバイスの状態が変化したときに呼び出されます。poiseを除く
  "SmartMotion:OnDeviceStateChanged": [   ←--- AssignedName:EventHandlerName
    {
      "type": "SetValue",
      "componentId": "mainContainerId",   ←--- コンポーネントID
      "property": "FaultStatus",           ←--- プロパティ
      "value": "${event.changed.errorCode != 0 ? 'CHANGED' : 'NORMAL'}"
    }
  ],
  "mainTemplate": {
    "items": [
      {
        "type": "Container",
        "id": "mainContainerId",           ←--- コンポーネントID
        "bind": [
          {
            "name": "FaultStatus",           ←--- プロパティ
            "value": ""
          }
        ],
      }

イベントオブジェクトの構造はこんな感じ。

マニュアルより転載
{
  "event": {
    "changed": {
        //変更されたすべての状態プロパティ
    },
    "current": {
        //現在のすべての状態プロパティ
    },
    "source": {
      "type": "Document",
      "handler": "OnDeviceStateChanged",
      "id": null,
      "uid": null,
      "value": null
    }
  }
}

イベントオブジェクトの使い方。

  "when": "${event.changed.errorCode != 0}"

コマンド

Smart Motion extensionでは、新しいextensionコマンドが使用できる。Smart Motionコマンド と言うらしい。このコマンドでデバイスに対して動作の命令をする。コマンドを実行するためには、コマンドのtypeプロパティを以下のように設定する。

AssignedName:CommandName

AssignedName には、extensionsで設定した名前 SmartMotion を設定し、CommandNameには、以下のコマンド名を設定する。GoToCenter コマンドを実行する場合は、SmartMotion:GoToCenter となる。

No. コマンド名 動作
1. FollowPrimaryUser エンゲージメントが最も高いユーザーがいる場合は、そのユーザーに従うようデバイスに指示します。
2. GoToCenter デバイスを中央の位置に移動します。中央の位置は、デバイスごとに異なります。
3. SetWakeWordResponse ビルトインウェイクワード応答モーションの動作を変更します。
4. StopMotion 現在のモーションをキャンセルします。
5. TurnToPrimaryUser エンゲージメントが最も高いユーザーがいる場合は、そのユーザーの方向に回転するようデバイスに指示します。
6. PlayNamedChoreo 指定されたコレオを実行します。

使い方はこんな感じ。

        "item": {
          "type": "AlexaButton",
          "alignSelf": "center",
          "buttonText": "Let's Play Chase!",
          "primaryAction": [
            {
              "type": "SmartMotion:FollowPrimaryUser"
            }
          ]
        }

PlayNamedChoreo

choreo コレオとは、舞踏(dance)という意味があるらしい。
現在は以下の4つが設定できる。

No. コレオ名 動作
1. ScreenImpactCenter デバイスをすばやく左右に揺らすモーション。
2. ClockwiseMediumSweep 時計回りに流れる滑らかなモーション。
3. CounterClockwiseSlowSweep 反時計回りに流れるゆっくりとした滑らかなモーション。
4. MixedExpressiveShakes デバイスの現在の向きをすばやく連続で左右に揺らす。

コレオを再生するためのAPLへの設定方法はこんな感じ。例えば onMount に設定する。

  "onMount": [
    {
      "type": "SmartMotion:PlayNamedChoreo",
      "name": "ScreenImpactCenter",
      "delay": 2000
    }
  ],

Smart Motion extensionの仕組み

仕組み

再審査

特に指摘もなく、あっさりパスした。

おわりに

まだ動作が不安定なのかな?と感じる部分もあるように思う。turnToWakeWord 設定しているのに、止まらなかったりする時があるが、これから修正されていくのだろう。これらとスキルを組合せることで何ができるのか・・・それを考える方が難しそうだ。

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?