Amazon Web Services ブログ

Amazon Rekognition, AWS Elemental MediaConvert, AWS Elemental MediaTailorでビデオコンテンツに広告挿入する方法

メディアの収益化やストリーミングの準備に伴う他社との差別化につながらない作業量にお困りとの声をお客様からよく聞きます。従来の広告挿入プロセスでは反復的でエラーが発生しやすく多くの時間がかかります。また広告コンテンツによって視聴者の注意が妨げられないように、視聴の邪魔にならないよう広告が挿入されます。クラウドベースのマネタイズワークフローを使えば、手動で1つ1つコンテンツを確認しなくても、広告挿入に適した場所を簡単に特定することができます。
例えば、シーンや文章の途中、あるいはエンドクレジットの途中に広告が入ることは避けたいものです。一方で、シーンとシーンの間、誰もしゃべっていない時、画面が長時間黒になった時、十分な文脈の変化があった時には、広告を挿入しても視聴を妨げにくいと考えられます。

前回の記事ではAWSのサービスを利用して黒フレームを自動的に検出し、AWS Elemental MediaTailorで、動画コンテンツに広告枠を挿入しコンテンツをストリーミングする方法を紹介しました。今回の記事では、そのソリューションを拡張し、AWS Elemental MediaConvertAmazon Rekognitionを使って最適な広告挿入場所を検出する機能を追加しました。

 

in this picture is shown the result of the ingestion of a media file via the solution presented in this article. When the solution detects a fade to black, it properly inserts a related ad.

本ソリューションにメディアファイルをインプットした結果(途中にFormula 5のCMが挿入される)

本ソリューションはAWSの機械学習ソリューションとメディアサービスを使ってビデオ、オーディオ、画像を分析するAWSソリューションであるMedia Insights Engine(MIE)の上に構築されています。MIEでは、MediaConvertを使ってメディアコンテンツをエンコードし、Rekognitionを使ってコンピュータビジョンアルゴリズムを適用し、独自のカスタム演算子で追加処理を行うワークフローを定義することができます。最新バージョン(0.1.8)では、ビデオセグメント検出機能が搭載されており、ビデオのブラックフレーム、ショットチェンジ、エンドクレジット、SMPTE(Society of Motion Picture and Television Engineers)カラーバーなどをフレーム精度で検出することができます。

このチュートリアルでは以下を検出する方法を学びます。

  • ブラックフレーム (無音のシーン)
  • 無音
  • ショットチェンジ
  • エンドクレジット

前提条件

このブログ記事を最大限に活用するためにまず以下をご確認ください。

またソリューションをデプロイいただく前にこの記事全体で使用されている技術や規格に目を通していただくことをお勧めします。

  • AWS Elemental MediaConvertは放送品質を満たす機能を備えたファイルベースのビデオトランスコーディングサービスです。
  • HLSは、HTTPアダプティブ・ビットレート・ストリーミング通信プロトコルです。
  • AWS Elemental MediaTailor はコンテンツのパーソナライゼーションとマネタイズのためのサービスです。
  • Video Multiple Ad Playlist(VMAP)は、コンテンツ所有者が広告枠の構造を指定するために使用できるXMLテンプレートです。VMAPは1つのストリームにいつ、いくつの広告を表示するかを決定します。MediaTailorはVMAPファイルを使用してコンテンツに広告を挿入します。広告在庫に含まれる広告は、VAST(Video Ad Serving Template)仕様に基づき記述することができます。
  • Amazon Rekognition Segment Detection APIはカラーバーやエンドクレジットなど、動画の有用なセグメントを簡単に識別します。

ソリューション概要

前回の記事では、カスタムFargate ECSタスク上に展開されたサードパーティのオープンソースソフトウェアFFmpegをベースにしたソリューションを構築しました。ショットやテクニカルキューの検出には、マネージドなサーバーレス機能であるRekognition Segment APIを活用可能になりました。このAPIを利用することで、大量の映像を簡単に分析し、ブラックフレームやショットチェンジなどのマーカーを検出することができます。このAPIは各検出に対してSMPTEのタイムコードとタイムスタンプを返します。

この分析結果をもとに、本ソリューションでは広告を挿入するための最適な位置を推定します。このソリューションの出力は広告が表示されたストリームのHLSプレイリストのURLです。サーバーサイドの広告挿入はMediaTailorを介して行われます。またこのソリューションで生成されたVMAPファイルをクライアントサイドの広告挿入に使用することもできます。

ソリューションアーキテクチャ

