開発者コンソール

Fire TVにおけるMedia Session APIを使用した音声対応トランスポートコントロール

Fire TVにおけるMedia Session APIを使用した音声対応トランスポートコントロール

Amazon Fire TV対応アプリの一部は、音声対応の再生制御をサポートしています。たとえば、Amazonビデオで映画を観るとき、ユーザーは「アレクサ、再生して」と言えばメディアを開始できます。また、「アレクサ、一時停止して」と言ってメディアを一時停止することや、「アレクサ、早送りして」と言ってメディアのタイムラインを先に進めることもできます。このような音声コマンドを有効化するには、Android Media Session APIを統合します。

ビデオチュートリアル

次のビデオ(日本語字幕付き)では、Fire TVでのMedia Session APIの統合について、概要と手順を説明します。

Media Session API実行時(ユーザーがFire TVに「早送り」や「早戻し」などの音声コマンドを発した場合)のデモ、およびMedia Session APIを一から組み込むための詳細なコード例が含まれています。​ビデオのスライド(英語のみ)を参照することもできます。

以下のセクションでは、Media Session APIがアプリに実装済みであることを前提として、概略を説明します。Media Sessionをまだ実装していない場合は、ビデオとブログ記事の詳しいコード例を参照してください。

音声対応のメディア再生の要件

Android Media Sessionをアプリに組み込んで音声コマンドを有効化するには、APIレベル21以上をサポートするFire TVまたはFireタブレットに対応するメディアアプリが必要です。

なお、ここで説明する手順は、ウェブアプリ向けではなくJavaベースのAndroidアプリ向けです。Media Session APIをウェブアプリに組み込むことはできますが(CordovaなどのAndroidラッパーを使用)、このドキュメントではその手順について触れていません。

また、このドキュメントは、コードを扱うAndroid開発者を対象としています。もっと簡単に音声対応のメディア再生機能をアプリに実装するには、Fire App Builderをご検討ください。メディアセッションがデフォルトで組み込まれています(Fire App Builderは、ストリーミングメディアアプリ開発用のフレームワークです)。

Androidメディアセッションについて

AndroidにはMediaSessionと呼ばれる、アプリがメディアコマンドを受信できるようにするためのAPIが備わっています。Fire TVのAlexaはMedia Session APIを利用してローカルのメディアアプリにコマンドを送信します。アプリがMedia Sessions APIを実装していれば、リモコン、キーボード、ヘッドセット、adbなどからのイベントもMedia Sessions API経由でアプリに送信されます。

Media SessionをFire TVアプリに実装すると、数多くのメリットがもたらされます。

  • メディアセッションは、堅牢な音声対応の再生制御をメディアに提供します。
    • メディアセッションを使用すると、単一のアプリでFire OS 5、Fire OS 6Fire OS 7のリモコン、キーボード、ヘッドセット、adbなどのイベントを処理できるようになります(ほかのAPIでは、Fire OSのバージョンに応じて異なる実装が必要になる場合があります)。
  • メディアセッションをFire TVアプリに組み込んで適切なパーミッションを追加すると、アプリは音声コマンドに対応するようになります。アプリはニアフィールド音声コマンド(リモコンのマイクを使用)とファーフィールド音声コマンド(Fire TVと連携するEchoなどのAlexa対応デバイスを使用)の両方をサポートします。
  • すべてのFire OSデバイスで、音声対応の再生制御(再生、一時停止、早送り、早戻し、戻る、次へ、最初から聞く)を行うには、メディアセッションの実装をお勧めします(Fire TVおよびFireタブレットではFire OSが使用されています)。

メディアセッションの詳細については、Androidドキュメントの以下のトピックを参照してください。

サポートされる音声コマンド

Fire TVデバイスのメディアセッションでは、以下の音声コマンドがサポートされています。

コマンドの種類 音声コマンドの例 説明
再生 「アレクサ、再生して」

「アレクサ、再開して」
メディアを再生/再開します。
一時停止 「アレクサ、一時停止して」

