Bedrock の新モデル Amazon Nova を早速試してみた！

# はじめに
こんにちは！ **yu-Matsu**です！

現在 **AWS re:Invent 2024**の真っ最中で、生成AI周りでも大量のアップデートが舞い込んできておりキャッチアップに追われています...

そんな中、日本時刻で12/3の深夜に、KeyNoteにて Amazon Bedrock の新モデルである **Nova ファミリー** が発表され、利用できるようになっていたので試してみました。

https://aws.amazon.com/jp/ai/generative-ai/nova/



# Amazon Nova とは

Amazon Bedrockで新しく利用できるようになったモデル群であり、テキストや画像、動画を入力とし、それに対するテキストを出力する **understanding models** と、テキストや画像を入力とし、そこから新たな画像や動画を生成する **creative content generation models**で構成されています。

それぞれには、以下のようなモデルがあります。
### understanding models
1. **Amazon Nova Micro**
    - 最も低コストだが、テキストのみ対応しており、画像や動画は取り扱えない 
2. **Amazon Nova Lite**
    - 低コストながらも、高速なマルチモーダルなモデル。検証などで利用する場合はこちらが良さそう 
3. **Amazon Nova Pro**
    - Nova Lite よりもより精度、コスト、速度のバランスが取れているモデル。複雑なワークフローにも対応可能とのこと
4. **Amazon Nova Premier**
    - 最も高性能なのモデルのようだが、Comming Soon...

既存のモデルとの性能比較に関しては、以下のサイトに掲載されています。

https://aws.amazon.com/jp/ai/generative-ai/nova/understanding/


### creative content generation models
1. **Amazon Nova Canvas**
    - テキスト情報から画像を生成するモデル。モデル実行の際にカラーパレットやContributing Image(おそらく基準となる画像)を指定できる 
2. **Amazon Nova Reel**
    - 動画生成モデル。テキスト情報だけでなく、画像も入力として扱えることが特徴


なんか色々出来そうでワクワクしますね！！
Novaといえば、某駅前留学が思い浮かぶのですが、もう古いですかね...


# 有効化して使ってみた
## モデルの有効化
それでは実際にモデルを有効化して使ってみたいと思います！

いつも通り、Bedrockのコンソールからモデル一覧をのぞいでみると...

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/13e74464-5ced-7ebe-5f47-679f99a36fdf.png" width=400>

あった、ありました！
それでは早速モデルアクセスの申請をして...
数分待つかと思いきや、ほんの数秒ほどで有効化されました！

![スクリーンショット 2024-12-04 20.00.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/cd6efeb7-2ee1-c764-157e-6659dbf0adfe.png)

## Bedrockのコンソールから使ってみる
### テキスト生成/画像分析
まずは基本（？）のテキスト生成から見てみます。

Bedrockコンソールの左メニューを見てみると、[プレイグラウンド]の下に[**Chat/Text**]、[**Image/Video**]の選択肢が出来ていることが分かります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/81bfa417-16ab-3f1a-e207-d15d79d1f1c8.png" width=250>

今回はテキスト生成を試すので、[**Chat/Text**]を選択します。
プレイグラウンドは以下のようになっています。

![スクリーンショット 2024-12-04 20.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/0dd79f1d-3d3e-63f2-a6c9-da5da600d9af.png)

[モデルを選択]から、今回試してみたいモデルである [**Nova Pro**]を選択し、[適用]します。

![スクリーンショット 2024-12-04 20.01.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/97dde0c6-ad27-a84b-8110-9b13468db955.png)

小手試しとして、「**Amazon Bedrockの特徴を簡潔に答えて！**」と入力し、実行してみました。結果の一部が以下の画像のようになっています。かなり精度の高い回答が返ってきているように感じます。


![スクリーンショット 2024-12-04 20.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/1b53130e-a1af-92dd-bf6b-8b80c02c4d25.png)


何よりも驚いたのが、その**速度**です。これくらいの内容であれば、ほんの一瞬で回答が返ってきました。アプリケーションからBedrockのモデルを動かす際など、今までは多少のレスポンスの悪さを感じることがありましたが、これはかなり改善されそうです。






画像分析も試してみました。
以下の画像について説明してもらいました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/f3687dcb-05fe-61ca-b56e-83bf15b55c5d.png" width=200>

「黒い背景」というところが少し怪しく感じますが、この画像は透過処理されているものであるので、そこが関係していそうです。それ以外の説明に関しては違和感のない回答となっています。

![スクリーンショット 2024-12-04 20.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/bfa4dcb2-b0ba-1025-acd7-6a897c1fc221.png)

