NRIネットコム Blog

NRIネットコム社員が様々な視点で、日々の気づきやナレッジを発信するメディアです

Amazon Novaで新時代のNovaを作ってみた

はじめに

こんにちは、志水です。初めてre:Inventで5K run参加しました。自分は歩きますと行くメンバーに伝えていたのに、いざ出発すると周りが全く歩いてないので、即座に走り出してしまいました。日本人的な心が抜けてないようですね。

さて、待ちに待ったAWSの新しい基盤モデル、Amazon Novaがついに発表されました!テキスト・画像・動画を処理できる最新の基盤モデル群ということで、大きな期待が寄せられています。

aws.amazon.com

「Nova」と聞いて不思議と頭に思い浮かぶのは、ウサギですよね。これは運命的な出会いかもしれません。ということで、早速ウサギの動画を作ってみることにしましょう。

Amazon Novaとは

Amazon Novaは、AWSが2024年12月3日に発表した最先端の基盤モデル群です。Amazon Bedrockを通じて提供され、以下の6つのモデルで構成されています。

  • Nova Micro: 最も低レイテンシーで低コストなテキスト専用モデル
  • Nova Lite: 画像・動画・テキストを高速に処理できる低コストなマルチモーダルモデル
  • Nova Pro: 精度・速度・コストのバランスに優れた高性能マルチモーダルモデル
  • Nova Canvas: 最先端の画像生成モデル
  • Nova Reel: 最先端の動画生成モデル

これらのモデルは、Amazon Bedrockを通じて米国東部(バージニア北部)リージョンで利用可能です。また、Nova Micro/Lite/Proは米国西部(オレゴン)・米国東部(オハイオ)リージョンでもクロスリージョン推論により利用できます。

RAGやエージェントアプリケーションでの使用に最適化されており、Amazon Bedrockのファインチューニング機能を使用することで、ニーズに合わせてカスタマイズすることも可能です。

さらに、2025年には以下の2つの新しいモデルが追加される予定です。つまり、いっぱい聞けて、いっぱい喋れるモデルになっていくようです。

  • Nova Premier: 最も高性能な推論と複雑な推論タスクに特化したマルチモーダルモデル
  • speech-to-speech モデル: 音声入力を自然言語として理解し、トーンやリズムなどの非言語的な要素も解釈して、自然な人間らしい対話を実現する音声対音声モデル
  • Any-to-Any モデル: テキスト・画像・音声・動画を入出力の両方で処理できるマルチモーダルモデル。コンテンツのモダリティ間変換や編集、AIエージェントの実現に活用可能

www.youtube.com

www.aboutamazon.com

今回やってみたこと

Amazon NovaのPro/Canvas/Reelを使って、うさぎのダンス動画を作ってみました。思ったより簡単に作れたので、その過程を共有したいと思います。

使ったツール

  • Nova Pro: Canvas/Reelへのプロンプトを考えるのに使用
  • Nova Canvas: うさぎの画像を生成
  • Nova Reel: うさぎを動かして動画にする

アーキテクチャ

手順

1. Nova Proでうさぎの画像プロンプトを作る

まずは、Nova Proに相談して、うさぎのキャラクターを描くためのプロンプトを作成しました。以下のような特徴を持つキャラクターを作りたいと伝えました。

  • ピンク色の体全体の毛並み
  • 直立した耳と白い内側
  • 黄色い丸いくちばし
  • 胸に青地に黄色の「A」のバッジ
  • リラックスした表情の閉じた目
  • デフォルメされたシンプルで可愛らしいフォルム
  • 手を腰に当てた誇らしげな立ち姿勢

Nova Proは、これらの特徴を英語のプロンプトに変換し、Nova Canvasで使用できる形式で提案してくれました。

AWS_REGION = "us-east-1"
PRO_MODEL_ID = "amazon.nova-pro-v1:0"


def generate_prompt_with_nova_pro(prompt_request):
    bedrock_runtime = boto3.client("bedrock-runtime", region_name=AWS_REGION)
    response = bedrock_runtime.converse(
        modelId=PRO_MODEL_ID,
        messages=[{"role": "user", "content": [{"text": prompt_request}]}],
        inferenceConfig={"temperature": 0.7}
    )
    return response["output"]["message"]["content"][0]["text"]

