Amazon Web Services ブログ

小売業界での Amazon Interactive Video Service と Amazon Personalize 活用のハウツーガイド

ライブストリーミングの人気はますます高まっており、オンラインでのお客様とのやり取りの新たな機会を拡げています。魅力的なコンテンツを提供するライブストリーミングにより、お客様のオンラインショッピングへの流れを促進し、購買体験をオンラインエンゲージメントの1つに加えることができます。また、オンラインストアが提供するパーソナライズされたレコメンデーションによって適切な商品を適切なタイミングでおすすめすることで、お客様のエンゲージメントとコンバージョンを最大化することができます。

このブログでは、ライブストリーミングとパーソナライゼーションを構成して e コマースサイトに展開する方法の詳細をご紹介します。

まず最初に、私達が開発したオープンソースプラットフォームである AWS リテール e コマースのデモ環境を使って、拡張性の高いクラウドサービスによって顧客体験を大きく変えられることをお見せします。

Amazon Interactive Video Service (Amazon IVS) は、すばやく簡単にセットアップできるマネージドライブストリーミングソリューションであり、インタラクティブなビデオ体験を構築するのに最適です。Amazon IVS にビデオをストリーミングすることで、世界中のあらゆるユーザーが低遅延のライブビデオを視聴できるようになります。このサービスは Amazon IVS Player SDK を使って簡単にカスタマイズできます。また Timed Metadata API を使用すると、同じビデオフィードを使用してユーザーにストリーミングでメタデータを配信できます。さらに、Amazon Personalize によりカスタマイズされた商品のおすすめをお客様に提供できます。

Amazon Personalize はフルマネージドのレコメンデーションサービスで、AWS Amplify や Amazon Pinpoint 等の他の AWS サービスと組み合わせて使用でき、幅広いユースケースで多くのお客様に対してパーソナライズされた体験を提供することができます。Amazon Personalize は、顧客や商品のメタデータや、顧客と商品のインタラクションの履歴データから、機械学習を使用してインタラクションのパターンを探し出し、ポジティブな反応を得られる可能性のある商品をユーザーにレコメンドします。また、関連商品をレコメンドし、検索結果にパーソナライズされた再ランキングの結果を表示することもできます。新しいインタラクションの情報を Runtime インターフェイスを利用して取り込むことで、Amazon Personalize はデータのトレンドや個人の行動の変化にリアルタイムに対応できます。

はじめに: AWS リテールデモストア

AWS リテールデモストアは、サンプルとして提供されるオープンソースの小売 Web アプリケーションであり、ワークショップのプラットフォームとして利用いただけます。AWS のインフラストラクチャとサービスを使用した学習用ツールとして提供されており、e コマース、小売、デジタルマーケティングなどのユースケースにおける、魅力的な顧客体験を構築する方法を示しています。

AWS のインフラストラクチャとサービスを使用して、魅力的な顧客体験の構築方法を体験できる AWS リテールデモストア

AWS リテールデモストアの中心となるのは、RESTful Web サービスとしてデプロイされるマイクロサービスをベースとしたアーキテクチャで Amazon Elastic Container Service (Amazon ECS) で実行されます。ビルド、デプロイ、認証、メッセージング、検索、およびパーソナライズ機能を提供するため、複数の AWS マネージドサービスが活用されています。Web ユーザーインターフェイス (UI) はレスポンシブ Web デザインのフレームワークと技術を使用して構築されたシングルページアプリケーションで、ユーザーのデバイスに合わせてネイティブアプリのような体験を提供します。

このアーキテクチャは AWS CloudFormation のカスタムリソースを使用して Amazon IVS チャネルをデプロイし、UI を更新し、Amazon ECS に新しい”ビデオ”サービスを追加してビデオをストリーミングし、Flask API 経由でストリームの詳細を UI に公開します。AWS CloudFormation の Amazon IVS リソースタイプも使用できます。

以下の図では、AWS リテールデモストアに追加された IVS を示しています。

Amazon IVS を追加した AWS リテールデモストアのリファレンスアーキテクチャ

新しい UI ビューには、ビデオブログ (vlog) 形式でビデオの Amazon IVS ビデオストリームが表示され、ビデオブログのプレゼンターが商品を紹介します。商品の詳細情報は Amazon IVS ストリームにメタデータとして埋め込まれており、Amazon Personalize でレコメンドされた関連商品と一緒に、紹介されている商品の詳細情報が適切なタイミングで表示されます。

AWS リテールデモストアのライブストリーミングページに表示されるビデオブロガー

次のセクションでは、既存の e コマースプラットフォームにこの機能を追加し統合する手順について説明します。

Amazon IVS と AWS CloudFormation

