先决条件: 请先运行 00-prerequisites.ipynb 中的先决条件。

图像转视频简介

通过Nova Reel的图像转视频功能,我们可以从现有图像创建视频,从而获得比仅使用文本转视频更大的视频输出控制权。我们使用的图像可以是现实世界的照片、艺术家或设计师创作的图像、真实产品的渲染或使用图像生成模型生成的图像。

运行下面的单元格以创建一个Bedrock Runtime客户端实例,我们稍后将使用它。

import boto3
import video_gen_util

boto3.setup_default_session(region_name="us-east-1")
session = boto3.Session()
sts_client = session.client("sts")

bedrock_runtime = boto3.client("bedrock-runtime")

设置存储

生成视频需要一些时间 - 大约3-4分钟才能产生6秒的视频。为了适应这个执行时间,Bedrock Runtime引入了一个新的异步调用API。我们通过调用Bedrock Runtime客户端的start_async_invoke()方法来开始生成视频。当生成作业完成时,Bedrock会自动将生成的视频保存到我们指定的S3存储桶中。

运行下面的单元格以自动在我们的帐户中创建一个新的S3存储桶,我们将使用它作为视频的目标位置。(如果我们已经有一个想要使用的现有存储桶,请编辑s3_destination_bucket变量以使用该存储桶的ID)

region = session.region_name
account_id = sts_client.get_caller_identity()["Account"]
new_bucket_name = f"ovg-bucket-{region}-{account_id}"

# 如果我们有一个现有的存储桶,请替换为该存储桶的ID。
s3_destination_bucket = new_bucket_name

# 创建存储桶
boto3.client("s3").create_bucket(Bucket=s3_destination_bucket)

创建提示并调用模型

OctankFashion希望将我们之前创建的营销图像带到生活中,变成一个视频。Nova Reel的图像转视频功能是最合适的。

以下参数与使用图像转视频功能相关。这些参数封装在请求主体的textToVideoParams字段中。

  • text(可选) - 描述我们所需视频的文本提示。长度必须在1 - 512个字符之间。
  • images(可选) - 包含一个图像源的列表。

图像源结构应如下所示:

{
    "format": "png" | "jpeg"
    "source": {
        "bytes": string (Base64编码的图像)
    }
}

这是我们将用作视频基础的图像。用作Nova Reel输入的图像必须是1280x720分辨率,与生成的视频分辨率相同。为了获得最佳效果,我们使用的文本提示应该全面描述图像,包括任何我们希望在视频中包含的动作或摄像机运动。

运行下面的单元格以开始生成我们的视频。

# 定义主要输入参数。
input_image_path = "images/tshirt_beach_1280x720.png"  # 必须是1280 x 720
image_format = "png"  # 可以是"png"或"jpeg"

text = "静态摄像机:波浪涌入,沙滩,一个穿着印有棕榈树图案T恤的男人。男人微微移动身体"

seed = 546416566
import json
import base64

# 将输入图像加载为Base64字符串。
with open(input_image_path, "rb") as f:
    input_image_bytes = f.read()
    input_image_base64 = base64.b64encode(input_image_bytes).decode("utf-8")

model_input = {
    "taskType": "TEXT_VIDEO",
    "textToVideoParams": {
        "text": text,
        "images": [{"format": image_format, "source": {"bytes": input_image_base64}}],
    },
    "videoGenerationConfig": {
        "durationSeconds": 6,  # 当前仅支持6秒。
        "fps": 24,  # 当前仅支持24帧。
        "dimension": "1280x720",  # 当前仅支持"1280x720"。
        "seed": seed,  # 可以是0到2147483648之间的任意随机数
    },
}

# 启动异步视频生成作业。
invocation = bedrock_runtime.start_async_invoke(
    modelId="amazon.nova-reel-v1:0",
    modelInput=model_input,
    outputDataConfig={"s3OutputDataConfig": {"s3Uri": f"s3://{s3_destination_bucket}"}},
)

# 以漂亮的格式打印响应JSON。
print("\nResponse:")
print(json.dumps(invocation, indent=2, default=str))

# 保存调用详细信息以供日后参考。有助于调试和反馈。
video_gen_util.save_invocation_info(invocation, model_input)
下载和查看生成的视频

我们在video_gen_util.py脚本中提供了一组实用函数。其中一个函数提供了一种自动下载先前完成的作业并监控正在进行的作业的解决方案。完成的作业将自动下载到"output"文件夹。

from datetime import datetime, timedelta, timezone

# 下载并监控过去N小时内的视频。
duration_hours = 2

from_submit_time = datetime.now(timezone.utc) - timedelta(hours=duration_hours)
video_gen_util.monitor_and_download_videos("output", submit_time_after=from_submit_time)

现在,检查我们的Sagemaker中的output文件夹,我们可以在.mp4格式中查看视频文件。

总结

Amazon Nova Reel的图像转视频功能让我们可以更好地控制生成视频的主题、布局和视觉效果。当我们需要创建一个以真实世界产品或主题为特色的视频时,这是一个完美的选择。