開発者コンソール

クラウド側の統合の概要


クラウド側の統合の概要

Fire TV対応アプリ用VSKを実装する場合、まずAlexaビデオスキルAPIを実装します。ただし、クラウド側の統合を行う場合は、追加のAPIやサービスが必要になります(Amazon Device Messaging(ADM)AWS LambdaAWS IAMLogin with AmazonNode.jsAlexa Client Libraryなど)。Fire TV対応アプリにVSKを組み込むことで、アプリで優れた音声エクスペリエンスをユーザーに提供しながら、エンゲージメントやコンテンツの見つけやすさの向上を図ることができます。

概要

Fire TV対応アプリでは、Alexaがユーザーの発話をリッスンし、それをディレクティブに変換します。ディレクティブは、JSON形式のデータと命令のセットのことで、Alexaからクラウド上のLambda関数に送信されます。

たとえば、ユーザーが「『ボッシュ』を再生して」と話しかけると、Alexaがこれを特定のJSON構造から成る検索ディレクティブに変換します(ほかにも、再生ディレクティブやチャンネル変更ディレクティブなどがあります)。Alexaは、ユーザーの発話をプログラムで処理可能なディレクティブにマッピングする役割を担っています。

さらに、ディレクティブはビデオスキルAPIを介してAWS上のLambdaコードに渡されます。Lambdaは、コードをホストするサーバーを必要とせずに、クラウド上でコードを実行できるAWSのサービスです。LambdaコードがビデオスキルAPIから届いたディレクティブを処理し、Amazon Device Messaging(ADM)経由でLambdaからアプリにアクションが送られます。

必要なもの

クラウド側の統合とアプリのみの統合のどちらを選択するかによって、実装に必要なものは異なります。Fire TV対応アプリにVSKを統合するには、以下が必要になります。

大まかなワークフロー

Fire TV対応アプリにVSKを統合するには、まずAlexa開発者コンソールでビデオスキルを作成し、同スキルをAWS Lambda関数に関連付けます。ユーザーが音声でアプリと対話すると、クラウドベースのAlexa Voice Serviceがユーザーのコマンドを「ディレクティブ」と呼ばれるJSONオブジェクトに変換します。

ビデオスキルは、このディレクティブをLambda関数に送信します。Lambda関数はリクエストを検査し、検索などの必要な処理を実行してから、必要な情報をアプリに送信します。Lambda関数は、プッシュ通知サービスのAmazon Device Messaging(ADM)を使用してアプリとの通信を行います。アプリに関連付けられたセキュリティプロファイルが、アプリとADMの間の通信を承認します。

Lambda関数からの通信を受信したら、アプリはリクエストに応じてメディアの検索結果または最初に再生するメディアを表示します。

ワークフローの詳細

前のセクションではVSKの大まかなしくみについて説明しましたが、今度はワークフローを詳しく見ていきます。Fire TVにおけるビデオスキルのワークフローは、下図のとおりです。

Fire TV対応アプリ用ビデオスキルの説明図とワークフロー
Fire TV対応アプリのVSKワークフロー

Alexa搭載デバイスが自然言語のコマンドをリッスンする

Fire TVでは、Alexaがユーザーからの自然言語コマンドをリッスンします。サポートされている発話(Alexaが理解するフレーズ)には、検索、再生、アプリの起動、チャンネル変更、トランスポートコントロールなどのコマンドが含まれます。Alexa搭載デバイスは、これらのコマンドをクラウド上のAlexaに送信します。

Alexaがフレーズを処理してディレクティブを生成する

Alexaはクラウド上で自動音声認識の機能を使用してユーザーの発話を処理し、音声をテキスト変換します。また、Alexaは自然言語理解の機能を使用してコマンドを処理し、テキスト内容の意図を認識します(この言語処理と解釈の機能はすべて無料で利用可能です)。

ディレクティブがビデオスキルAPIを介してLambdaに渡される

クラウド上でAlexaがユーザーの発話を分析・解釈して出力したものが、ディレクティブです。ディレクティブは、JSONオブジェクトとして記述されたデータと命令のセットのことです。たとえば、ユーザーが「『ビッグバックバニー』を見せて」と話しかけると、Alexaはこの発話を以下のような特定のJSON構造を持つSearchAndPlayディレクティブに変換します。