# 画像生成用のプロンプトを生成
image_prompt_request = """
Amazon Nova Canvasで画像生成のためのプロンプトを生成してください。
かわいいウサギが登場する画像のプロンプトを英語で作成してください。
出力はプロンプトのみにして、説明などは入れないでください。
このうさぎのキャラクターの特徴を以下に列挙します。

<features>
1. **ピンク色の体** - 全体的にピンク色の毛並みを持っています。
2. **垂直の耳** - 両耳は直立しており、白い内側の部分が特徴的。
3. **黄色いくちばし** - 黄色い丸いくちばしを持っており、キャラクター性を際立たせています。
4. **「A」のロゴ** - 胸に青い背景に黄色の「A」が描かれたバッジが付いています。
5. **閉じた目** - 目は細く閉じており、リラックスした表情を表しています。
6. **シンプルなデザイン** - デフォルメされたシンプルで可愛らしいフォルム。
7. **立っているポーズ** - 手を腰に当て、少し誇らしげな立ち姿勢。
</features>
"""
image_prompt = generate_prompt_with_nova_pro(image_prompt_request)

ロゴは本来Novaの「N」なのですが、AWSということで「A」にしています。

2. Nova Canvasでうさぎを描く

作成したプロンプトを使って、Nova Canvasでうさぎのキャラクターを生成しました。Nova Canvasは、テキストプロンプトから画像を生成できる強力なAIモデルです。Nova Reelでの入力に合わせて1024x720ピクセルのサイズで、ランダムなシード値を使用して画像を生成します。生成された画像は、Base64エンコードされた文字列として返されます。

CANVAS_MODEL_ID = "amazon.nova-canvas-v1:0"

# Nova Canvasで画像を生成する関数
def generate_image_with_nova_canvas(prompt, width=1280, height=720):
    bedrock_runtime = boto3.client("bedrock-runtime", region_name=AWS_REGION)
    canvas_input = {
        "taskType": "TEXT_IMAGE",
        "textToImageParams": {
            "text": prompt
        },
        "imageGenerationConfig": {
            "width": width,
            "height": height,
            "numberOfImages": 1,
            "seed": random.randint(0, 2147483648)
        }
    }
    canvas_input_bytes = json.dumps(canvas_input).encode('utf-8')
    canvas_response = bedrock_runtime.invoke_model(
        modelId=CANVAS_MODEL_ID,
        body=canvas_input_bytes
    )
    canvas_response_body = json.loads(canvas_response.get('body').read())
    return canvas_response_body["images"][0]

# 画像を生成
input_image_base64 = generate_image_with_nova_canvas(image_prompt)

3. Nova Proでダンス動画のプロンプトを作る

次に、Nova Proに動画用のプロンプトを相談しました。Nova Reelで使用する動画生成用のプロンプトを作成するため、以下のような要件を指定しました。

  • かわいいウサギが首を左右に振る動き
  • 腰を首の動きと反対方向に振るダンス
  • 英語での出力
  • 説明などを含まない、プロンプトのみの出力

Nova Reelのプロンプトには512文字の制限があるため、これらの要件をコンパクトにまとめる必要がありました。Nova Proは制限内に収まるよう、適切な動画生成用のプロンプトを提案してくれました。このプロンプトを使用することで、意図した通りのダンスアニメーションを生成することができます。

# 動画生成用のプロンプトを生成
video_prompt_request = """
Amazon Nova Reelで動画生成のためのプロンプトを生成してください。
かわいいウサギが首を左右に振り、反対に腰を振る動きで踊っているプロンプトを英語で作成してください。
出力するプロンプトは512文字以内としてください。
出力はプロンプトのみにして、説明などは入れないでください。
"""

video_prompt = generate_prompt_with_nova_pro(video_prompt_request)

4. Nova Reelで動画を作成

作成したプロンプトを使って、Nova Reelで動画を生成しました。Nova Reelは非同期処理で動画を生成し、完了したらS3バケットに保存します。

動画生成時の設定は以下の通りです。 - 動画の長さ:6秒 - フレームレート:24fps - 解像度:1280x720ピクセル - ランダムなシード値を使用して、毎回異なる動きを生成 - S3バケットに出力

