欢迎来到亚马逊 Nova Reel 研讨会! 在这个动手实践环节中,我们将探索亚马逊视频生成基础模型的强大功能。我们将体验到虚构的服装品牌 OctankFashion 如何使用该模型为其营销和广告活动创建视频。
OctankFashion 希望在营销和广告中纳入更多丰富的视频内容。他们发现传统的视频制作既耗时又成本高昂,需要租赁设备、聘请视频制作公司,并为实地拍摄支付差旅费。他们将应用 Nova Reel 来完成以下任务:
通过本次研讨会,我们将:
在本次研讨会中,我们将利用亚马逊 Nova Reel 的以下功能:
先决条件: 请先运行 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 设计了他们的新系列图案 T 恤,非常适合夏季。他们希望创造一个视频资产,能够唤起宁静的日子的感觉,并与他们的服装产生强烈的联系。借助 Nova Reel 的文本到视频功能,我们可以轻松创造任何我们想要的视频。
Nova Reel 支持一种名为 “TEXT_VIDEO” 的任务类型。以下参数与使用该任务类型进行文本到视频相关。该参数封装在请求主体的 textToVideoParams
字段中。
text
(可选) - 描述我们所需视频的文本提示。长度必须在 1 到 512 个字符之间。运行下面的单元格开始生成视频。
# 定义主要输入参数。
text = "fabric shirts ripple in the strong breeze, white collared t-shirts with black palm tree graphics in their centers hang rippling on a clothes line between two real palm trees. Lush greenery in the foreground opens to a beautiful beach and waves in the background. Soft sunlight."
seed = 1841511189
import json
model_input = {
"taskType": "TEXT_VIDEO",
"textToVideoParams": {"text": text},
"videoGenerationConfig": {
"durationSeconds": 6, # 目前只支持 6 秒。
"fps": 24, # 目前只支持 24 帧每秒。
"dimension": "1280x720", # 目前只支持 "1280x720"。
"seed": seed, # 从 0 到 2,147,483,646 的任意数字
},
}
# 启动异步视频生成作业。
invocation = bedrock_runtime.start_async_invoke(
modelId="amazon.nova-reel-v1:0",
modelInput=model_input,
outputDataConfig={"s3OutputDataConfig": {"s3Uri": f"s3://{s3_destination_bucket}"}},
)
# 稍后将使用此内容。
invocation_arn = invocation["invocationArn"]
# 以漂亮的格式打印响应 JSON。
print("\nResponse:")
print(json.dumps(invocation, indent=2, default=str))
# 保存调用详细信息以供日后参考。有助于调试和反馈。
video_gen_util.save_invocation_info(invocation, model_input)
在视频生成过程中,我们可以通过以下两种方式之一检查其状态。
get_async_invoke()
如果我们知道要检查的作业的调用 ARN,可以使用 get_async_invoke()
方法检查作业的状态。运行下面的单元格来检查我们之前启动的作业的状态。
response = bedrock_runtime.get_async_invoke(invocationArn=invocation_arn)
status = response["status"]
print(f"Status: {status}")
# 以漂亮的格式打印 JSON 响应
print("\nFull response:")
print(json.dumps(response, indent=2, default=str))
list_async_invokes()
以下代码演示了如何使用 list_async_invokes()
方法检查我们账户中所有视频生成作业的状态。当我们不知道要检查的作业的调用 ARN,或者想要创建一个列出正在运行、已完成或失败作业的仪表板时,此方法很有用。此方法支持多个参数,允许我们按状态、日期和 maxResults
限制进行过滤。它还支持分页。我们在这个示例中没有展示完整的 API。
invocation = bedrock_runtime.list_async_invokes(
maxResults=10, # (可选)
statusEquals="InProgress", # (可选) 可以是 "Completed"、"InProgress" 或 "Failed"。省略此参数以列出所有作业,不管状态如何。
# 注意: 这里没有演示其他支持的参数。
)
# 以漂亮的格式打印 JSON 响应
print("Invocation Jobs:")
print(json.dumps(invocation, indent=2, default=str))
我们在 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
格式的视频文件。
亚马逊 Nova Reel 的文本到视频功能使任何人都可以轻松、经济高效地从简单的文本提示创造出引人入胜的视频内容。通过使用亚马逊 Bedrock API 的实践经验,我们学会了为现实世界的场景生成引人注目的视觉内容,例如展示时尚商品。现在,要了解如何获得更多对视频输出的控制权,请继续学习 “02-image-to-video.ipynb” 笔记本。