亚马逊AWS官方博客

使用 Amazon Bedrock 和 Amazon Lambda 实现视频字幕无服务器自动翻译

简介

随着全球化进程的加速和数字内容的爆炸式增长,视频字幕的自动化翻译需求呈现出显著增长趋势。不仅大型企业需要这项技术来扩展其国际影响力,越来越多的个人创作者和中小企业也开始寻求高效、经济的字幕翻译解决方案,以便将其内容推广到更广泛的国际受众群体中,尤其是在短剧、电商营销素材等场景。近年来,大语言模型(LLM)在自然语言处理领域取得了突破性进展,相比传统的神经网络翻译方法,LLM 具有更强的泛化能力和处理长文本的优势,能够更好地理解和生成复杂、语义丰富的内容。本文将探讨如何利用 Amazon BedRock 和 Amazon Lambda 构建一个无服务器的视频字幕自动翻译解决方案,该方案不仅能够提供高质量的翻译结果,还能够实现自动化和按需扩展,为用户提供便捷、高效的字幕翻译服务。

相关服务介绍

在这个无服务器自动翻译解决方案中,我们利用了两个关键的 AWS 服务:Amazon Bedrock 和 Amazon Lambda。这两项服务的结合为构建高效、可扩展的视频字幕翻译系统提供了强大的基础。

  • Amazon Bedrock 是一项完全托管的服务,通过单个 API 提供来自 AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI 和 Amazon 等领先人工智能公司的高性能基础模型(FM),以及通过安全性、隐私性和负责任的人工智能构建生成式人工智能应用程序所需的一系列广泛功能。使用 Amazon Bedrock 可以轻松试验和评估适合的热门 FM,通过微调和检索增强生成(RAG)等技术利用企业自有数据对其进行私人定制,并构建使用企业系统和数据来源执行任务的代理。由于 Amazon Bedrock 是无服务器的,因此无需管理任何基础设施,并且可以使用已经熟悉的 AWS 服务将生成式人工智能功能安全地集成和部署到已有的应用程序中。
  • Amazon Lambda 是一项计算服务,无需预配置或管理服务器即可运行代码。借助 Amazon Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,并且不必进行任何管理。Amazon Lambda 在可用性高的计算基础设施上运行代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量预置和自动扩展、代码监控和记录。
  • Amazon Simple Storage Service(Amazon S3)是一种对象存储服务,提供行业领先的可扩展性、数据可用性、安全性和性能。这意味着各种规模和行业的客户都可以使用它来存储和保护各种用例(如网站、移动应用程序、备份和还原、存档、企业应用程序、IoT 设备和大数据分析)的任意数量的数据。
  • srt 格式字幕:srt 的全称是 SubRip Text,是最为流行的文本字幕格式,因为其制作规范简单,一句时间代码+一句字幕,使得制作修改就相当简单。配合上 .style 文件还能让 srt 自带一些字体上的特效等。下图是 srt 格式字幕的一个简单例子。
1
00:00:02,000 --> 00:00:05,000
<i>Welcome to our advanced tutorial</i>
<b>on creating complex SRT files.</b>

2
00:00:06,500 --> 00:00:10,750
Today, we'll explore various formatting options
and timing techniques.

3
00:00:11,000 --> 00:00:15,500
<font color="#FF0000">Let's start with colored text</font>
<font size="24">and different font sizes.</font>

4
00:00:16,000 --> 00:00:20,000
We can also use <u>underline</u> and
<s>strikethrough</s> for emphasis.

5
00:00:21,250 --> 00:00:26,750
Multiple lines of text
can be used for longer dialogues
or explanations.

解决方案整体架构

无服务器自动翻译整体架构图如下所示:

  1. 用户上传视频和原语言的SRT格式的字幕文件到 S3 存储桶;
  2. 监测到 S3 存储桶的事件变化(put object 操作,srt 文件类型),自动触发执行 Lambda 函数;
  3. Lambda 函数做文件处理,调用服务,生成并上传翻译结果;
    1. 对 srt 文件做解析分离字幕文件中的序号,时间戳,文字部分
    2. 定义翻译相关 Prompt,比如指定翻译风格,翻译目标语言
    3. 调用 Amazon Bedrock 服务对字幕文件的文字内容进行翻译
    4. 将翻译结果,以及时间戳合并形成一个目标语言的 srt 字幕文件
    5. 新的字幕文件上传到 S3 存储桶
  4. 用户可以利用原来的视频文件和目标语言的 srt 字幕文件

Lambda 函数关键实现

字幕翻译 Prompt 参考