Architecture Diagram. This solution makes use of custom MIE operators to convert the video to an HLS playlist, find the top 3 slots for ads insertion and for generating a VMAP file. The HLS playlist and the VMAP file are made available via CloudFront and stored on S3.

カスタムMIEオペレータを使用して、動画をHLSプレイリストに変換し、広告を挿入する上位3スロットを見つけ、VMAPファイルを生成します。HLSプレイリストとVMAPファイルはCloudFront経由で提供され、S3に保存されます。

プロセス

Amazon S3の入力バケットに動画ファイルがアップロードされると、AWS Lambdaファンクションが起動し、AWS Step Functionsのワークフローが始まります。

  • 最初のステージでは、カスタムビルドされたMIEオペレータを使用して、元の動画ファイルのHLSフォーマット(.m3u8マニフェストファイルと.tsビデオセグメント)への変換と、動画のオーディオトラックからのラウドネス情報の抽出を開始および監視します。この操作はMediaConvertのジョブによって行われます。
  • ステージ2では、6つのMIEオペレータが並行して実行され、Rekognitionを用いてアップロードされたファイルから意味的・技術的情報を抽出します。特に、テクニカルキュー検出オペレーターとショット検出オペレーターは、Rekognition Segment APIを利用しています。
  • ステージ3では、カスタムMIEオペレーターが前段階の出力を収集し、広告挿入の候補となるスロットを検出します。各スロットに対して、タイムスタンプと適正スコアが計算されます。
  • 最後のステージでは、別のカスタムMIEオペレータが上位3つの候補スロットを選択し、広告が挿入されたVMAPファイルを作成して、Amazon S3のDataplane Bucketに保存します。これがMediaTailorがコンテンツと広告の両方を含むHLSマニフェストを生成するために使用するファイルです。

アップロードされたコンテンツから生成されたHLSマニフェストは、Amazon CloudFront経由でストリーミング配信され、MediaTailorによって広告が表示されます。また、VMAPファイルはS3にホストされ、CloudFront経由でクライアントサイドの広告挿入に利用できます。

MIEワークフロー

このセクションでは、「MIE Step Functions ワークフロー」を構成するMIEのオペレータについて詳しく説明します。

AWS Step Function MIE Workflow

AWS Step Function MIE ワークフロー

Video Transcoding オペレータ

Video Transcoding オペレータ は、MediaConvert で以下の 4 つの処理を実行する MIE のカスタム オペレータです。

  1. アップロードされたコンテンツをMediaTailorで広告を挿入できるように、1秒の長さのセグメントを持つHLSプレイリストに変換します。
  2. アップロードされたコンテンツをAmazon Rekognition での利用に適したフォーマットに変換します(低解像度の MPEG-4)。
  3. オーディオトラックをMPEGとして抽出しラウドネス測定値をCSVファイルとして出力します。MPEGトラックはAmazon Transcribeを使って字幕を生成し、さらにAmazon Comprehendで意味解析を行うことができます。ラウドネストラックは無音の検出に使用されます。
  4. このオペレータの出力はMIEデータプレーンに保存され、次のオペレータが行う分析に利用されます。

ラベル、セレブリティ、顔検出、コンテンツ・モデレーション・オペレータ

これらのオペレータはMIEに含まれ、Amazon Rekognition APIを使用して提供されたコンテンツのセマンティクスを処理します。

  • ラベル検出オペレータは、オブジェクト、イベント、コンセプト、アクティビティを検出しラベルとして提供します。
  • 顔検出オペレータはビデオのどこで顔が検出されたか、目の位置などの顔のランドマーク、「幸せ」や「悲しみ」などの検出された感情に関する情報を返します。
  • 有名人オペレータは映像中に登場する有名人の追跡情報を取得します。
  • コンテンツ・モデレーション・オペレータは、画像や保存されているビデオにアダルトや暴力的な内容が含まれていないかを分析します。

これらのオペレータによって抽出された意味情報はどの広告をストリームに挿入するかAds Decision Server(ADS)に知らせるために使用することができます。このソリューションではS3をADSとして使用し静的なVMAPレスポンスをホストします。本ソリューションで検出、ラベル付けした情報を元にしたダイナミックなADSとレポーティングサービスを構築する方法については次のブログ記事で詳しくご紹介します。

ショット検出とテクニカルキューのオペレータ

これら2つのオペレータは技術的な観点からコンテンツを分析します。どちらもRekognitionのセグメント検出機能を使い、2つの検出オプションを提供しています。

  • TECHNICAL_CUES:無音のブラックフレームやエンドクレジットを検出する。
  • SHOTS:ショットチェンジを検出する。

