使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。

使用 AWS 机器学习服务将内容本地化为多种语言

在过去几年中,在线教育平台的采用率和对基于视频的学习的需求有所增加,因为它提供了一种吸引学习者的有效媒介。 为了扩展到国际市场并解决文化和语言多样化的人群,企业也在考虑通过将内容本地化为多种语言来实现学习产品的多样化。 这些企业正在寻找可靠且具有成本效益的方法来解决其本地化用例。

内容本地化主要包括将原始声音翻译成新的语言以及添加字幕等视觉辅助工具。 传统上,这个过程成本高昂,需要手动操作,并且需要大量时间,包括与本地化专家合作。 借助 AWS 机器学习 (ML) 服务的强大功能,例如 亚马逊转录, 亚马逊翻译亚马逊波莉,您可以创建一个可行且具有成本效益的本地化解决方案。 您可以使用 Amazon Transcribe 创建现有音频和视频流的脚本,然后使用 Amazon Translate 将此脚本翻译成多种语言。 然后,您可以使用 Amazon Polly(一种文本转语音服务)将翻译后的文本转换为听起来自然的人类语音。

本地化的下一步是为内容添加字幕,这可以提高可访问性和理解性,并帮助观众更好地理解视频。 在视频内容上创建字幕可能具有挑战性,因为翻译后的语音与原始语音时间不匹配。 音频和字幕之间的这种同步是一项需要考虑的关键任务,因为如果他们不同步,它可能会使观众与您的内容断开连接。 Amazon Polly 通过启用 语言符号,您可以使用它来创建可以与生成的语音输出同步的字幕文件。

在这篇文章中,我们回顾了使用 AWS ML 服务的本地化解决方案,我们使用原始英文视频并将其转换为西班牙语。 我们还专注于使用语音标记来创建同步的西班牙语字幕文件。

解决方案概述

下图说明了解决方案体系结构。

该解决方案将视频文件和目标语言设置作为输入,并使用 Amazon Transcribe 创建视频转录。 然后,我们使用 Amazon Translate 将脚本翻译成目标语言。 翻译后的文本作为输入提供给 Amazon Polly,以生成目标语言的音频流和语音标记。 Amazon Polly 回归 语音标记输出 在以行分隔的 JSON 流中,其中包含时间、类型、开始、结束和值等字段。 该值可能会因输入中请求的语音标记类型而异,例如 SMML, 视位、单词或句子。 出于我们示例的目的,我们要求 语音标记类型 as word. 使用此选项,Amazon Polly 将句子分解为句子中的单个单词以及它们在音频流中的开始和结束时间。 使用此元数据,然后处理语音标记以生成由 Amazon Polly 生成的相应音频流的字幕。

最后,我们使用 AWS 元素 MediaConvert 使用翻译后的音频和相应的字幕渲染最终视频。

以下视频演示了解决方案的最终结果:

AWS Step Functions工作流程

我们使用 AWS步骤功能 来协调这个过程。 下图显示了 Step Functions 工作流的高级视图(为了更清楚,图中省略了一些步骤)。

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。

工作流程步骤如下:

  1. 用户将源视频文件上传到 亚马逊简单存储服务 (Amazon S3)存储桶。
  2. S3 事件通知 触发 AWS Lambda 功能 状态机.py (图中未显示),它调用 Step Functions 状态机。
  3. 第一步, 转录音频, 调用 Lambda 函数 转录.py,它使用 Amazon Transcribe 从源视频生成音频的转录本。

以下示例代码演示了如何使用 Amazon Transcribe 创建转录作业 博托3 Python SDK:

response = transcribe.start_transcription_job(
    TranscriptionJobName = jobName,
    MediaFormat=media_format,
    Media = {"MediaFileUri": "s3://"+bucket+"/"+mediaconvert_video_filename},
    OutputBucketName=bucket,
    OutputKey=outputKey,
    IdentifyLanguage=True
)