Prompt 是将 LLM 用于不同使用案例(例如分类、总结、问答等)的“秘诀”。Prompt 可能包括指令、少样本示例,以及适合给定使用案例的特定上下文和问题。以下示例是一个模板,可以借助该模板使用进行字幕翻译,也可以根据自己的要求更改该模版:

system = "You are a skilled television drama subtitle translator proficient in multiple languages, your need to translate subtitles from the original video into the specified language."
prompt = f"""Please follow the rules in translation:
            1. Keep the style of the original film and restore the meaning of the original words.
            2. Avoid "English Chinese" in the translation.
            3. Avoid "wordiness".
            4. The translation should reduce "cultural interference".
            5. Keep sentences as simple as possible.
            6. Maintain consistency with the personal pronoun used in the previous translation. Do not add a personal pronoun even if the grammatical is incorrect.
            Translate text in <subtitles> from <source_lang> into <target_lang>,keep a very authentic and popular tone:
            <subtitles>{text}</subtitles>
            <source_lang>{source_lang}</source_lang> 
            <target_lang>{target_lang}</target_lang>
            Put response only translation result and do not include any extra content.
             """

调用 Amazon Bedrock 对字幕内容进行翻译

在代码中 translate_srt 函数使用 Messages API 调用 Amazon Bedrock 上 Claude 相关系列的模型, 不同模型的 modelId 对应如下,可以根据需要使用不用的模型:

  • Claude 3 Sonnet modelId: anthropic.claude-3-sonnet-20240229-v 1:0
  • Claude 3 Haiku  modelId: anthropic.claude-3-haiku-20240307-v 1:0
  • Claude 3.5 Sonnet modelId: anthropic.claude-3-5-sonnet-20240620-v1:0
message = {"role": "user", "content": [{"type": "text", "text": prompt}]}
messages = [message]

body = json.dumps(
    {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": max_tokens,
        "system": system,
        "messages": messages,
        "temperature": 0.2,
        "top_p": 0.999,
        "top_k": 250
    }
)

response = bedrock.invoke_model(body=body, modelId=model_id)
response_body = json.loads(response.get('body').read())
response_text = response_body['content'][0]['text']

具体步骤

基于 CloudFormation 一键部署相关基础设施

如解决方案整体架构所示,使用 CloudFormation 部署服务时,将新建一个用于存储字幕文件的 S3 桶,以及一个用于部署翻译应用的 Lambda 函数。

1. 创建 CloudFormation 堆栈

Github下载源代码,进入 AWS 控制台选择要部署服务的区域,选择服务 CloudFormation,并选择创建堆栈。

选择从本地上传模版文件,并上传上一步下载的源代码中的文件:video-translate-with-bedrock/deploy/cloudformation.yaml,并点下一步。

为堆栈和创建的 S3 桶命名,S3 桶需要全球唯一,最好加上特殊后缀,比如日期等。

下一步,并最后确认创建 IAM 资源。

2. 查看创建资源

等待资源创建完成,并参考测试章节的部分进行测试。其中 S3 桶的名字为输出中 S3 BucketName 的值,对于 CloudFormation 创建的资源,存放到 S3 桶 input 目录中以 .srt 结尾的文件,都会触发 Lambda 执行翻译任务。此外,此 CloudFormation 还会创建一个以此 S3 桶为源的 Cloudfront,方便后续字幕合成到视频中后可继续使用。

由于视频合成字幕不在本次的讨论范围之内,在此不做讨论,可参考 ffmpeg 命令合成字幕到视频。

3. 进阶(选做)

如果是第一次测试功能的用户,可以跳过这个步骤。对于部分用户,可能有更改功能的要求,比如指定更多语言等,可以修改 Lambda 内的代码实现。更改 Lambda 的代码有两种方式:

  • 在部署后修改代码(推荐,代码格式不容易错)
  • 在 CloudFormation 内修改后部署

以下介绍如何通过不同方式修改代码。

  • 在部署后修改代码(推荐,代码格式不容易错)

1、找到 CloudFormation 运行完后创建的 Lambda 函数

2、将 Lambda 的内容替换为修改后的代码,并保存部署 Lambda

  • 在 CloudFormation 内修改后部署

找到源码 video-translate-with-bedrock/deploy/cloudformation.yaml,修改文件 24 行起的代码即可。

手动部署相关资源

如果希望手动部署相关资源的话可以参考如下步骤:

创建 S3 存储桶

  1. 进入 AWS 控制台进入 S3 服务,创建一个存储桶,并且创建两个文件夹,“input”用于存放视频和源语言字幕文件,“output”用于存放翻译后的目标语言字幕文件。
  1. 在“input”文件夹中再创建两个文件夹,“videos”用于存放视频文件,“subtitles”用于存放源字幕文件。