生成状況は30秒ごとにポーリングで確認し、完了するまで待機します。

S3_DESTINATION_BUCKET = "bedrock-video-generation-us-east-1-XXXXXX"
REEL_MODEL_ID = "amazon.nova-reel-v1:0"
SLEEP_TIME = 30

# Nova Reelで動画を生成する関数
def generate_video_with_nova_reel(prompt, input_image_base64, duration=6, fps=24, dimension="1280x720"):
    bedrock_runtime = boto3.client("bedrock-runtime", region_name=AWS_REGION)
    model_input = {
        "taskType": "TEXT_VIDEO",
        "textToVideoParams": {
            "text": prompt,
            "images": [{ "format": "png", "source": { "bytes": input_image_base64 } }]
        },
        "videoGenerationConfig": {
            "durationSeconds": duration,
            "fps": fps,
            "dimension": dimension,
            "seed": random.randint(0, 2147483648)
        }
    }
    
    invocation = bedrock_runtime.start_async_invoke(
        modelId=REEL_MODEL_ID,
        modelInput=model_input,
        outputDataConfig={"s3OutputDataConfig": {"s3Uri": f"s3://{S3_DESTINATION_BUCKET}"}}
    )
    return invocation["invocationArn"]

# 動画を生成
invocation_arn = generate_video_with_nova_reel(video_prompt, input_image_base64)
s3_prefix = invocation_arn.split('/')[-1]
s3_location = f"s3://{S3_DESTINATION_BUCKET}/{s3_prefix}"

bedrock_runtime = boto3.client("bedrock-runtime", region_name=AWS_REGION)
while True:
    response = bedrock_runtime.get_async_invoke(
        invocationArn=invocation_arn
    )
    status = response["status"]
    print(f"Status: {status}")
    if status != "InProgress":
        break
    time.sleep(SLEEP_TIME)

5. S3から動画をダウンロード

動画の生成が完了すると、S3バケットに保存された動画ファイルをローカル環境にダウンロードします。 ダウンロードされたファイルは「output.mp4」という名前でカレントディレクトリに保存されます。

if status == "Completed":
    print(f"\nVideo is ready at {s3_location}/output.mp4")
    # S3からローカルにダウンロード
    s3_client = boto3.client('s3')
    local_file_path = 'output.mp4'
    s3_client.download_file(
        S3_DESTINATION_BUCKET,
        f"{s3_prefix}/output.mp4",
        local_file_path
    )
    print(f"動画をローカルにダウンロードしました: {local_file_path}")
else:
    print(f"\nVideo generation status: {status}")

できあがり!

作った動画は、オリジナルのキャラクターよりも可愛らしい印象に仕上がりました。特に優しいピンク色の色調が令和時代らしい雰囲気を醸し出していて、まさに「令和のNova」という感じです!

ただし、いくつか課題もありました。

  • Reelへの入力制限が厳しく、プロンプトを制限内に収めるのが大変でした
  • キャラクターの特徴を全て反映してもらえず、特にくちばしの部分は完全に無視されてしまいました
  • 思い通りの結果を得るまでに何度か試行錯誤が必要でした
  • よく見ると、一部違和感のある動きになっていました

それでも、良かった点もたくさんありました。

  • 可愛らしいダンスのような動きになっていて良い感じでした
  • 全体的な動きが滑らかで洗練されていました
  • カラーリングが今どきのかわいさを演出

まとめ

Amazon Novaのツールを組み合わせることで、課題はあるものの、イメージに近い動画を作ることができました。制限事項を理解した上で、さらに工夫を重ねていきたいと思います!皆さんもいっぱい学んでください!Novaなら、できます!

執筆者志水友輔

2023,2024 Japan AWS Ambassador / 2021,2023,2024 Japan AWS Top Engineer / 2021-2024 APN ALL AWS Certifications Engineers / 2024 AWS Community Builder(Serverless)
大阪でAWSを中心としたクラウドの導入、設計、構築を専門に行っています。Generative AIとIaCとつけ麺が大好物

X:https://twitter.com/shimi023

Amazon著者ページ:Amazon.co.jp: 志水友輔: books, biography, latest update