Amazon Web Services ブログ
Amazon Rekognition, AWS Elemental MediaConvert, AWS Elemental MediaTailorでビデオコンテンツに広告挿入する方法
メディアの収益化やストリーミングの準備に伴う他社との差別化につながらない作業量にお困りとの声をお客様からよく聞きます。従来の広告挿入プロセスでは反復的でエラーが発生しやすく多くの時間がかかります。また広告コンテンツによって視聴者の注意が妨げられないように、視聴の邪魔にならないよう広告が挿入されます。クラウドベースのマネタイズワークフローを使えば、手動で1つ1つコンテンツを確認しなくても、広告挿入に適した場所を簡単に特定することができます。
例えば、シーンや文章の途中、あるいはエンドクレジットの途中に広告が入ることは避けたいものです。一方で、シーンとシーンの間、誰もしゃべっていない時、画面が長時間黒になった時、十分な文脈の変化があった時には、広告を挿入しても視聴を妨げにくいと考えられます。
前回の記事ではAWSのサービスを利用して黒フレームを自動的に検出し、AWS Elemental MediaTailorで、動画コンテンツに広告枠を挿入しコンテンツをストリーミングする方法を紹介しました。今回の記事では、そのソリューションを拡張し、AWS Elemental MediaConvertとAmazon Rekognitionを使って最適な広告挿入場所を検出する機能を追加しました。
本ソリューションはAWSの機械学習ソリューションとメディアサービスを使ってビデオ、オーディオ、画像を分析するAWSソリューションであるMedia Insights Engine(MIE)の上に構築されています。MIEでは、MediaConvertを使ってメディアコンテンツをエンコードし、Rekognitionを使ってコンピュータビジョンアルゴリズムを適用し、独自のカスタム演算子で追加処理を行うワークフローを定義することができます。最新バージョン(0.1.8)では、ビデオセグメント検出機能が搭載されており、ビデオのブラックフレーム、ショットチェンジ、エンドクレジット、SMPTE(Society of Motion Picture and Television Engineers)カラーバーなどをフレーム精度で検出することができます。
このチュートリアルでは以下を検出する方法を学びます。
- ブラックフレーム (無音のシーン)
- 無音
- ショットチェンジ
- エンドクレジット
前提条件
このブログ記事を最大限に活用するためにまず以下をご確認ください。
- お客様のAWSアカウント
- このソリューションをインストールするためのServerless Application Model (SAM): CLI on Githubからツールをダウンロードし、こちらのドキュメントを参照し、インストールしてください。
- AWS CloudFormationとPythonの知識がソリューションを展開するために推奨されますが必須ではありません。
- AWS Media Insights Engineの利用経験があることが推奨されますが必須ではありません。
またソリューションをデプロイいただく前にこの記事全体で使用されている技術や規格に目を通していただくことをお勧めします。
- 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ファイルをクライアントサイドの広告挿入に使用することもできます。
ソリューションアーキテクチャ
プロセス
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のオペレータについて詳しく説明します。
Video Transcoding オペレータ
Video Transcoding オペレータ は、MediaConvert で以下の 4 つの処理を実行する MIE のカスタム オペレータです。
- アップロードされたコンテンツをMediaTailorで広告を挿入できるように、1秒の長さのセグメントを持つHLSプレイリストに変換します。
- アップロードされたコンテンツをAmazon Rekognition での利用に適したフォーマットに変換します(低解像度の MPEG-4)。
- オーディオトラックをMPEGとして抽出しラウドネス測定値をCSVファイルとして出力します。MPEGトラックはAmazon Transcribeを使って字幕を生成し、さらにAmazon Comprehendで意味解析を行うことができます。ラウドネストラックは無音の検出に使用されます。
- このオペレータの出力は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 CLIコマンド
Lambda関数のコードがビルドされたら、以下のコマンドを実行してスタックをデプロイします。ガイドの手順でパラメータ値の入力を求められます。
アプリケーションをデプロイするための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コンソールを確認して、ワークフローの実行状況を監視します。
Input セクションを拡大して、 AssetID
を取得する。
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経由で消費することができます。
MediaTailor HLS playback URLフォーマット
例えば以下のURLを使ってHLSプレーヤーでテストすることができます。
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安司が担当しました。原文はこちらをご覧ください。