「アレクサ、止めて」
メディアを一時停止します。
早送り 「アレクサ、30秒早送りして」

「アレクサ、早送りして」
指定した時間分だけメディアを早送りします。時間が指定されていない場合、デフォルトは10秒です。
早戻し 「アレクサ、30秒早戻しして」

「アレクサ、早戻しして」
指定した時間分だけメディアを早戻しします。時間が指定されていない場合、デフォルトは10秒です。
次へ 「アレクサ、次へ」 次のコマンドをトリガーし、プレイリストの次のメディアを再生します。
前へ 「アレクサ、前へ」 前のコマンドをトリガーし、プレイリストの前のメディアを再生します。
最初から 「アレクサ、最初から」 メディアの最初に戻ります。

メディアセッションの統合とビデオスキルAPIの比較

Video Skills Kit(VSK)を組み込むと、より緊密に音声機能をアプリに統合することができます。ビデオスキルAPIは、メディア再生に配信コントロール(再生、一時停止、早送りなど)を提供するだけではありません。ビデオスキルAPIによって、ユーザーはFire TVのどこからでも(アプリ内に限らない)アプリのメディアを音声検索できるようになります。Video Skills Kitを組み込むには、メディアがAmazonカタログに含まれている必要があります。詳細については、Fire TV対応アプリ用VSK(Video Skills Kit)についてを参照してください。

後日ビデオスキルAPIに移行する際には、ここに記載の手順で組み込んだメディアセッションを削除する必要はありません。同一のアプリにメディアセッションとビデオスキルAPIの両方が組み込まれている場合、Fire TVは配信コントロールコマンドにメディアセッションコードを使用し、コンテンツの検索とチャンネルの変更にビデオスキルAPIコマンドを使用します。

メディアセッションでは処理できない再生制御のサポートをアプリが必要とする場合は、ビデオスキルAPIを使用してPlaybackControllerおよびSeekControllerディレクティブによって再生制御を行います。この場合、メディアセッションコードは再生制御用にバイパスされます(ビデオスキルAPIのFire TVへの組み込みに関するドキュメントは近日公開されます)。

音声対応のメディア再生向けにメディアセッションを組み込み

主にAndroid メディアセッションに関するドキュメントの情報に基づき、メディアセッションを使用してビデオアプリオーディオアプリを構築してください。

Fire TVアプリの音声対応メディア再生機能向けにメディアセッションを組み込むうえで重要な点について、以下に詳しく説明します。

メディアセッションのパーミッションを追加する

アプリを制御するための音声コマンドを有効化するには、パーミッションcom.amazon.permission.media.session.voicecommandcontrolをアプリのマニフェストに追加します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"android:versionCode="2147483647"android:versionName="1.0" >

.....
<uses-permission android:name="com.amazon.permission.media.session.voicecommandcontrol" />
......

再生機能を設定する

アプリのメディアセッションによって何がサポートされているかをAlexaが把握するには、メディアセッションによるアクション一式が提供される必要があります。標準的にサポートされているアクションは、AndroidのPlaybackStateに関するドキュメントにリストされています。

音声制御に関してAlexaによってサポートされているアクションは以下のとおりです。

アクション 説明
ACTION_PLAY_PAUSE ACTION_PLAYアクションとACTION_PAUSEアクションが含まれています。下記の説明を参照してください。ヒント: 簡素化するためには、ACTION_PLAYコマンドとACTION_PAUSEコマンドを個別に使用せず、この単一のコマンドを使用することをお勧めします(必須ではありません。どちらの方法でも結果は同じです)。
ACTION_PLAY 再生を再開します。
ACTION_PAUSE 再生を一時停止します。
ACTION_SEEK_TO 指定された再生時間にジャンプします。マイナスの時間が指定された場合は、デフォルトで0にジャンプします。
ACTION_SKIP_TO_NEXT 次の「エピソード」や「トラック」にスキップします。
ACTION_SKIP_TO_PREVIOUS 前の「エピソード」や「トラック」にスキップします。