サウンドトラックやボイスオーバーのあるブラックフレームはRekognitionではコンテンツとみなされ、TECHNICAL CUESオプションでは検出されません。しかしSHOTSオプションではショットチェンジとみなされます。本ソリューションではこれらのオペレーターが返した結果をもとに広告の挿入に最適な位置を選択します。

スロット検出オペレータ

スロット検出オペレータは、前ステージでの結果をもとにスロット候補を検出します。「ショット検出」と「テクニカルキュー検出」の結果はスロット候補としてすぐに使用できますが、無音区間の検出にはさらなるステップが必要です。

無音区間検出は以下の構成の MediaConvert ジョブで抽出されたラウドネストラックに対して実行されます。

  • ノーマライズアルゴリズム: ITU-R BS.1770-2: EBU R-128
  • アルゴリズム制御:Measure only
  • ラウドネスロギング:Log
  • ラウドネス閾値: -50dB

無音検出処理では、音声信号のラウドネスがカスタマイズ可能な閾値よりも低いことを確認します。今回この閾値を -50dB に設定しました。MediaConvert のジョブによる無音検出については、こちらの ブログ記事で詳しく説明しています。 このようにして検出された無音区間は広告挿入の候補スロットとなります。

各候補スロットにはタイムスタンプの前後2秒間のメタデータが、「ラベル」「有名人」「顔検出」「コンテンツ調整」オペレータの結果から取得されています。

候補となるスロットのリストが用意され、セマンティックなメタデータが追加されたところで、アルゴリズムを使って各スロットに信頼度スコアを割り当てます。そして最も高いスコアを持つ3つのスロットのみが広告挿入の対象となります。

適合性スコアの算出に使用している基準は以下の通りです。

  • スロットの種類に応じて、基本となる信頼スコアを決定します。今回の実装では、以下のベーススコアを使用しています。
    SCORE_ADJUSTMENTS = {
        "Silence": 0.7,
        "BlackFrame": 0.8,
        "ShotChange": 0.7,
        "EndCredits": 1.0
    }
  • 候補スロットが次の有効スロットから 0.5秒以内の場合、2つのスロットを統合し、信頼スコアを高くします。
  • 次の有効スロットから 0.5秒以上、30秒以内の場合、信頼スコアを低くします。
  • スロットがビデオの先頭から25%の位置にある場合、信頼スコアを低くします。
  • 各スロットの前後にあるLabelメタデータのセット間の intersection over union(IoU)を、そのスロットに関連するコンテキストの変化のおおよその指標として計算します。コンテキストの変化が大きければ大きいほど、そのスロットがシーンの変化を表している可能性が高くなるので、それに応じて信頼スコアも高くなります。
# Score adjustment: labels before and after
slot["Context"] = __get_context_metadata(slot["Timestamp"], asset_metadata)
pre_labels = set(label["Name"] for label in slot["Context"]["Labels"]["Before"])
post_labels = set(label["Name"] for label in slot["Context"]["Labels"]["After"])
if pre_labels or post_labels:
    distance = 1.0 - (len(pre_labels.intersection(post_labels)) / len(pre_labels.union(post_labels)))
    slot["Score"] = __disjunction(slot["Score"], math.pow(distance, 4.0))

slot_detection/score.py 59~65行目.

VMAP生成

アップロードされたコンテンツから意味的および技術的な情報が抽出され、上位3つのスロットが計算され、HLSプレイリストのストリーミングが可能になると、このソリューションで導入れているもう1つのカスタムMIEオペレータであるVMAP生成オペレータで広告マニフェストファイルを構築することができます。

このオペレーターを使用して生成されたVMAPファイルはMediaTailorがサーバーサイドの広告挿入を行うために使用されますが、クライアントサイドで使用することもできます。

このオペレータでは広告挿入スロットとAd Server Bucketに含まれる広告との間のコンテキストの類似性を計算することにより、処理されたコンテンツによりよくマッチする広告の選択も可能です。スロット検出時にコンテキストの変化を測定するために使用されるものと同様のアプローチを採用しています。

このオペレータで使用される広告とそのコンテキストラベルは、AWS Elementalが提供するモックのAd Serverバケットに含まれる広告を参照するJSONファイルで設定されています。

次のコードでは広告の選択を行います。