{
    "directive": {
        "payload": {
            "entities": [
                {
                    "type": "Video",
                    "uri": "entity://provider/program/amzn1.p11cat.merged-video.8a42b984-28c2-5c09-bd24-8d924e004d3f",
                    "value": "ビッグバックバニー",
                    "externalIds": {
                        "hawaii_us": "tt1254207",
                        "ENTITY_ID": "amzn1.p11cat.merged-video.8a42b984-28c2-5c09-bd24-8d924e004d3f",
                        "imdb": "tt1254207",
                        "tms": "MV006850300000"
                    }
                },
                {
                    "type": "Video",
                    "uri": "entity://provider/program/amzn1.p11cat.merged-video.4176eed9-eb18-546a-b934-314f50abe8db",
                    "value": "ビッグバックバニー",
                    "externalIds": {
                        "ENTITY_ID": "amzn1.p11cat.merged-video.4176eed9-eb18-546a-b934-314f50abe8db"
                    }
                },
                {
                    "type": "Video",
                    "uri": "entity://provider/program/amzn1.p11cat.merged-video.1ef9c397-544b-5632-a0d3-9b6439113616",
                    "value": "ビッグバックバニー",
                    "externalIds": {
                        "ENTITY_ID": "amzn1.p11cat.merged-video.1ef9c397-544b-5632-a0d3-9b6439113616",
                        "tms": "12631647"
                    }
                },
                {
                    "type": "Video",
                    "uri": "entity://provider/program/amzn1.p11cat.merged-video.5cdb7c5c-8771-55cd-b552-215e131223f1",
                    "value": "ビッグバックバニー",
                    "externalIds": {
                        "ENTITY_ID": "amzn1.p11cat.merged-video.5cdb7c5c-8771-55cd-b552-215e131223f1"
                    }
                },
                {
                    "type": "Video",
                    "uri": "entity://provider/program/amzn1.p11cat.merged-video.3cabe805-968e-5001-813c-f46b5b1069d7",
                    "value": "ビッグバックバニー",
                    "externalIds": {
                        "ENTITY_ID": "amzn1.p11cat.merged-video.3cabe805-968e-5001-813c-f46b5b1069d7",
                        "tms": "SH023726740000"
                    }
                }
            ]
        },
        "header": {
            "payloadVersion": "3",
            "messageId": "72dfff1c-17df-44c5-acbb-19f491e87609",
            "namespace": "Alexa.RemoteVideoPlayer",
            "name": "SearchAndPlay",
            "correlationToken": "1bb6264b-e248-4087-901e-30c3462082b7"
        },
        "endpoint": {
            "endpointId": "1736bf8bd3091561##amzn1-ask-skill-4c43ae24-ee76-4a78-a189-cc06b64d1be8##development##com-fireappbuilder-android-football-streamz",
            "cookie": {
                "VSKClientVersion": "1.4.5",
                "deviceType": "A2LWARUGJLBYEW",
                "appPackageName": "com.fireappbuilder.android.football.streamz",
                "deviceId": "G070L809716314UB",
                "appName": "Alexa VSKを使用するFire TV対応サンプルアプリ",
                "applicationInstanceId": "amzn1.adm-registration.v3.Y29tLmFtYXpvbi5EZXZpY2VNZXNzYWdpbmcuUmVnaXN0cmF0aW9uSWRFbmNyeXB0aW9uS2V5ITEhYUtudnpaOU1xYlV5aU04NElIdU80a3FYa29lVVFDbE5oa2QzM3FhL3hPUzFMaTNmOXBhTkZPeTVaUmFYK3RaU01Cc2Q4b0U0ZzVkOVdhZDR0TVIyb2UxMitUd3dwL0ZEaGpKMkN3bXJhUnUvNThOa0VCRmg1TzYrVmxGN1ZadWlwWmpZZnhEeU1USW1NY1d2MGZYZVMyVDRjVVZSdGtrMWJoQ1FNWEoyQlpRbVNBUmM1V2R5dG5TWUhJZHNwNHg3TzM0MExwQzh4NlhtZlpJY2lpZS9IZktpM0xDYkNFUHlWUTJYU2ZJdVZXNGk3T0c2T0xpWDVlTkl3YXVVZjAyd3JTWGpHVGJrMHRNYU5DcHQ4NGhBVVphQnBHR3dCclVDWGFjcURrUWhMWnd2WjZtZEhqcjNOSkhHd0RDNWt3UGdDWlVRZXRQUkVNVnNqNldlNWtMZ3A0VDdubUZ6SklSeStiSjkxMFEveVh3PSFINFJjeWd2djlCQ2Q1c3NocEptVU5RPT0"
            },
            "scope": {
                "token": null,
                "type": "BearerToken"
            }
        }
    }
}