アクションが提供されず、ユーザーがサポート対象外のコマンド(「最後のエピソードに移動して」など)をトリガーすると、Alexaは「すみません、そのコマンドはサポートされていません」などと答えます。

メディアセッションコールバックアクションを設定する

以下のメディアセッションコールバックコマンドは、音声コマンドによって以下のアクションのいずれかが開始するとトリガーされます。

これらはAlexa音声コマンドによって使用されるコールバックですが、これ以外のあらゆるユースケースに対応するために、追加のコールバックを実装することを強くお勧めします(早戻し、早送りなど)。

アクション MediaSession.Callbackシグネチャ 説明 サポートされる音声コマンド
再生 onPlay() 再生を再開します。 「アレクサ、再生して」

「アレクサ、再開して」
一時停止 onPause() 再生を一時停止します。 「アレクサ、一時停止して」

「アレクサ、止めて」
次へスキップ onSkipToNext() 次のメディア単位にスキップします。TV番組のエピソードや楽曲がこれに該当します。 「アレクサ、次へ」
前にスキップ onSkipToPrevious() 前のメディア単位にスキップします。 「アレクサ、前へ」
シーク onSeekTo(long pos) 指定時間(ミリ秒)にシークします。ユーザーが相対時間を指定すると、シークする時間が計算され、このコールバックに返されます。絶対時間はサポートされていません(たとえば、「アレクサ、2時間15分まで早送りして」と言っても、再生の現在位置は2時間15分に設定されません)。

イベントを再始動する場合は、0へのシークがコールバックに渡されます。
「アレクサ、5分早戻しして」

「アレクサ、5分早送りして」

「アレクサ、早送りして」(デフォルトは10秒)

「アレクサ、早戻しして」(デフォルトは10秒)

「アレクサ、最初から」

メディアセッションを使用した高度な音声対応の再生制御(オプション)

Androidメディアセッションに関するドキュメントでは、オーディオフォーカスがある場合にのみアプリがメディアセッションコマンドを受け取るようにすることが推奨されています。つまり、メディア再生時にユーザーが「アレクサ、一時停止して」と言うと、Voice Chromeが閉じた後、メディアセッションの一時停止コマンドを受け取るまで一瞬再生を再開してから一時停止することになります。したがって、音声によって再生の状態が変わるときに、短い中断(この場合は、一時的な映像表示)が見られます。

Fire TVメディアセッションの音声コマンドを実装すると、オプトインして、そうした現象の起きないFire TV内のアプリのエクスペリエンスに合わせることができます。以下のセクションでは、その実行方法ついて説明します。

オプトインのパーミッションを追加する

オプトインしてFire TVメディアセッション音声コマンドを実装するには、パーミッションcom.amazon.voice.supports_background_media_sessionをアプリのマニフェストに追加します。

<manifest>
    ...
    <application>
        ...
        <meta-data android:name="com.amazon.voice.supports_background_media_session" android:value="true" />
        ...
    </application>
    ...
</manifest>

オーディオフォーカスを取得する前にアプリを更新してメディアセッションコマンドに従う

Fire TVメディアセッション音声コマンドの実装にオプトインすると、Voice Chrome(「アレクサ」と言うと画面上部に表示される青い線)がオーディオフォーカスを失う前に、メディアセッションコマンドがアプリに送信されます。アプリは、オーディオフォーカスを取得する前に受け取ったメディアセッションコマンドを処理する必要があります。

たとえば、アプリの内部状態が「メディア再生中」で、Voice Chromeが呼び出される前に「アレクサ、一時停止して」というコマンドが出された場合、その一時停止コマンドはアプリに送信され、アプリは内部状態を「一時停止済み」に変更する必要があります。 オーディオフォーカスを再取得したら、アプリは内部状態を問い合わせますが、既に一時停止しているため、メディアを再開しません。


Last updated: 2022年8月18日