作业完成后,输出文件将保存到 S3 存储桶中,并且该过程继续到翻译内容的下一步。

  1. 翻译转录 步骤调用 Lambda 函数 翻译.py 它使用 Amazon Translate 将脚本翻译成目标语言。 在这里,我们使用同步/实时翻译 翻译文本 功能:
    # Real-time translation
    response = translate.translate_text(
        Text=transcribe_text,
        SourceLanguageCode=source_language_code,
        TargetLanguageCode=target_language_code,
    )
    

    同步翻译对可以翻译的文件大小有限制; 在撰写本文时,它设置为 5,000 字节。 对于较大的文档大小,请考虑使用异步路径来创建作业 开始_文本_翻译_作业 并通过检查状态 描述文本翻译作业.

  2. 下一步是 Step Functions 并行 state,我们在状态机中创建并行分支。
    1. 在第一个分支中,我们调用 Lambda 函数 Lambda 函数 生成_polly_audio.py 生成我们的 Amazon Polly 音频流:
      # Set up the polly and translate services
      client = boto3.client('polly')
      
      # Use the translated text to create the synthesized speech
      response = client.start_speech_synthesis_task(
                   Engine="standard", LanguageCode="es", OutputFormat="mp3",
                   SampleRate="22050", Text=polly_text, VoiceId="Miguel",
                   TextType="text",
                   OutputS3BucketName="S3-bucket-name",
                   OutputS3KeyPrefix="-polly-recording")
      audio_task_id = response['SynthesisTask']['TaskId']

      这里我们使用 开始语音合成任务 Amazon Polly Python 开发工具包的方法来触发创建 Amazon Polly 音频的语音合成任务。 我们设置 OutputFormatmp3,它告诉 Amazon Polly 为这个 API 调用生成一个音频流。

    2. 在第二个分支中,我们调用 Lambda 函数 生成语音标记.py 生成语音标记输出:
      ....
      # Use the translated text to create the speech marks
      response = client.start_speech_synthesis_task(
                   Engine="standard", LanguageCode="es", OutputFormat="json",
                   SampleRate="22050", Text=polly_text, VoiceId="Miguel",
                   TextType="text", SpeechMarkTypes=['word'],
                   OutputS3BucketName="S3-bucket-name", 
                   OutputS3KeyPrefix="-polly-speech-marks")
      speechmarks_task_id = response['SynthesisTask']['TaskId']

  • 我们再次使用 开始语音合成任务 方法但指定 OutputFormatjson,它告诉 Amazon Polly 为该 API 调用生成语音标记。

在第二个分支的下一步中,我们调用 Lambda 函数 生成字幕.py,它实现了从语音标记输出生成字幕文件的逻辑。

它使用文件中的 Python 模块 webvtt_utils.py. 该模块具有多种实用功能来创建字幕文件; 一种这样的方法 get_phrases_from_speechmarks 负责解析语音标记文件。 语音标记 JSON 结构仅单独提供每个单词的开始时间。 为了创建 SRT 文件所需的字幕时间,我们首先从语音标记文件中的单词列表中创建大约 n(其中 n=10)单词的短语。 然后我们将它们写入 SRT 文件格式,从短语中的第一个单词获取开始时间,对于结束时间,我们使用 (n+1) 个单词的开始时间并将其减 1 以创建序列条目. 以下函数创建短语以准备将它们写入 SRT 文件:

def get_phrases_from_speechmarks(words, transcript):
.....

    for item in items:
        # if it is a new phrase, then get the start_time of the first item
        if n_phrase:
            phrase["start_time"] = get_time_code(words[c]["start_time"])
            n_phrase = False

        else:
            if c == len(words) - 1:
                phrase["end_time"] = get_time_code(words[c]["start_time"])
            else:
                phrase["end_time"] = get_time_code(words[c + 1]["start_time"] - 1)

        # in either case, append the word to the phrase...
        phrase["words"].append(item)
        x += 1

        # now add the phrase to the phrases, generate a new phrase, etc.
        if x == 10 or c == (len(items) - 1):
            # print c, phrase
            if c == (len(items) - 1):
                if phrase["end_time"] == '':
                    start_time = words[c]["start_time"]
                    end_time = int(start_time) + 500
                    phrase["end_time"] = get_time_code(end_time)

            phrases.append(phrase)
            phrase = new_phrase()
            n_phrase = True
            x = 0

        .....

    return phrases

  1. 最后一步, 媒体转换, 调用 Lambda 函数 创建_mediaconvert_job.py 将来自 Amazon Polly 的音频流和字幕文件与源视频文件相结合以生成最终输出文件,然后将其存储在 S3 存储桶中。 这一步使用 MediaConvert,具有广播级功能的基于文件的视频转码服务。 它允许您轻松创建视频点播内容,并将高级视频和音频功能与简单的 Web 界面相结合。 这里我们再次使用 Python 博托3 SDK 创建一个 MediaConvert 工作:
    ……
    job_metadata = {'asset_id': asset_id, 'application': "createMediaConvertJob"}
    mc_client = boto3.client('mediaconvert', region_name=region)
    endpoints = mc_client.describe_endpoints()
    mc_endpoint_url = endpoints['Endpoints'][0]['Url']
    
    mc = boto3.client('mediaconvert', region_name=region, endpoint_url=mc_endpoint_url, verify=True)
    
    mc.create_job(Role=mediaconvert_role_arn, UserMetadata=job_metadata, Settings=mc_data["Settings"])

