MediaSession APIを使用した音声対応トランスポートコントロール


MediaSession 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をご検討ください。Media Sessionがデフォルトで組み込まれています(Fire App Builderは、ストリーミングメディアアプリ開発用のフレームワークです)。

Android Media Sessionについて

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

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

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

Media Sessionの詳細については、Androidドキュメントの以下のトピックを参照してください。

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

Fire TVデバイスのMedia Sessionでは、以下の音声コマンドがサポートされています。

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

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

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

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

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

Media Sessionの統合とビデオスキルAPIの比較

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

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

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

音声対応のメディア再生向けにMedia Sessionを組み込み

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

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

Media Sessionのパーミッションを追加する

アプリを制御するための音声コマンドを有効化するには、パーミッション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が把握するには、Media Sessionによるアクション一式が提供される必要があります。標準的にサポートされているアクションは、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は「すみません、そのコマンドはサポートされていません」などと答えます。

Media Sessionコールバックアクションを設定する

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

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

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

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

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

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

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

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

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

「アレクサ、最初から」

Media Sessionを使用した高度な音声対応の再生制御(オプション)

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

Fire TV Media Sessionの音声コマンドを実装すると、オプトインして、そうした現象の起きない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>

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

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

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