Alexa.SeekControllerインターフェース
「アレクサ、5分早送りして」や「アレクサ、60秒早送りして」など、特定の時間だけ早送りや早戻しをするようにユーザーが発話すると、Alexa.SeekControllerインターフェースはAdjustSeekPositionディレクティブをアプリまたはLambdaに送信します。
SeekControllerインターフェースから送信されるディレクティブ(AdjustSeekPositionディレクティブなど)には、特定のオフセット時間の情報が含まれているため、PlaybackControllerインターフェースによる早送りや早戻しの操作とは異なることに注意してください。
SeekControllerを使用するのではなく、Android MediaSessionを使用することをお勧めします。Media Sessionは、より低レイテンシで一貫性のあるユーザーエクスペリエンスを実現しながら、同じ機能を提供します。詳細については、手順2: MediaSessionと統合するを参照してください。- AdjustSeekPositionディレクティブの発話
- AdjustSeekPositionディレクティブの処理
- AdjustSeekPositionディレクティブの例
- ペイロードの定義
- レスポンスの例
- インターフェース機能に対するサポートの宣言
AdjustSeekPositionディレクティブの発話
ユーザーが以下の発話を行うと、AlexaはAdjustSeekPositionディレクティブをアプリ(アプリのみの統合の場合)またはLambda(クラウド側の統合の場合)に送信します。
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | Fast forward thirty seconds | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | Rewind forty seconds | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | Avance de trente secondes Saute trente secondes | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | rebobina treinta segundos retrocede diez segundos | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | Avance de trente secondes Saute trente secondes | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | Rembobine de trente secondes Retour en arrière de trente secondes | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | spul/spring [Duration] lang? vor/vorwärts spring [Duration] vorwärts auf [AppName] spul [DeviceBrand] vor spring [Duration] auf [DeviceBrand] vor überspring [Duration] auf [DeviceType] | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | spul zurück spring zurück spul/spring für? [Duration] lang? zurück spring nach hinten für [Duration] spul [AppName] zurück spul [AppName] [Duration] zurück spul [Duration] auf [AppName] zurück spring rückwärts auf [AppName] für [Duration] spul auf? [DeviceBrand] zurück spul [DeviceBrand] [Duration] zurück | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | [Duration] के लिए आगे/forward जाओ [Episode] में fast forward Duration कर दें [Duration] के लिये [Episode] forward कर दें[MediaType] में [Duration] आगे जाओ[AppName] पर [Duration] आगे जाओ | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | 1. पीछे जाना दस seconds 2. rewind करो forty seconds | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | manda avanti l' episodio di trenta secondi vai avanti di trenta secondi manda avanti di trenta secondi | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | manda indietro di trenta secondi manda indietro il video di trenta secondi | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 |  | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 |  | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 |  | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | rebobinar/voltar [durastion] | リクエストされた時間だけメディアが早戻しされます。 | 
| 機能 | サンプル発話 | 想定されるレスポンス | 
|---|---|---|
| 早送り(時間指定) 認定に必須 | adelanta treinta segundos salta diez minutos en la película | リクエストされた時間だけメディアが早送りされます。 | 
| 早戻し(時間指定) 認定に必須 | rebobina treinta segundos retrocede diez segundos | リクエストされた時間だけメディアが早戻しされます。 | 
ほかのディレクティブの場合と同様に、Discoverディレクティブを受信したら、ビデオスキルでサポートしているSeekControllerディレクティブを指定する必要があります。
AdjustSeekPositionディレクティブの処理
AdjustSeekPositionディレクティブでは、deltaPositionMilondsというプロパティがpayloadに含まれます。deltaPositionMilondsには、正の値(ストリーム内を前方にシーク)または負の値(ストリーム内を後方にシーク)を指定できます。
たとえば、「5分スキップして」と発話した場合、deltaPositionMillisecondsの値は300000になり、「10分早戻しして」と発話した場合、deltaPositionMillisecondsの値は-600000になります。
つまり、負の値は早戻し、正の値は早送りを示します。指定されたオフセット分だけ先に進んで、ユーザーのリクエストを必ず満たしてください。
AdjustSeekPositionディレクティブの例
AdjustSeekPositionディレクティブの例を以下に示します。
EXTRA_DIRECTIVE_NAMESPACE: Alexa.SeekController EXTRA_DIRECTIVE_NAME: AdjustSeekPosition EXTRA_DIRECTIVE_PAYLOAD_VERSION: 3 EXTRA_DIRECTIVE_PAYLOAD: payload
payloadの内容は以下のとおりです。
{
    "payload": {
    "experience": {
        "mode": "VOICE_OPTIMIZED",
         },
        "deltaPositionMilliseconds": 300000
    }
}
{
    "directive": {
        "endpoint": {
            "cookie": {},
            "endpointId": "VSKTV",
            "scope": {
                "token": "<OAuth2ベアラートークン>",
                "type": "BearerToken"
            }
        },
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "4bef62cc-208d-4382-a43e-ce9e4825c1cb",
            "name": "AdjustSeekPosition",
            "namespace": "Alexa.SeekController",
            "payloadVersion": "3"
        },
        "payload": {
           "experience": {
              "mode": "VOICE_OPTIMIZED",
                  },
            "deltaPositionMilliseconds": 300000
        }
    }
}
ペイロードの定義
payloadのプロパティを次の表に示します。
| フィールド | 説明 | データ型 | 
|---|---|---|
| deltaPositionMilliseconds(必須) | メディアプレーヤーでの再生時にシークする相対的時間(ミリ秒単位)です。現在のシーク位置から前方または後方にシークするために、正または負の整数値を使用できます。指定できる値は、 -86400000から86400000までの整数値(-24~+24時間)です。シーク先の位置がメディアアイテムの視聴時間外になる場合は、deltaPositionMillisecondsが負の値であるか正の値であるかに応じて、それぞれ視聴時間の先頭または末尾に設定されます。例:  | 整数 | 
| experience(省略可能) | 検索結果の表示を最適化するオブジェクトです。 experienceオブジェクトを使用すると、ユーザーが検索に使用したデバイスに基づいて、検索結果の表示方法を変更できます。experienceオブジェクトとその値の詳細については、エクスペリエンスタイプを参照してください。 | modeを含むオブジェクト | 
エクスペリエンスタイプ
experienceオブジェクトを使用すると、検索に使用されたデバイスに基づいて、検索結果の表示を最適化できます。たとえば、ユーザーがFire TVリモコンを使用して検索した場合、ユーザーはリモコンを使用して結果を閲覧できるため、experienceオブジェクトによって多数の検索結果が表示されます。一方、Fire TVとペアリングされたEchoを使用して検索リクエストが行われた場合は、experienceオブジェクトによって表示される結果の数と表示方法が制限され、ユーザーはリモコンを使用せずに結果を確認できます。
experienceオブジェクトは、検索結果の表示方法を決定するmodeオブジェクトで構成されています。modeオブジェクトは、 VOICE_OPTIMIZEDとDEFAULTの2つの値を取ります。
- 
    VOICE_OPTIMIZED: 音声専用デバイス向けに最適化された表示方法です。リモコンを使用せずに音声で操作できる検索結果のリストが表示されます。