今回は時間の都合上割愛していますが、同様に動画も入力にすることができますので、ぜひお試しください！






### 画像生成/動画生成
次に、画像、動画生成を試してみたいと思います。

まずは**画像生成**から。
左メニューの[プレイグラウンド]から、今度は[**Image/Video**]を選択します。

プレイグラウンドが開いたら、先ほどと同じように[モデルを選択]していきます。画像生成なので、今回は[**Nova Canvas**]を選択、適用します。

![スクリーンショット 2024-12-04 20.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/61567620-b913-e86c-3d0c-07044ea958e2.png)

カラーパレットを適当に指定して、「**マウスとキーボードを操作している犬の画像を生成して！**」と指示してみました。
少し待つと、以下のような画像が出力されました。マウスが見当たりませんが、**キーボードを触っていそうな犬の画像が生成されています！** カラーパレットで指定した色も反映されていそうです。
何回か試してみましたが、アニメ調ではなく、リアル寄りの画像が生成される傾向のようです。

![スクリーンショット 2024-12-04 20.21.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/135a4234-43ff-ec25-2abe-d28bf487a608.png)

ちなみに、「Nova」なので「**英語が得意そうなウサギの画像を生成して**」と指示してみた結果が以下になります。

![スクリーンショット 2024-12-04 22.04.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/80ae17d3-4740-c794-6485-6a881e11852a.png)

某うさぎが出てこなくてよかった...
「英語が得意そう」といったかなり抽象的になってしまう指示に関しては上手く対応出来ていなさそうです。（人間でも難しいですが...）


最後に、**動画生成**を試してみます。
モデルに[**Nova Reel**]を選択します。どうでも良いことなのですが、動画生成モデルに「Reel」と名前をつけるのはかなりオシャレだなと思いました...

![スクリーンショット 2024-12-04 20.21.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/5fd24f05-70d7-c1dc-3a5c-73bdc27f74da.png)

生成された動画を保存するS3バケットが必要である旨のメッセージが出るので、[確認]を押下します。この際、バケットが自動で生成されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/55689d66-9fcd-1ecf-d41f-99d2e8b5531f.png" width=350>

「**Amazon Bedrockのアップデートに喜ぶ猫**」というテーマで動画を作成してもらうことにします。この際、[**Start frame**]で画像をしてすることで、その画像に即した動画が生成されます。（今回はしない）

![スクリーンショット 2024-12-04 20.23.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/eb316ff1-997b-a363-1046-67894c5146c7.png)

[実行]すると、動画の生成が開始されます。生成に大体**5分ほど**時間がかかりますので、のんびり待ちます。画面右側には現在の生成ジョブのステータスが表示されます。

![スクリーンショット 2024-12-04 20.23.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/76dd204e-177b-f8c3-038c-d6c5b5eed91b.png)

**動画の作成が完了しました！**
作成された動画のサムネイルが表示されています。現状は6秒の動画が生成されるようになっているようです。

![スクリーンショット 2024-12-04 20.27.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/c9b5dc91-69bc-9b06-a6a4-1ef38690bbbe.png)

作成された動画を確認してみます。
自動生成されたS3バケットを見に行ってみると、「**output.mp4**」という名前の動画ファイルがあることが分かります。

![スクリーンショット 2024-12-04 20.30.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/4682adc6-8f6d-7d6f-8cf9-85d46ece2a45.png)

作成された動画は以下のような感じになりました！
少々無茶振りだったこともあり Bedrock 感はあまりないですが、喜んではいそうですね！

![cat_1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/a9b8bc82-c3e3-4da2-71e9-2ff48c1577e1.gif)



# アプリケーションへの応用例
もちろんこれらのモデルは **APIからも実行可能** ですので、今すぐにでもアプリケーション開発に組み込むことが出来ます！ Pythonのコードサンプルなどは、以下のドキュメントに記載があります。

https://docs.aws.amazon.com/nova/latest/userguide/what-is-nova.html

今回はその一例として、**Streamlit(もはやお馴染み)** を利用した、簡単な**動画生成アプリケーション**を実装してみました。

コードな以下になります。

