你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

如何使用视频翻译

注意

此功能目前处于公开预览状态。 此预览版未提供服务级别协议,不建议将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

本文介绍如何在工作室中使用 Azure AI 语音视频翻译。

只需一个原始视频即可开始使用。 查看视频翻译是否支持你的语言区域

创建一个视频翻译项目

要创建视频翻译项目,请执行以下步骤:

  1. 登录 Speech Studio

  2. 选择要使用的订阅和语音资源。

  3. 选择“视频翻译”

  4. 在“创建和管理项目”页上,选择“创建项目”。

  5. 在“新建项目”页上,选择“语音类型”。

    在新项目页上选择语音类型的屏幕截图。

    对于“声音类型”,可以选择“预生成的神经网络声音”或“个人声音”。 对于预生成的神经网络声音,系统通过将视频中的说话人声音与预生成的声音匹配,自动选择最合适的预生成语音。 系统针对个人语音提供了一种模型,该模型只需几秒即可生成高质量的语音副本。

    注意

    要使用个人声音,需要申请访问权限

  6. 通过拖放视频文件或手动选择文件来上传视频文件。

    在新项目页中上传视频文件的屏幕截图。

    确保视频采用 .mp4 格式、小于 500 MB 且短于 60 分钟。

  7. 提供“项目名称”,然后选择“说话人数”、“视频语言”、“翻译为”语言”。

    在新项目页中提供视频信息的屏幕截图。

    如果要使用自己的字幕文件,请选择“添加字幕文件”。 可以选择上传源字幕文件或目标字幕文件。 字幕文件可以采用 WebVTT 或 JSON 格式。 可以通过选择“下载示例 VTT 文件”来下载示例 VTT 文件以供参考。

    在新项目页上添加字幕文件的屏幕截图。

  8. 查看定价信息和行为准则后,继续创建项目。

    上传完成后,可以在项目选项卡上检查处理状态。

    创建项目后,可以选择该项目以查看详细设置,并根据偏好进行调整。

查看并调整声音设置

在“项目详细信息”页上,该项目在“视频”下提供“翻译”和“原始”这两个选项卡,并支持并排比较

在视频右侧,可以查看原始脚本和翻译后的脚本。 如果将鼠标悬停在原始脚本的各个部分上,会使视频自动跳转到原始视频的相应片段,如果将鼠标悬停在已翻译脚本的各个部分上,会使视频跳转到相应的已翻译片段。

还可以根据需要添加或移除片段。 如果要添加片段,请确保新片段的时间戳不与上一个和下一个片段重叠,且片段结束时间应大于开始时间。 时间戳的正确格式应为 hh:mm:ss.ms。 否则,无法应用更改。

可以使用视频下方的音频波形直接调整脚本的时间范围。 选择“应用更改”后,将会应用调整。

如果遇到声音名称为“无法识别”的片段,可能是因为系统无法准确检测声音,尤其是在说话人声音重叠的情况下。 在这种情况下,建议手动更改声音名称。

声音名称为“无法识别”的一个片段的屏幕截图。

如果要调整声音,请选择“声音设置”进行一些更改。 在“声音设置”页上,可以调整声音类型、性别和声音。 选择“声音”右侧的声音示例以确定所选的声音。 如果发现没有声音,可以通过选择“添加说话人”来添加新的声音名称。 更改设置后,选择“更新”

在声音设置页上调整声音设置的屏幕截图。

如果多次进行更改但尚未完成,只需选择“保存”即可保存所做的更改。 进行所有更改后,选择“应用更改”将其应用到视频。 只有在选择“应用更改”后,才会向你收费

进行所有更改后选择“应用更改”按钮的屏幕截图。

可以通过选择“新语言”将原始视频翻译为新语言。 在“翻译”页上,可以选择新的翻译语言和声音类型。 翻译好视频文件后,系统将自动创建一个新项目。

视频翻译 REST API 有助于将视频翻译无缝集成到应用程序中。 它支持上传、管理和优化视频翻译,并多次迭代进行持续改进。 本文介绍如何通过 REST API 使用视频翻译。

此图高度概括了该工作流。