def __select_ad(labels):
    print('labels: {}'.format(labels))
    # Searching ads to find the one with most similar labels
    top_similarity = -1.0
    top_ad = None
    slot_labels = set(labels)
    random.shuffle(ads) # Shuffle to return a random ad in case none has similarity
    for ad in ads:
        print('ad: {}'.format(ad))
        ad_labels = set(ad['labels'])
        similarity = len(slot_labels.intersection(ad_labels)) / len(slot_labels.union(ad_labels))
        if similarity > top_similarity:
            top_similarity = similarity
            top_ad = ad
    print('top_ad: {}'.format(top_ad))
    print('top_similarity: {}'.format(top_similarity))
    # Return URL to selected ad video file
    return top_ad['url']

vmap_generation/app.py 143~160行目.

ソリューションをデプロイする

このソリューションは2つのフェーズで展開します。最初のフェーズでは、Media Insight Engine(MIE)をAWSアカウントにデプロイします。MIEをAWSアカウントにインストールするには、このガイドに従ってください。MIEをすでにアカウントにインストールしている場合(バージョン0.1.8以降)は次のステップに進んでください。

次のフェーズでは、カスタムスタックをMIEと一緒にデプロイします。このリポジトリをクローンします。このリポジトリには、カスタムLambda関数、カスタムMIEオペレータ、プライベートMIEデータプレーンアセットを提供するためのCloudFrontディストリビューション、およびMediaTailorキャンペーン構成を含むスタックをデプロイするSAMテンプレートが含まれています。

スタックパラメータ

カスタムスタックテンプレートには、MIEから次のパラメータ値が必要です。これらの値を取得するには、AWS CloudFormationコンソールでMIEスタックを確認する必要があります。

MediaInsightsEnginePython38Layer: スロット検出に使用されるMIE Lambda LayerのARNです。前フェーズでデプロイしたMIEメインのCloudFormationスタックのアウトプットの中にあります。

WorkflowCustomResourceArn: MIEカスタムリソースのARNです。前のフェーズでデプロイされたMIE main CloudFormationスタックのアウトプットの中で見つけることができます。

WorkflowEndpoint: MIEワークフローAPIを処理するLambda関数の名前です。MIE Workflow API CloudFormation nested stackのアウトプットのうち、APIHandlerNameとして見つけることができます。

DataplaneEndpoint: MIE Dataplane APIを処理するLambda関数の名前です。MIE Dataplane API CloudFormationのネストされたスタックのアウトプットの中で、APIHandlerNameとして見つけることができます。

DataplaneBucket:  HLSプレイリスト、セグメント、およびVMAPファイルを格納するバケットです。MIE Dataplane CloudFormationのネストされたスタックの出力の中にあります。

ビルドとデプロイ

リポジトリのクローンを作成したら、ターミナルで以下のコマンドを実行します。MediaInsightsEnginePython38Layerパラメータの値を使用します。

sam build --parameter-overrides 'ParameterKey=MediaInsightsEnginePython38Layer,ParameterValue=[Layer ARN obtained from MIE stack]'

アプリケーションをビルドするためのSAM CLIコマンド

Lambda関数のコードがビルドされたら、以下のコマンドを実行してスタックをデプロイします。ガイドの手順でパラメータ値の入力を求められます。

sam deploy --guided

アプリケーションをデプロイするためのSAM CLIコマンド

スタックアウトプット

スタックがデプロイされたら、コマンドの出力を見てその値をメモしておいてください。後でソリューションによって生成されたアセットにアクセスするために必要になります。

InputBucket: ビデオがアップロードされるInput Bucket

CloudFrontHLSPlaybackPrefix: CloudFront経由でMediaTailorの設定にアクセスし、広告が挿入されたHLSストリームにアクセスするためのURLプレフィックス

CloudFrontDomainName: Raw HLSストリームとクライアントサイドの広告挿入用に生成されたVMAPファイルにアクセスするために使用できるCloudFrontのドメイン名URL

ソリューションを実行する

ワークフローを開始するには、次のコマンドまたはコンソールを使ってビデオファイルをInput Bucketにアップロードします。

aws s3 cp [your video file].mp4 s3://[InputBucket output from CloudFormation]

ビデオファイルをInput bucketにアップロードするためのAWS CLIコマンド

ワークフローが自動的に開始されます。Step Functionsコンソールを確認して、ワークフローの実行状況を監視します。

The picture shows the AWS Step Function console and where to fetch relevant information on the workflow

AWS Step Function コンソール

Input セクションを拡大して、 AssetIDを取得する。

AWS Step Function console – detail of Input

AWS Step Function コンソール – 詳細

AssetIDがあればMediaTailor経由でHLSプレイリスト、VMAPファイル、広告付きストリームにアクセスできるようになります。

広告挿入Playback

サーバーサイド広告挿入

このソリューションではCloudFormationのカスタムリソースを介して、デプロイ時にMediaTailor構成を作成します。