```Python:nova_reel.py
import json
import time
import boto3
import streamlit as st

bedrock_runtime = boto3.client("bedrock-runtime", "us-east-1")
s3_bucket = "作成された動画が保存されるS3バケット"

def generate_presigned_url(bucket_name, object_key, expiration=86400):
    '''
    作成された動画の署名付きURLを発行する
    '''
    
    s3_client = boto3.client('s3', 'us-east-1')
 
    url = s3_client.generate_presigned_url(
        'get_object',
        Params={'Bucket': bucket_name, 'Key': object_key},
        ExpiresIn=expiration
    )
    return url

def run_nova_reel(input): 
    '''
    動画生成を実行する
    '''
    
    model_input = {
        "taskType": "TEXT_VIDEO",
        "textToVideoParams": {
            "text": input
        },
        "videoGenerationConfig": {
            "durationSeconds": 6,
            "fps": 24,
            "dimension": "1280x720",
            "seed": 0,  # Change the seed to get a different result
        },
    }

    invocation = bedrock_runtime.start_async_invoke(
        modelId="amazon.nova-reel-v1:0",
        modelInput=model_input,
        outputDataConfig={
            "s3OutputDataConfig": {
                "s3Uri": f"s3://{s3_bucket}"
            }
        }
    )

    status_placeholder = st.empty()
    final_response = ""

    invocation_arn = invocation["invocationArn"]

    invoke_status = ""
    passed_time = 0

    # 実行状況を画面に表示する
    while True:
        res = bedrock_runtime.get_async_invoke(
            invocationArn=invocation_arn
        )

        invoke_status = res["status"]
        status_placeholder.write(f"Job {invocation_arn} is in progress. {passed_time}s...")

        if invoke_status != "InProgress":
            break

        time.sleep(30)
        passed_time += 30

    if invoke_status == "Completed":
        prefix = invocation_arn.split('/')[-1]
        url = generate_presigned_url(s3_bucket, prefix+"/output.mp4")

        # ボタンを押下すれば動画をDL出来るようにする 
        status_placeholder.write("生成完了！")
        st.link_button("ダウンロードURL", url)


def main():
    st.title("Nova Reel 検証アプリ")
    input = st.text_input("何か入力")
    
    if st.button("実行！"):
        run_nova_reel(input)

if __name__ == "__main__":
    main()
```

コードの簡単な解説は以下になります。
- 動画生成モデルの実行APIは、**bedrock_runtime.start_async_invoke**で呼び出している
- 動画の生成状況に関しては、**bedrock_runtime.get_async_invoke**を定期的にポーリングして確認している
- 動画の生成状況が「Completed」になったら、保存された動画の署名付きURLを発行して、画面上からダウンロード出来るようにボタンを設ける


以下のコマンドを実行し、アプリケーションを起動します。（ローカル環境で実行する場合は、AWSの認証情報を環境変数にexportしておく必要があります）

```
streamlit run nova_reel.py --server.port 8080
```

以下のような画面が開いたら起動成功です！

![スクリーンショット 2024-12-04 22.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/1d956880-a9d5-3d8b-543e-723a6efe9b04.png)

それでは、コンソールで試してた時と同じように、「**Amazon Bedrockのアップデートに喜んでいる猫**」と入力し、実行してみます。
問題なく動いているようです！ 30秒ごとにポーリングしてステータスを確認し、実行ボタンの下に表示しています。

![スクリーンショット 2024-12-04 22.59.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/d770c33b-e5f7-9ee8-092e-78aff0cbf86c.png)

**動画の生成が完了しました！**
[ダウンロードURL]ボタンをクリックし、動画をダウンロードしてみます

![スクリーンショット 2024-12-04 23.03.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/26b7a535-badc-c3ec-d329-bf46a362c295.png)

今回生成された動画がこちらになります。
前回よりもかなりリアル寄りになりました。そのせいもあるのか、喜んでいるのかどうかわからないですね... 　少しソワソワしているように感じるので、表情に出ていないだけと思っておきます

![cat_2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026734/decd7a5a-30dd-cfba-6566-593956c34506.gif)

このように、APIを利用してアプケーションを作成、または既存のアプリケーションへの組み込みが非常に簡単に出来ます！



# 最後に
今回は、AWS re:Invent 2024で発表されたばかりの **Amazon Nova** で色々遊んでみたので記事にしました。現在re:Inventで発表されている中では、個人的にRerankモデルと同じくかなり大きなアップデートでした。従来のテキスト生成の性能向上に加え、画像生成や動画生成がより簡単に取り扱えるようになったため、アプリケーションへの組み込みの幅がかなり増えたのではないかと考えています。
re:Inventはまだ折り返したばかりで、これからもかなり多くのアップデートが発表されると思われますので、なんとか食いついて行きたいです...

今回の記事は以上になります。最後までご精読いただきまして、ありがとうございました！


### 少し宣伝...
今年も私の所属している KDDIアジャイル開発センター株式会社 のアドベントカレンダーが始まっています。ご興味がある方は是非ご覧になってください！（私も月末に何か書きます）

https://qiita.com/advent-calendar/2024/kag