この場合、ビデオスキルのカタログはhawaii_usという名前です。entities配列の最初の項目には、このメディアへの参照が含まれています。

Lambda関数で処理できるディレクティブの種類は、以下のとおりです。

ディレクティブ 説明
RemoteVideoPlayer - SearchAndPlay ユーザーが特定ビデオコンテンツの再生をAlexaにリクエストした際に送信されます。
RemoteVideoPlayer - SearchAndDisplayResults ユーザーがビデオコンテンツの検索をAlexaにリクエストした際に送信されます。
PlaybackController ユーザーがビデオコンテンツの再生、停止、ナビゲーションをリクエストした際に送信されます。
SeekController ユーザーが時間を指定して早送り(またはスキップ)や早戻しをリクエストした際に送信されます。
ChannelController ユーザーがチャンネルの変更をリクエストした際に送信されます。
KeypadController ユーザーが左右へのスクロール、ページの上下スクロール、フォーカスされているアイテムの選択をリクエストした際に送信されます。

Lambda関数とアプリで、Discoverディレクティブへの応答でサポートする一連の機能を宣言します。また、Alexa Client Libraryを統合した場合のアプリの機能も宣言します。

宣言した機能によって、AlexaからLambda関数に送信されるディレクティブが決まります。たとえば、ChannelControllerの機能を宣言していない場合、AlexaはChannelControllerディレクティブをLambda関数に送信しません。

Lambdaがディレクティブを処理する

Lambdaは、コードをホストするサーバーを必要とせずに、クラウド上でコードを実行できるAWSのサービスです(サーバーレスコンピューティング)。Lambda関数は、ビデオスキルAPI経由で渡されるディレクティブを処理し、簡単なステータスメッセージで応答します。

Lambda関数はさまざまなプログラミング言語に対応していますが、このテクニカルドキュメントで扱うLambdaサンプルコードではNode.jsを使用しています。Lambda関数におけるロジックのプログラミングは、開発者側で行ってください。つまり、Lambda関数にディレクティブを渡す役割はAmazon側が担いますが、必要なアクションをアプリに組み込むのは開発者側ということです。

Lambdaに送信されるディレクティブを処理する方法は複数あります。ディレクティブは、主に次の2つの方法で処理できます。

  • Lambda関数をコーディングして、Lambda関数内でディレクティブを完全に処理する。必要な情報を取得するために、Lambda関数がバックエンドのデータベースやその他サービスに対してクエリを実行する場合があります。Lambdaは、必要なアクションを実行するか、適切な情報を取得してから、アプリに命令を送信します。
  • Lambda関数からディレクティブを直接アプリに渡し、アプリ側でディレクティブの処理を行う。たとえば、アプリ側でクエリやその他サービスを実行して検索を行い、必要な情報を取得してから次のアクションに移ることが可能です。

LambdaがADMを介してアプリに命令を送信する

Lambda関数はAlexaから受信したディレクティブを処理した後、Amazon Device Messaging(ADM)経由のプッシュ通知を通じてFire TV対応アプリに命令を送信します。また、Fire TV対応アプリに組み込まれたAlexa Client Libraryがアクティブなアプリの情報をAlexaに知らせ、Alexaがそのアプリを優先できるようにします。Alexa Client Libraryは音声対応をサポートするJavaライブラリで、スキルを自動的に有効化させる際にAlexaでアプリを認証するのに役立ちます。

Alexaは、Lambda関数に送信されるディレクティブにADM登録IDが含まれていることを確認してくれます。異なるプッシュ通知アーキテクチャとクラウドサービスを使用する場合は、ADMに代わるものを参照してください。

ADMからの受信メッセージに応じてアプリが動作する