先决条件

在开始之前,您必须具备以下先决条件:

部署解决方案

要使用 AWS CDK 部署解决方案,请完成以下步骤:

  1. 克隆 知识库:
    git clone https://github.com/aws-samples/localize-content-using-aws-ml-services.git 

  2. 确保 AWS CDK 是 自举, 运行命令 cdk bootstrap 从存储库的根目录:
    $ cdk bootstrap
    ⏳ Bootstrapping environment aws://<acct#>/<region>...
    Trusted accounts for deployment: (none)
    Trusted accounts for lookup: (none)
    Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
    ✅ Environment aws://<acct#>/<region> bootstrapped (no changes).

  3. 将工作目录更改为存储库的根目录并运行以下命令:
    cdk deploy

默认情况下,目标音频设置设置为美国西班牙语 (es-US)。 如果您打算使用不同的目标语言对其进行测试,请使用以下命令:

cdk deploy --parameters pollyLanguageCode=<pollyLanguageCode> 
           --parameters pollyVoiceId=<pollyVoiceId>
           --parameters pollyEngine=<pollyEngine> 
           --parameters mediaConvertLangShort=<mediaConvertLangShort>
           --parameters mediaConvertLangLong=<mediaConvertLangLong>
           --parameters targetLanguageCode=<targetLanguageCode>

该过程需要几分钟才能完成,之后会显示一个链接,您可以使用该链接查看带有翻译音频和翻译字幕的目标视频文件。

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。

测试解决方案

为了测试这个解决方案,我们使用了以下的一小部分 AWS re:Invent 2017 视频 来自 YouTube,首次引入 Amazon Transcribe。 您还可以使用自己的视频测试解决方案。 我们测试视频的原始语言是英语。 部署此解决方案时,您可以指定目标音频设置,也可以使用默认目标音频设置,该设置使用西班牙语生成音频和字幕。 该解决方案创建一个可用于将视频文件上传到的 S3 存储桶。

  1. 在 Amazon S3 控制台上,导航到存储桶 PollyBlogBucket.
    使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。
  2. 选择存储桶,导航到 /inputVideo 目录,并上传视频文件(该解决方案以mp4类型的视频进行测试)。 此时,S3 事件通知触发 Lambda 函数,该函数启动状态机。
  3. 在 Step Functions 控制台上,浏览到状态机 (ProcessAudioWithSubtitles).
  4. 选择状态机的运行之一来定位 图形检查器.

这显示了每个状态的运行结果。 Step Functions 工作流程需要几分钟才能完成,之后您可以验证是否所有步骤都已成功完成。

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。

查看输出

要查看输出,请打开 Amazon S3 控制台并检查音频文件 (.mp3) 和语音标记文件 (.marks) 是否存储在 S3 存储桶中 <ROOT_S3_BUCKET>/<UID>/synthesisOutput/.

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。

以下是从翻译文本生成的语音标记文件示例:

{"time":6,"type":"word","start":2,"end":6,"value":"Qué"}
{"time":109,"type":"word","start":7,"end":10,"value":"tal"}
{"time":347,"type":"word","start":11,"end":13,"value":"el"}
{"time":453,"type":"word","start":14,"end":20,"value":"idioma"}
{"time":1351,"type":"word","start":22,"end":24,"value":"Ya"}
{"time":1517,"type":"word","start":25,"end":30,"value":"sabes"}
{"time":2240,"type":"word","start":32,"end":38,"value":"hablé"}
{"time":2495,"type":"word","start":39,"end":44,"value":"antes"}
{"time":2832,"type":"word","start":45,"end":50,"value":"sobre"}
{"time":3125,"type":"word","start":51,"end":53,"value":"el"}
{"time":3227,"type":"word","start":54,"end":59,"value":"hecho"}
{"time":3464,"type":"word","start":60,"end":62,"value":"de"}

