Amazon Nova lite での動画処理 - Google Colab ガイド

このノートブックの後編では、Amazon Nova を使用した動画処理の実装方法と制限事項について説明します。Nova の動画理解機能は強力ですが、いくつかの重要な制限があることに注意が必要です。

<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="ja" dir="ltr">Amazon nova liteで 動画の解析をbotoでやってみた！ <a href="https://t.co/hBmrGKcPk8">https://t.co/hBmrGKcPk8</a> <a href="https://t.co/itooipDSFr">pic.twitter.com/itooipDSFr</a></p>&mdash; Maki@Sunwood AI Labs. (@hAru_mAki_ch) <a href="https://twitter.com/hAru_mAki_ch/status/1864314965756399665?ref_src=twsrc%5Etfw">December 4, 2024</a></blockquote>

## 動画処理の基本実装

まず、基本的な動画処理の実装方法を見ていきます。

```python
import base64
import boto3
import json

# Bedrockクライアントの初期化
client = boto3.client(
    "bedrock-runtime",
    region_name="us-east-1",
    aws_access_key_id="YOUR_ACCESS_KEY_ID",
    aws_secret_access_key="YOUR_SECRET_ACCESS_KEY"
)

MODEL_ID = "us.amazon.nova-lite-v1:0"
```

## ローカルビデオの処理

ローカルに保存された動画を処理する例です。

```python
# 動画ファイルの読み込みとエンコード
with open("sample_video.mp4", "rb") as video_file:
    binary_data = video_file.read()
    base64_string = base64.b64encode(binary_data).decode("utf-8")

# システムプロンプトの設定
system_list = [
    {
        "text": "You are an expert media analyst. When the user provides you with a video, provide 3 potential video titles"
    }
]

# ユーザーメッセージの設定
message_list = [
    {
        "role": "user",
        "content": [
            {
                "video": {
                    "format": "mp4",
                    "source": {"bytes": base64_string},
                }
            },
            {
                "text": "Provide video titles for this clip."
            },
        ],
    }
]

# 推論パラメータの設定
inf_params = {
    "max_new_tokens": 300,
    "top_p": 0.1,
    "top_k": 20,
    "temperature": 0.3
}
```

## S3からの動画処理

S3バケットに保存された動画を処理する例です。

```python
# S3からの動画処理用メッセージ
message_list = [
    {
        "role": "user",
        "content": [
            {
                "video": {
                    "format": "mp4",
                    "source": {
                        "s3Location": {
                            "uri": "s3://my_bucket/video1.mp4",
                            "bucketOwner": "123456xxxx"
                        }
                    }
                }
            },
            {
                "text": "Provide video titles for this clip."
            }
        ]
    }
]
```

## 動画処理の実行

```python
# リクエストの構築と実行
native_request = {
    "schemaVersion": "messages-v1",
    "messages": message_list,
    "system": system_list,
    "inferenceConfig": inf_params,
}

try:
    response = client.invoke_model(
        modelId=MODEL_ID,
        body=json.dumps(native_request)
    )
    model_response = json.loads(response["body"].read())
    
    print("[Full Response]")
    print(json.dumps(model_response, indent=2))
    
    content_text = model_response["output"]["message"]["content"][0]["text"]
    print("\n[Response Content Text]")
    print(content_text)

except Exception as e:
    print(f"Error occurred: {str(e)}")
```

## 重要な制限事項

Nova の動画処理には以下の重要な制限があります：

### 基本的な制限
1. **1リクエストにつき1動画**: 現在、1回のリクエストで処理できる動画は1つのみです
2. **音声非対応**: 現在のモデルは視覚情報のみを処理し、音声の分析はできません
3. **タイムスタンプ非対応**: タイムスタンプ情報の処理や理解はできません

### 機能の制限
4. **時間的因果関係**: 動画内のイベントの因果関係の理解は限定的です
5. **手書き文字の理解**: 手書き文字の認識は限定的で、誤認識の可能性があります
6. **多言語対応**: 画像や動画フレーム内の多言語テキストの理解は限定的です

### セキュリティと特殊ケース
7. **人物識別**: 画像、文書、動画内の個人の識別や命名はサポートしていません
8. **空間認識**: 空間的な推論能力は限定的です
9. **小さいテキスト**: 画像や動画内の小さいテキストは認識が困難な場合があります

### その他の制限
10. **カウント機能**: オブジェクトの正確な数の計測は難しい場合があります
11. **不適切なコンテンツ**: 利用規約に違反するコンテンツは処理しません
12. **医療用途**: 医療画像や動画の分析は推奨されません

## ベストプラクティス

1. **動画の前処理**:
   - 動画の解像度とサイズを適切に調整
   - 重要な部分が明確に見えるようにトリミング
   - テキストが含まれる場合は、十分な大きさを確保

2. **プロンプトの工夫**:
   - 具体的な指示を提供
   - 複雑なタスクは小さく分割
   - モデルの制限を考慮したタスク設計

3. **エラーハンドリング**:
   - タイムアウトの考慮
   - 適切なエラー処理の実装
   - リトライロジックの実装

## トラブルシューティング

エラーが発生した場合は、以下を確認してください：
- 動画のフォーマットとサイズが適切か
- S3のアクセス権限が正しく設定されているか
- リクエストの制限を超えていないか
- プロンプトが制限事項に触れていないか



## 📒ノートブック


https://colab.research.google.com/drive/1a2AjfXWh_aK9d8J7kH1-s506DoXUPJfJ?usp=sharing


<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>