命令を受け取ったアプリは、ユーザーのリクエストに応じたアクションを実行します。例として、「映画のタイトルを表示する」アクションが考えられます。繰り返しますが、ディレクティブはLambda関数で直接処理することも、アプリで処理することも可能です。

開発の推定所要時間

Fire TV対応アプリにVSKを完全統合するには、数週間から数か月かかることがあります。コンテンツのカタログ統合が既に完了している場合、VSKの実装に必要な開発作業の大部分を占めるのは、Lambda関数が受信したディレクティブを処理するためのロジック作成です。

Fire TV対応アプリにVSKを組み込むプロセスは、一連の手順から成ります。このプロセスを開始するには、統合の手順を参照してください。

最初に、VSKが既に統合されたサンプルアプリサンプルLambda関数を使用して統合を行います。この統合作業には半日程度かかります(所要時間はAndroid、AWS、Amazon開発者コンソールの理解度に左右されます)。このシンプルな統合を通じて、AlexaからクラウドのLambda関数に送信されるディレクティブを確認できるので、実装範囲の理解が深まるはずです。

サンプルアプリでの統合が完了したら、実際のアプリでも同じ統合手順を実行する必要があります。

統合の流れ

統合プロセスの最初の部分では、VSKの実装をテストする簡単な方法として、ビデオスキル、Fire TV対応サンプルアプリ、基本的なLambda関数を設定します。これにより、実際にビデオスキルとAlexaがユーザーリクエストにどのように応答するかを確認できます。ここでは、Fire TV対応アプリとやり取りしてビデオを見つけ、再生する機能を想定しています。これらのプロセスを通して、Alexa搭載デバイスやアプリで以下のやり取りができるようになります。アプリの起動後に、以下のようなやり取りがサポートされます。ビデオスキルの名前は「Streamz」とします。

ユーザー: アレクサ、『ビッグバックバニー』を見せて

Alexa: Streamzから『ビッグバックバニー』を取得しています

ユーザー: アレクサ、『ビッグバックバニー』を探して

Alexa: Streamzから『ビッグバックバニー』を取得しています

ユーザー: アレクサ、再生して

ユーザー: アレクサ、一時停止して

対話終了

サンプルアプリは、カタログにいくつかのビデオタイトルがあるだけで、チャンネル変更やより高度なディレクティブはサポートしていません。統合プロセスの後半の手順では、アプリがサポートするディレクティブを処理するようにLambda関数をカスタマイズします。

統合の手順

Fire TV対応アプリにビデオスキルAPIを統合する手順は、以下のように分けられます。

Fire TV対応サンプルアプリを使用して、統合を実際に確認できます。このアプリには、Alexa Client LibraryやADMを制御する機能が組み込まれているほか、メッセージを解析して一致するカタログタイトルを再生するためのロジックも含まれています。実装手順でこのサンプルアプリを使用する必要はありません。独自のアプリを使用して同じ手順を実行できます。手順では、それぞれの方法(サンプルアプリを使用する場合と実際のアプリを使用する場合)に対応したオプションを示します。

前提条件 カタログ統合

VSKをアプリに組み込む前に、カタログ統合を完了しておく必要があります。カタログをFire TVに統合するには、以下を参照してください。

  • カタログ統合。カタログ統合とは、XMLスキーマで記述されたAmazonのカタログデータフォーマット(CDF)に従ってアプリのメディアを記述し、S3バケットに定期的にカタログをアップロードするプロセスのことです。カタログ統合は、長編映画またはTV番組シリーズ(IMDbに登録されているものなど)を使用するアプリに限定されています。詳細については、カタログ統合についてを参照してください。
  • ユニバーサル検索・閲覧機能の統合。アプリにFire TVのユニバーサル検索・閲覧機能を統合する必要があります。この(Fire TVランチャーとの)統合により、ユーザーがそのアプリをインストールしているかどうかに関係なく、カタログファイル内のメディアのメタデータをAmazonのランチャーおよびグローバル検索結果に表示することができます。アプリに含まれているコンテンツをユーザーが検索すると、Fire TVの検索結果にそのコンテンツが表示されます。カタログ統合の両方のステップを完了してから、この先のVSKの実装に進んでください。

次のステップ

統合プロセスの最初の手順として、手順1: ビデオスキルを作成してデバイスをセットアップするに進みます。