Amazon IVS でビデオをブロードキャストする最初のステップは、チャネルを作成することです。各チャネルは一時点で 1 つのビデオストリームをブロードキャストするのに十分な容量を持ち、.m3u8 ファイルにラップされた一連のストリームを出力します。このファイルは Amazon IVS Player で利用できます。Amazon IVS リソースは、コンソール、CLI、または標準の AWS SDK を使用して作成されます。既存の e コマースバックエンドの Infrastructure as a Code フレームワークと統合するために、Python boto3 ライブラリを使用して AWS CloudFormation カスタムリソースを作成します。カスタムリソースを使用すると、通常の AWS CloudFormation リソースの代わりに AWS Lambda 関数を使用でき、デフォルトのテンプレートでは不可能な AWS リソースのカスタム実装が可能になります。

カスタムリソースを使用して、指定した Amazon S3 のバケットに保存されているビデオファイルに基づいて Amazon IVS チャネルを作成し、 e コマースサイトに表示する多くのビデオをストリーミングできます。ビデオファイルをストリームにマッピングするパラメータは AWS Systems Manager (SSM) パラメータストアに自動的に保存されます。つまり、ビデオをチャネルにストリーミングするアプリケーションは、同じビデオを同じチャネルに配信します。

ivs_client = boto3.client('ivs')
ssm_client = boto3.client('ssm')

channel_name = 'retail-demo-store-' + \

created_channel_arn = ivs_client.create_channel(name=channel_name,latencyMode=’NORMAL’)[‘channel’][‘arn’]
logger.info(f"IVS channel created with ARN {created_channel_arn}")


if is_ssm_parameter_set(SSM_VIDEO_CHANNEL_MAP_PARAM): 
video_channel_param_value = ssm_client.get_parameter (Name=SSM_VIDEO_CHANNEL_MAP_PARAM)[‘Parameter’][‘Value’]
	video_channel_map = json.loads(video_channel_param_value)

	video_channel_map[video_file_key] = created_channel_arn

	ssm_client.put_parameter(
		Name=SSM_VIDEO_CHANNEL_MAP_PARAM,
		Value=json.dumps(video_channel_map),
		Type=’String’,
		Overwrite=True
	)

(src/aws-lambda/ivs-create-channels/ivs-create-channels.py より)

メタデータのエンコーディング

Amazon IVS の重要な機能の 1 つは、メタデータをストリーム内に直接埋め込む機能です。これにより、ビデオストリーム内でビデオと同期したコンテンツを配信できます。 このメタデータは PutMetadata API を使用して特定のチャネルの Amazon IVS API に送信され、メタデータはストリームコンシューマーにリアルタイムで配布されます。

ivs_client.put_metadata(
  channelArn=channel_arn,
  metadata=line
)

(src/videos/src/videos-service/app.py より)

デモ用に事前に録画されたビデオと一緒にメタデータをストリーミングするため、メタデータはストリーミングされるビデオと同じファイルにエンコードされています。これにより、ビデオコンテンツと送信されるメタデータ間でより適切なタイミングでの同期が可能になります。 この理由から Matroska マルチメディアコンテナ (.mkv) フォーマットが使用されており、メタデータは字幕ファイルとしてビデオコンテナに含まれています。

SRT 字幕フォーマットは、その単純な形式と読みやすさ、および開発者にとっての編集のしやすさから選択されています。 ファイルは、プレーンテキストとして、またはオープンソースソフトウェアを使用して編集できます。 次のスニペットは、SRT フォーマットを使用して商品メタデータをキャプチャする方法のサンプルを示しています。

1
00:00:04,000 --> 00:00:08,000
{"productId": 1}

2
00:00:08,000 --> 00:00:12,000
{"productId": 2}

3
00:00:12,000 --> 00:00:16,000
{"productId": 3}

4
00:00:16,000 --> 00:00:20,000
{"productId": 4}

(videos/sample.srt より)

ここでは、商品 ID がシンプルな JSON オブジェクトに保存され、各エントリの初期タイムスタンプは、商品がビデオストリームに最初に表示されるポイントになっています。

このメタデータとしての字幕の実装は、標準的なビデオ処理やストリーミングのソフトウェアを使用してファイルを処理できることも意味します。 次のコマンドは、FFmpeg を使用してメタデータファイルとビデオを単一の MKV コンテナに結合する方法を示しています。 この例は MP4 フォーマットで説明されていますが、このコマンドは多くのビデオフォーマットと互換性があります。

ffmpeg -i video.mp4 -i metadata.srt output.mkv

このコマンドで出力されるファイルには、事前録画されたビデオにメタデータ情報を付与した Amazon IVS ストリームを実行するために必要なすべてのものが含まれています。ここでは FFmpeg がビデオ録画に使用されていますが、Open Broadcast Software (OBS) もビデオ録画とイベントの Amazon IVS へのライブストリーミングに使用できます。

