Amazon Novaで容量が大きいファイルを読み込ませたい時の備忘録

に公開

はじめに

Fusicのレオナです。Amazon Bedrockで提供されている基盤モデルAmazon Novaを使うと、テキストだけでなく画像や動画に対して、動画解析ができます。また動画を直接APIに送信する場合はBase64エンコードが必要になり、その場合のペイロード上限が25MBに制限されています。

本ブログでは、容量が大きい動画を解析する際は、Amazon S3のURIを指定して呼び出す方法を採用することで最大1GBまでの動画を分析する方法を解説します。

Amazon Novaでの動画アップロード制限

  • Base64方式
    — MP4 や MOVなどの動画をBase64文字列としてメッセージに埋め込む方法です。この場合、ペイロード全体のサイズは25MB以下でなければなりません。

  • S3URI方式

    • 動画をAmazon S3バケットに置き、そのURIをAPIに渡す方法です。こちらは1件あたり 1GB、ペイロード全体では最大2GBまで扱えます。

https://docs.aws.amazon.com/nova/latest/userguide/modalities-video.html

データ

今回は Hugging Faceで公開されているCorran/pexelvideosからサンプルデータを使用しました。具体的にはPexelsの “a man drinking a cup of coffee” の4K UHD版(約44.2MB)を利用します。

Amazon S3に動画をアップロードする

  1. オレゴンリージョンでS3 バケットを準備する
  2. 解析させる動画をアップロード

    3.S3URIをコピーボタンを押下

実装

s3_nova_video_analysis.py
import boto3

# S3 URI設定
s3_uri = "コピーしたS3 URI.mp4"

# システムプロンプト
system_prompt = "あなた動画解析の専門家です。ユーザーの質問に答えてください。"

# ユーザープロンプト
user_prompt = """
男性は何色のメガネをかけていますか??
"""

# Bedrock Runtime クライアントを作成
client = boto3.client("bedrock-runtime", region_name="us-west-2")

MODEL_ID = "us.amazon.nova-premier-v1:0"  # Nova Premier を利用

user_message = {
    "role": "user",
    "content": [
        {
            "video": {
                "format": "mp4",
                "source": {
                    "s3Location": {
                        "uri": s3_uri,
                    }
                },
            }
        },
        {"text": user_prompt},
    ],
}

conversation = [user_message]

# ConverseAPIを呼び出す
response = client.converse(
    modelId=MODEL_ID,
    messages=conversation,
    system=[{"text": system_prompt}],
    inferenceConfig={
        "maxTokens": 4000,
        "temperature": 0.1
    },
)

# 結果を取得して表示
analysis_result = response["output"]["message"]["content"][0]["text"]
print(analysis_result)

実行結果

terminal
% python s3_nova_video_analysis.py
男性は金色の縁取りのあるメガネをかけています。縁取りは細く、レンズの形は楕円形です。

最後に

今回は、Amazon Novaで容量の大きな動画を扱う際の課題と解決策について解説しました。動画ファイルを事前にAmazon S3バケットにアップロードし、そのURIをAmazon Novaを使用してConverserAPIに指定する方法が有効です。ご参考になればと思います。

Fusic 技術ブログ

Discussion