在此输出中,文本的每个部分都按照语音标记进行了细分:

  • – 从相应音频流开始的时间戳(以毫秒为单位)
  • 类型 – 语音标记的类型(句子、单词、视位或 SSML)
  • 开始 – 输入文本中对象开头的字节偏移量(不是字符)(不包括视位标记)
  • 结束 – 输入文本中对象结尾的字节偏移量(不是字符)(不包括视位标记)
  • 折扣值 – 句子中的单个单词

生成的字幕文件被写回 S3 存储桶。 你可以在下面找到文件 <ROOT_S3_BUCKET>/<UID>/subtitlesOutput/. 检查字幕文件; 内容应类似于以下文本:

1
00:00:00,006 --> 00:00:03,226
¿Qué tal el idioma? Ya sabes, hablé antes sobre el

2
00:00:03,227 --> 00:00:06,065
hecho de que el año pasado lanzamos Polly y Lex,

3
00:00:06,066 --> 00:00:09,263
pero hay muchas otras cosas que los constructores quieren hacer

4
00:00:09,264 --> 00:00:11,642
con el lenguaje. Y una de las cosas que ha

5
00:00:11,643 --> 00:00:14,549
sido interesante es que ahora hay tantos datos que están

生成字幕文件和音频文件后,使用 MediaConvert 创建最终的源视频文件。 检查 MediaConvert 控制台以验证作业状态是否为 COMPLETE.

MediaConvert 作业完成后,将生成最终视频文件并保存回 S3 存储桶,可在 <ROOT_S3_BUCKET>/<UID>/convertedAV/.

作为此部署的一部分,最终视频通过 亚马逊的CloudFront的 (CDN) 链接并显示在终端或 AWS CloudFormation 安慰。

在浏览器中打开 URL 以查看带有音频和字幕附加选项的原始视频。 您可以验证翻译的音频和字幕是否同步。

结论

在这篇文章中,我们讨论了如何在不需要人工干预的情况下创建视频文件的新语言版本。 内容创建者可以使用此过程来同步其视频的音频和字幕并覆盖全球观众。

您可以轻松地将这种方法集成到您自己的生产管道中,以根据您的需要处理大量和扩展。 Amazon Polly 使用 神经 TTS (NTTS) 产生自然和类似人类的文本到语音的声音。 它还支持 从 SSML 生成语音,这使您可以更好地控制 Amazon Polly 如何根据提供的文本生成语音。 Amazon Polly 还提供了一个 各种不同的声音 以多种语言支持您的需求。

通过访问开始使用 AWS 机器学习服务 产品页面,或参考 亚马逊机器学习解决方案实验室 您可以在该页面与专家合作,为您的组织带来机器学习解决方案。

额外的资源

有关此解决方案中使用的服务的更多信息,请参阅以下内容:


关于作者

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。 里根罗萨里奥 在 AWS 担任解决方案架构师,专注于教育技术公司。 他喜欢帮助客户在 AWS 云中构建可扩展、高度可用且安全的解决方案。 他在各种技术角色中拥有十多年的工作经验,专注于软件工程和架构。

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。阿尼尔·科达利 是 Amazon Web Services 的解决方案架构师。 他与 AWS EdTech 客户合作,指导他们使用架构最佳实践将现有工作负载迁移到云,并采用云优先方法设计新工作负载。 在加入 AWS 之前,他曾与大型零售商合作,帮助他们进行云迁移。

使用 AWS 机器学习服务 PlatoBlockchain Data Intelligence 将内容本地化为多种语言。 垂直搜索。 哎。普拉萨纳·萨拉斯瓦蒂·克里希南 是 Amazon Web Services 的解决方案架构师,与 EdTech 客户合作。 他帮助他们使用最佳实践来推动他们的云架构和数据战略。 他的背景是分布式计算、大数据分析和数据工程。 他热衷于机器学习和自然语言处理。

时间戳记:

更多来自 AWS机器学习