効率的なビデオエンコーディング

ビデオエンコードには CPU 負荷がかかることがあるため、事前録画されたビデオがループで繰り返しストリーミングされるようなシナリオでは、1 回限りの作業として事前にビデオをエンコードしておくと便利です。これにより、追加の処理を必要とせずにビデオをストリームに直接コピーできるため、ストリーミングインフラストラクチャに必要な CPU 要件が軽減されます。また、特定のプレゼンテーションのユースケースに合わせてビデオを最適化するために必要な追加の操作も可能にします。これを実現するために、以下に示すように前述の FFmpeg コマンドにいくつかのエンコードパラメーターを追加します。

ffmpeg -i video.mp4 -i metadata.srt -vf scale=640x360 -c:v libx264  \
-pix_fmt yuv420p -profile:v main -tune fastdecode -x264opts “nal-hrd=cbr:no-scenecut” -minrate 3000 \
-maxrate 3000 -g 60 -c:a aac -b:a 160k -ac 2 -ar 44100 output.mkv

このようにビデオを事前にエンコードすることで、リアルタイムのエンコードなしでビデオを Amazon IVS にストリーミングできます。つまり、最小限の CPU を持つコンテナで多くのビデオをストリーミングでき、計算コストを最小限に抑えることができます。

手動でビデオを Amazon IVS にストリーミングする

ビデオコンテンツと Amazon IVS の互換性をテストするには、次の FFmpeg コマンドを使用してビデオを手動でサービスにストリーミングします。

ffmpeg -loglevel panic -hide_banner -re -stream_loop -1 -i \"{video_filepath}\" -r 30 -c:v copy -f flv rtmps://{ingest_endpoint}:443/app/{stream_key}

Amazon IVS コンソールを使用してストリームを表示し、ビデオが想定どおりにストリームに表示されていることを確認します。

AWS リテールデモストア内の ビデオブロガーによるストリーミング商品デモ

Amazon ECS

ビデオファイルは、AWS リテールデモストアの既存のクラスタに追加された新しいサービスから Amazon IVS にストリーミングされます。このサービスは、ストリームの取り込み URL とストリームに含まれる商品の完全なリストを返すエンドポイントを提供し、これを使ってUI と完全に統合できます。コードは Python 3.8 で記述された Flask API としてラップされています。

サービス開始時に、ビデオと Amazon IVS チャネルへのマッピングが SSM から取得され、個別のスレッドで繰り返しループによって対応する Amazon IVS チャネルにビデオがストリーミングされます。これにより、ファイル内の SRT データが読み取られて処理され、含まれるメタデータが適切なタイミングで PutMetadata API によって Amazon IVS に送信されます。次のコードスニペットは、これが Python でどのように行われるかのサンプルを示しています。

ffmpeg_stream_cmd = """ffmpeg -loglevel panic -hide_banner -re -stream_loop -1 -i \"{video_filepath}\" \ -r 30 -c:v copy -f flv rtmps://{ingest_endpoint}:443/app/{stream_key} -map 0:s -f {subtitle_format} -"""

process = subprocess.Popen(
  	ffmpeg_stream_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
universal_newlines=True, shell=True)

lines = iter(process.stdout)
while True:
   int(next(lines).strip())
   time_range = next(lines).strip()
   if not '-->' in time_range:
       raise ValueError(f'Expected a time range instead of {time_range}')
   send_text = ''
   while True:  # SRT can come in multiple lines
       text = next(lines).strip()
       if len(text) == 0: break  # SRT ends with a newline
       if len(send_text) > 0: send_text += '\n'
       send_text += text

   ivs_client.put_metadata(
       channelArn=ivs_channel_arn,
       metadata=send_text
   )

ビデオを事前にエンコードすることにより、デプロイされたデモでは 0.25 vCPU、0.5 GB メモリのコンテナで 5 つのビデオを同時にストリーミングできます。

“stream_details” エンドポイントも実装されています。これは、各ストリームに表示される商品の商品 ID リストに加えて、各ストリームの取り込み URL を返します。これにより UI は、ストリームに含まれる商品に関連するデータを必要に応じてプリフェッチできます。

{
"streams": [
  {
    "playback_url": "https://2f185ac93237.us-west-2.playback.live-video.net/api/video/v1/us-west-2.266916629424.channel.Kyr5LYOURnWt.m3u8",
    "products": [
      101,
      102,
      103,
      104,
      105,
      106,
      107
    ],
    "thumb_url": "/static/default_stream1_thumb.png"
  },
  {
    "playback_url": "https://2f185ac93237.us-west-2.playback.live-video.net/api/video/v1/us-west-2.266916629424.channel.kFHQJjo6tk1V.m3u8",
    "products": [
      301,
      302,
      303,
      304,
      201,
      1000567890
    ],
    "thumb_url": "/static/default_stream3_thumb.png"
  }
]
}