视频翻译 API 工作流示意图。

可使用以下 REST API 操作进行视频翻译:

操作 方法 REST API 调用
创建翻译 PUT /translations/{translationId}
列出翻译 GET /translations
按翻译 ID 获取翻译 GET /translations/{translationId}
创建迭代 PUT /translations/{translationId}/iterations/{iterationId}
列出迭代 GET /translations/{translationId}/iterations
按迭代 ID 获取迭代 GET /translations/{translationId}/iterations/{iterationId}
按操作 ID 获取操作 GET /operations/{operationId}
按翻译 ID 删除翻译 DELETE /translations/{translationId}

有关代码示例,请参阅 GitHub

本文概述了 API 过程的主要步骤,包括创建翻译、创建迭代、检查每个操作的状态、按迭代 ID 获取迭代,以及按翻译 ID 删除翻译。 有关完整详细信息,请参阅表中每个 API 对应的链接。

创建翻译

要提交视频翻译请求,需要按照以下说明构造 HTTP PUT 请求路径和正文:

  • 指定 Operation-Id:每个操作的 Operation-Id 必须是唯一的。 它可确保单独跟踪每个操作。 将 [operationId] 替换为操作 ID。

  • 指定 translationIdtranslationId 必须是唯一的。 将 [translationId] 替换为翻译 ID。

  • 设置所需的输入:包括详细信息,例如 sourceLocaletargetLocalevoiceKindvideoFileUrl。 确保具有来自 Azure Blob 存储的视频 URL。 有关视频翻译支持的语言,请参阅支持的源语言和目标语言。 可以将 voiceKind 参数设置为 PlatformVoicePersonalVoice。 对于 PlatformVoice,系统通过将视频中的说话人声音与预生成的声音匹配,自动选择最合适的预生成语音。 系统针对 PersonalVoice 提供了一种模型,该模型只需几秒即可生成高质量的语音副本。

    注意

    要使用个人声音,需要申请访问权限

  • [YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域。

创建翻译不会启动翻译过程。 可以通过创建迭代来开始翻译视频。 下面是 Windows shell 示例。 如果 URL 包含 &,请确保使用 ^&& 进行转义。 在以下示例代码中,我们将使用公共视频 URL,欢迎将其用于你自己的测试。

curl -v -X PUT -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" -H "Operation-Id: [operationId]" -H "Content-Type: application/json" -d "{\"displayName\": \"[YourDisplayName]\",\"description\": \"[OptionalYourDescription]\",\"input\": {\"sourceLocale\": \"[VideoSourceLocale]\",\"targetLocale\": \"[TranslationTargetLocale]\",\"voiceKind\": \"[PlatformVoice/PersonalVoice]\",\"speakerCount\": [OptionalVideoSpeakerCount],\"subtitleMaxCharCountPerSegment\": [OptionalYourPreferredSubtitleMaxCharCountPerSegment],\"exportSubtitleInVideo\": [Optional true/false],\"videoFileUrl\": \"https://speechstudioprodpublicsa.blob.core.windows.net/ttsvoice/VideoTranslation/PublicDoc/SampleData/es-ES-TryOutOriginal.mp4\"}}" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations/[translationId]?api-version=2024-05-20-preview" 

重要

通过 API 创建的数据不会显示在 Speech Studio 中,并且 API 与 Speech Studio 之间的数据不会同步。

你应该会收到以下格式的响应正文:

{
  "input": {
    "sourceLocale": "zh-CN",
    "targetLocale": "en-US",
    "voiceKind": "PlatformVoice",
    "speakerCount": 1,
    "subtitleMaxCharCountPerSegment": 30,
    "exportSubtitleInVideo": true
  },
  "status": "NotStarted",
  "lastActionDateTime": "2024-09-20T06:25:05.058Z",
  "id": "mytranslation0920",
  "displayName": "demo",
  "description": "for testing",
  "createdDateTime": "2024-09-20T06:25:05.058Z"
}

status 属性应从 NotStarted 状态发展为 Running,最后变更为 SucceededFailed。 可定期调用按操作 ID 获取操作 API,直到返回 SucceededFailed 状态。 通过此操作可监视翻译创建过程的进度。

按操作 ID 获取操作

按特定操作的 ID 检查该操作的状态。 操作 ID 对于每个操作都是唯一的,因此可以单独跟踪每个操作。

[YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域,将 [operationId] 替换为要检查的操作 ID。

curl -v -X GET -H "Ocp-Apim-Subscription-Key:[YourResourceKey]" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/operations/[operationId]?api-version=2024-05-20-preview" 

你应该会收到以下格式的响应正文:

{
  "id": "createtranslation0920-1",
  "status": "Running"
}

创建迭代

要开始翻译视频或更新现有翻译的迭代,需要按照以下说明构造 HTTP PUT 请求路径和正文:

  • 指定 Operation-Id:每个操作(例如创建每次迭代)的 Operation-Id 必须是唯一的。 将 [operationId] 替换为此操作的唯一 ID。
  • 指定 translationId:如果在单个翻译下执行多个迭代,则翻译 ID 保持不变。
  • 指定 iterationId:每个操作的 iterationId 必须是唯一的。 将 [iterationId] 替换为迭代 ID。
  • 设置所需的输入:包括详细信息,例如 speakerCountsubtitleMaxCharCountPerSegmentexportSubtitleInVideowebvttFile。 默认情况下,输出视频中没有嵌入字幕。
  • [YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域。

下面是 Windows shell 示例。 如果 URL 包含 &,请确保使用 ^&& 进行转义。

curl -v -X PUT -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" -H "Operation-Id: [operationId]"  -H "Content-Type: application/json" -d "{\"input\": {\"speakerCount\": [OptionalVideoSpeakerCount],\"subtitleMaxCharCountPerSegment\": [OptionalYourPreferredSubtitleMaxCharCountPerSegment],\"exportSubtitleInVideo\": [Optional true/false],\"webvttFile\": {\"Kind\": \"[SourceLocaleSubtitle/TargetLocaleSubtitle/MetadataJson]\", \"url\": \"[AzureBlobUrlWithSas]\"}}}" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations/[translationId]/iterations/[iterationId]?api-version=2024-05-20-preview"  

注意

创建迭代时,如果已在创建翻译期间指定可选参数 speakerCountsubtitleMaxCharCountPerSegmentexportSubtitleInVideo,则无需再次指定这些参数。 这些值将从翻译设置中继承。 创建迭代时定义这些参数后,新值将替代原始设置。

创建第一次迭代时不需要 webvttFile 参数。 但是,从第二次迭代开始,必须在迭代过程中指定 webvttFile 参数。 需要下载 webvtt 文件,进行必要的编辑,然后将其上传到 Azure Blob 存储。 需要在 curl 代码中指定 Blob URL。

通过 API 创建的数据不会显示在 Speech Studio 中,并且 API 与 Speech Studio 之间的数据不会同步。

字幕文件可以采用 WebVTT 或 JSON 格式。 如果不确定如何准备 WebVTT 文件,请参阅以下示例格式。


00:00:01.010 --> 00:00:06.030
Hello this is a sample subtitle.

00:00:07.030 --> 00:00:09.030
Hello this is a sample subtitle.

你应该会收到以下格式的响应正文:

{
  "input": {
    "speakerCount": 1,
    "subtitleMaxCharCountPerSegment": 30,
    "exportSubtitleInVideo": true
  },
  "status": "Not Started",
  "lastActionDateTime": "2024-09-20T06:31:53.760Z",
  "id": "firstiteration0920",
  "createdDateTime": "2024-09-20T06:31:53.760Z"
}

可以使用所指定的 operationId 并定期调用按操作 ID 获取操作 API,直到返回 SucceededFailed 状态。 通过此操作可监视迭代创建过程的进度。

按迭代 ID 获取迭代

若要按特定迭代的 ID 检索该迭代的详细信息,请使用 HTTP GET 请求。 将 [YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域,将 [translationId] 替换为要检查的翻译 ID,将 [iterationId] 替换为要检查的迭代 ID。

curl -v -X GET -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations/[translationId]/iterations/[iterationId]?api-version=2024-05-20-preview"  

你应该会收到以下格式的响应正文:

{
  "input": {
    "speaker Count": 1,
    "subtitleMaxCharCountPerSegment": 30,
    "exportSubtitleInVideo": true
  },
  "result": {
    "translatedVideoFileUrl": "https://xxx.blob.core.windows.net/container1/video.mp4?sv=2023-01-03&st=2024-05-20T08%3A27%3A15Z&se=2024-05-21T08%3A27%3A15Z&sr=b&sp=r&sig=xxx",
    "sourceLocaleSubtitleWebvttFileUrl": "https://xxx.blob.core.windows.net/container1/sourceLocale.vtt?sv=2023-01-03&st=2024-05-20T08%3A27%3A15Z&se=2024-05-21T08%3A27%3A15Z&sr=b&sp=r&sig=xxx",
    "targetLocaleSubtitleWebvttFileUrl": "https://xxx.blob.core.windows.net/container1/targetLocale.vtt?sv=2023-01-03&st=2024-05-20T08%3A27%3A15Z&se=2024-05-21T08%3A27%3A15Z&sr=b&sp=r&sig=xxx",
    "metadataJsonWebvttFileUrl": "https://xxx.blob.core.windows.net/container1/metadataJsonLocale.vtt?sv=2023-01-03&st=2024-05-20T08%3A27%3A15Z&se=2024-05-21T08%3A27%3A15Z&sr=b&sp=r&sig=xxx"
  },
  "status": "Succeeded",
  "lastActionDateTime": "2024-09-20T06:32:59.933Z",
  "id": "firstiteration0920",
  "createdDateTime": "2024-09-20T06:31:53.760Z"
}

按翻译 ID 删除翻译

删除由 translationId 标识的特定翻译。 此操作还会删除与此翻译关联的所有迭代。 将 [YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域,将 [translationId] 替换为要删除的翻译 ID。 如果未手动删除,服务会将翻译历史记录保留最多 31 天。

curl -v -X DELETE -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations/[translationId]?api-version=2024-05-20-preview" 

如果删除请求成功,则响应头包含 HTTP/1.1 204 No Content

其他信息

本部分为上面未详细介绍的其他 API 调用提供了 curl 命令。 可使用以下命令探索每个 API。

列出翻译

若要列出已在资源帐户中上传和处理的所有视频翻译,请发出 HTTP GET 请求,如以下示例所示。 将 YourResourceKey 替换为语音资源密钥,将 YourSpeechRegion 替换为语音资源区域。

curl -v -X GET -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations?api-version=2024-05-20-preview"

按翻译 ID 获取翻译

此操作会检索由唯一 translationId 标识的特定翻译的详细信息。 将 [YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域,将 [translationId] 替换为要检查的翻译 ID。

curl -v -X GET -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations/[translationId]?api-version=2024-05-20-preview" 

列出迭代

列出特定翻译的所有迭代。 此请求会列出所有迭代,但不提供详细信息。 将 [YourResourceKey] 替换为语音资源密钥,将 [YourSpeechRegion] 替换为语音资源区域,将 [translationId] 替换为要检查的翻译 ID。

curl -v -X GET -H "Ocp-Apim-Subscription-Key: [YourResourceKey]" "https://[YourSpeechRegion].api.cognitive.microsoft.com/videotranslation/translations/[translationId]/iterations?api-version=2024-05-20-preview"  

HTTP 状态代码

本部分详细介绍来自视频翻译 REST API 的 HTTP 响应代码和消息。

HTTP 200 OK

"HTTP 200 OK" 表示请求成功。

HTTP 204 错误

“HTTP 204 错误" 指示请求成功,但资源不存在。 例如:

  • 你尝试获取或删除不存在的翻译。
  • 你已成功删除翻译。

HTTP 400 错误

下面是可能导致 400 错误的示例:

  • 指定的源或目标区域设置不在支持的区域设置中。
  • 你尝试使用 F0 语音资源,但该区域仅支持(标准)语音资源定价层。

HTTP 500 错误

"HTTP 500 内部服务器错误" 指示请求失败。 响应正文包含错误消息。