创建 IAM 角色:每个 Lambda 函数都有一个与之关联的 IAM 角色。此角色定义允许该功能与其进行交互的其他 AWS 服务。

  1. 在 AWS 控制台中进入 IAM 服务,选择创建角色,并选择“Lambda”作为角色类型,在“Permission”中赋予该函数需要交互的两个服务的权限:“TranslateFullAccess” 和 “AmazonS3FullAccess”,最后点击创建角色。

创建并配置 Lambda 函数

  1. 在 AWS 控制台中进入 Lambda 服务,点击“create Function”按钮。选择“从头开始创作”,填写函数名,并且在“Runtime”运行环境中选择“Python3.7”环境,在“执行角色”中选择“使用现有角色”,选择刚刚创建的角色名称,最后点击创建函数。
  1. 在 Lambda 的函数配置页面,点击“Add Trigger”按钮添加触发条件。
  1. 在触发条件配置页面,在“Bucket”下拉列表中选择刚刚创建的存储桶名称,在“Event”下拉列表中选择“Put”,在“Prefix”中输入“input/subtitles”,在“Suffix”中输入“.srt”,然后点击“add”按钮,完成触发条件的添加。该触发条件设置监视刚刚创建存储桶的 input/subtitles 目录中扩展名为 .srt 的文件,如果是 put 操作,将触发该 Lambda 函数。
  1. 对刚创建的 Lambda 函数配置内存的大小和执行超时。在本方案中 Lambda 会下载 SRT 格式的字幕文件到内部中,调用 Translate 翻译后会上传到 S3,然后将内存中的源字幕文件删除。内存分配为默认的 128MB,超时时间设置为 10 分钟。
  1. 上传 Github src/video_translate_lambda.py 或者直接代码到 Lambda 函数中。上传附件中的代码文件或者直接 copy 文件中的代码到 Lambda 函数中。
  1. 可以根据自己的需求更改代码中的 Prompt,指定 Amazon Bedrock 上其他模型,每一次修改 Lambda 函数之后都需要重新部署函数才能生效。

测试

在 AWS 管理控制台点击“S3”服务,打开刚创建的存储桶,进入“input/videos”文件夹,若使用 CloudFormation 部署资源,则先创建文件夹,名字为 “input/videos”。

“Add files”从本地电脑里选择一个视频文件;进入“input/subtitles”文件夹,上传一个srt格式的字幕文件。

此时就会触发我们刚刚创建的 Lambda 函数。Lambda 函数执行完成后,进入到 S3 存储桶的“output/translated-subtitles”文件夹,可以看到翻译后的目标语言字幕文件。

很多播放软件都支持自动加载字幕,需要把字幕文件和原始的视频文件放在同一目录。

总结

本方案利用 Amazon Bedrock 和 Amazon Lambda 构建了一个创新的无服务器视频字幕自动翻译系统。Amazon Bedrock 提供了先进的大语言模型,能够实现高质量的字幕翻译,而 Amazon Lambda 则确保了系统的无服务器架构。这种组合不仅提高了翻译质量,还大大简化了系统的部署和管理。

用户可以轻松地将此解决方案集成到各种应用场景中,如短剧多语言字幕,电商素材出海投放等。无服务器架构意味着用户无需购买、配置或管理任何服务器资源,系统能够根据需求自动扩展,提供高效、经济的翻译服务。此外,该方案的灵活性允许用户根据特定需求进行定制,如利用自有数据微调模型或实现特定领域的专业翻译。总的来说,这个解决方案为视频内容的全球化传播提供了一个强大、便捷的工具,有效地降低了语言障碍,促进了跨文化交流。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。

参考链接

Amazon Bedrock:https://aws.amazon.com/cn/bedrock/

Amazon Lambda:https://docs.aws.amazon.com/zh_cn/lambda/index.html

Amazon S3:https://docs.aws.amazon.com/zh_cn/s3/?id=docs_gateway

Amazon boto3:https://boto3.amazonaws.com/v1/documentation/api/latest/index.html

本篇作者

汪其香

亚马逊云科技解决方案架构师,负责基于亚马逊云科技云服务的架构咨询和设计实现,具有丰富的解决客户实际问题的经验,同时热衷于生成式 AI、深度学习的研究与应用。

海国慧

亚马逊云科技解决方案架构师,负责云计算解决方案的咨询和设计,具有丰富的解决客户实际问题的经验。同时致力于云计算安全、生成式 AI 的应用与推广。