e コマース UI と メタデータドリブンのパーソナライゼーション

メタデータを含む m3u8 ストリームの表示には、Amazon IVS Player のデフォルトの実装を利用しています。これは他のビデオと同じように Web ページに追加できます。プレーヤーの TEXT_METADATA_CUE イベントのリスナーは、コールバック関数を使用してメタデータの処理を構築できるようにします。

player.addEventListener(PlayerEventType.TEXT_METADATA_CUE, (cue) => {
console.log('Timed metadata: ', cue.text);
this.handleMetadata(cue.text);
});

リテールデモストアの場合、IVS ストリームは、ビデオブログ形式のビデオと UI コンポーネントを組み合わせた形式で表示され、ストリームに表示されている商品をハイライトします。画面に表示される商品が変わると、関連商品の選択とパーソナライズされた値引き (Amazon Personalizeを使用して決定される) も更新され表示されます。

Amazon Personalize によるパーソナライズされた値引き

ユーザーの取り込みを最大化するための値引き提案に Amazon Personalize を活用しています。Amazon Personalizeは、値引きされた商品に対する個別ユーザーやユーザー群の取り込みの過去の履歴から、提供可能な商品のパーソナライズされた再ランク付けを提供します。 次に、パーソナライズされた値引きを売れ筋商品に適用して提供します。

Amazon Personalize は商品を再ランク付けしてパーソナライズされた値引きを提供

Pythonを使ってAmazon Personalize ソリューションで学習する

ご自身のデータセットを使用して Amazon Personalize を設定する方法の完全なチュートリアルは、公式ドキュメントを参照してください。

ここでは “aws-personalized-ranking” レシピを使用して再ランク付けソリューションをトレーニングします。Amazon Personalize に “DiscountedProductViewed” イベントタイプ (これはデータセットに固有です。ご自身のデータセットのでは異なるイベントタイプである可能性があります) に対してトレーニングするように指示し、値引きされた商品ビューイベントを予測するようにします。別のアプローチは、コンバージョンイベント (“DiscountedProductPurchased” など) に対してトレーニングすることです。

personalize = boto3.client("personalize")
create_solution_response = personalize.create_solution(
   name="personalized_discounts",
   datasetGroupArn="retail_demo_store",
   recipeArn="arn:aws:personalize:::recipe/aws-personalized-ranking",
   eventType="DiscountedProductViewed",
   performHPO=True
)

ソリューションを構成したら、ソリューションをトレーニングして、実行時に再ランク付けできる “キャンペーン” をデプロイできます。キャンペーンを、A/Bテストの管理や多重レコメンドシステムなどのロジックを含むエンドポイントに組み込みます。そのエンドポイントを通して再ランク付けを実行し、値引きを提供する商品が決定されます。 大まかには以下のようになります。

for item in items:
            item_id = item['itemId']
            if item_id in discount_item_map:
                discounted_item = discount_item_map[item_id]
                discounted_item['discounted'] = True
                
            else:
                
                item['discounted'] = False

Amazon Personalize の推奨フィルターを使用すると、以前に購入した商品を自動的に削除できます。特定のビジネス KPI に関連するレコメンデーションを除外するために、追加のカスタムロジックを作成することもできます。

まとめ

Amazon IVS と Amazon Personalize の組み合わせは小売業界における開発に無限の機会をもたらします。AWS 上にホストされる拡張性の高いサービスを利用することで、ビジネスアプリケーションの差別化に集中できます。このデモで参照されているすべてのコードは リテールデモストア GitHub リポジトリに統合されておりここから入手可能です。お持ちの AWS アカウントにほんの数分でデプロイでき、調べたり実験してみていただくことができます。

著者について

Krithika Ganesamoorthi

Krithika Ganesamoorthi は、小売/消費財における AWSパートナーのグローバルテクニカルリードです。小売業での経験を活かし、AWS 小売業/消費財テクノロジーのソリューションアーキテクチャと技術戦略および、コンサルティングパートナーを担当しています。パートナーの AWS上のソリューションを変革するための採用、育成、支援を行っています。Amazon Retail、AWS Salesおよび、AWS Productチーム内のパートナーのためのアドボケートです。

Kyle Redelinghuys

Kyle Redelinghuys は、ロンドンを拠点とするコンサルタント会社であるDae.mnのエンジニアリング責任者であり、顧客のテクノロジーの向上を支援しています。 技術バックグラウンドを持っており、現在はエキサイティングな製品やサービスの開発と提供を通じてエンジニアリング機能の推進を支援しています。 Dae.mn 社は、AWSサービスを使用した製品開発の豊富な経験があり、AWS Retail Competency を有しています。

翻訳は Solutions Architect 国政が担当しました。原文はこちらです。