- 
    DEFAULT: 検索に使用されたデバイスに関係なく、すべての検索結果をリスト形式で表示する、デフォルトの表示方法です。
上位互換性を確保するため、modeで不明な値を受け取った場合は、失敗とするのではなく、DEFAULTにフォールバックするようにしてください。
レスポンスの例
アプリでディレクティブが正常に処理された場合、BroadcastReceiverクラスは、次のように、成功ステータスを含む成功のインテントを返送します。
if (response != null && sendResponse) {
  Intent success = new Intent().putExtra(VSKIntentConstants.EXTRA_DIRECTIVE_STATUS, didSucceed);
  try {
    response.send(context, 0, success);
  } catch(PendingIntent.CanceledException e) {
    // 応答に時間がかかりすぎているため、ログにエラーを出力します
  }
}
詳細については、手順7: BroadcastReceiverを追加するを参照してください。また、具体的なコードの例については、サンプルアプリのAlexaDirectiveReceiverクラスを参照してください。
AdjustSeekPositionディレクティブを受け取ってリクエストを実行したら、位置の状態をミリ秒単位で示すレスポンスをAlexaに送り返します。次の例に示すように、payloadにはnameおよびvalueプロパティが含まれています。positionMillisecondsは、シーク先の絶対位置を-86400000から86400000までのミリ秒数で表します。
例
{
    "context": {
        "properties": []
    },
    "event": {
        "header": {
            "correlationToken": "dFMb0z+PgpgdDmluhJ1LddFvSqZ/jCc8ptlAKulUj90jSqg==",
            "messageId": "eab7fe6e-f65d-4dbb-aeea-5bae61439f4d",
            "name": "Response",
            "namespace": "Alexa",
            "payloadVersion": "3"
        },
        "payload": {}
    }
}
何らかの理由でユーザーのリクエストを完了できない場合は、エラーレスポンスを返す必要があります。詳細については、エラー処理を参照してください。
インターフェース機能に対するサポートの宣言
アプリでSeekControllerを受け取るには、機能を宣言する際にこのインターフェースのサポートを明示する必要があります。アプリのみの統合で機能を宣言する方法の詳細については、以下を参照してください。
ビデオスキルがAlexa.SeekControllerインターフェースをサポートしていることを示すには、Alexa.Discoveryインターフェースを介して送信されたDiscoverディレクティブへのレスポンスで、そのサポートを明示する必要があります。詳細については、Discoveryインターフェースを参照してください。