MediaTailorConfig:
   Type: Custom::MediaTailorConfig
   Properties:
     ServiceToken: !GetAtt MediaTailorConfigFunction.Arn
     ConfigurationName: !Sub "${AWS::StackName}-config"
     VideoContentSource: !Sub "https://${DataplaneBucket}.s3.amazonaws.com/private"
     AdDecisionServer: !Sub "https://${DataplaneBucket}.s3.amazonaws.com/private/assets/[player_params.asset_id]/vmap/ad_breaks.vmap"

template.yml  404 – 410行目

カスタムリソースはbotoを利用してMediaTailor Configurationの作成、更新、削除を行うLambda Functionの呼び出しをラップしています。

res = mediatailor.put_playback_configuration(
   Name=config_name,
   VideoContentSourceUrl=content_url,
   AdDecisionServerUrl=ads_url,
   SlateAdUrl=slate_ad,
   CdnConfiguration={
     'AdSegmentUrlPrefix': cdn_ad_prefix,
     'ContentSegmentUrlPrefix': cdn_content_prefix
   }
)

mediatailor/app.py 29 – 38行目

put_playback_configurationメソッドに渡されたパラメータは、MediaTailorConfig CloudFormationカスタムリソースのプロパティにマッピングされます。

MediaTailorが作成したHLSプレイリストは、以下URL形式でCloudFront経由で消費することができます。

https://[CloudFrontHLSPlaybackPrefix output from CloudFormation]/assets/[AssetId]/hls/playlist.m3u8?ads.asset_id=[AssetId]

MediaTailor HLS playback URLフォーマット

例えば以下のURLを使ってHLSプレーヤーでテストすることができます。

https://d2fqj2af1au1sa.cloudfront.net/v1/master/0f538d087a34d2bd0bf6a1719aba5839e3e7e274/smart-ad-breaks-config/assets/6f3c7dee-c030-4417-94db-445167834247/hls/playlist.m3u8?ads.asset_id=6f3c7dee-c030-4417-94db-445167834247

Rekognitionはショットとキューの検出のためにフレームに正確な位置を提供しますが、MediaTailorはHLSストリームチャンク間にのみ広告ブレークを挿入します。ストリーム内の広告の実際の位置は同じ精度ではないかもしれません。この問題に対処するにはより小さい HLS セグメントを生成するように MediaConvert プロファイルを調整するか、Rekognition セグメント分析の結果を使用して、メインのビデオファイルを複数の HLS プレイリストに分割します。

クライアントサイド広告挿入

クライアント側の広告挿入の場合、CloudFrontを介してVMAP互換プレーヤーで各動画にたいして本ソリューションが生成したVMAPファイルを利用できます。

ワークフローで生成されたVMAPファイルのURLを、このURL形式で取得します:

https://[CloudFrontDomainName Output from CloudFormation]/assets/[AssetId]/vmap/ad_breaks.vmap

VMAP ファイル URL フォーマット

例えば、以下のVMAPファイルを使って、クライアントサイドの広告挿入をテストすることができます:
https://d2fqj2af1au1sa.cloudfront.net/assets/6f3c7dee-c030-4417-94db-445167834247/vmap/ad_breaks.vmap

このURL形式で生のHLSプレイリストのURLを取得します:

https://[CloudFrontDomainName Output from CloudFormation]/assets/[AssetId]/hls/playlist.m3u8

HLS playlist URL フォーマット

例えば、以下のHLSプレイリストを使ってクライアントサイドの広告挿入をテストすることができます:
https://d2fqj2af1au1sa.cloudfront.net/assets/6f3c7dee-c030-4417-94db-445167834247/hls/playlist.m3u8

まとめ

このブログ記事ではAmazon Rekognition Segment APIを使って広告挿入枠を自動的に見つける方法を紹介しました。AWSのクラウドサービスを利用して、メディアコンテンツを取り込み、分析し、広告を表示し、ストリーミングで利用できるようにするソリューションが構築可能です。AWS上でビデオワークフローを効率的にマネタイズする方法についてマネタイズする方法について今後ブログ記事をお届けします。


参考リンク

AWS Media Services
AWS Media & Entertainment Blog (日本語)
AWS Media & Entertainment Blog (英語)

AWSのメディアチームの問い合わせ先: awsmedia@amazon.co.jp
※ 毎月のメルマガをはじめました。最新のニュースやイベント情報を発信していきます。購読希望は上記宛先にご連絡ください。

翻訳は BD山口とSA安司が担当しました。原文はこちらをご覧ください。