利用 Google Cloud AI 产品为视频增加翻译字幕

作者:MeshCloud CSM 高现起

引言

一个外企客户手里有一些英文视频,为了更好的服务国内客户,希望把这些英文视频加上中文字幕,以方便国内客户的观看。因为已经大量使用了 Google Cloud 的产品,希望探索和使用 Google Cloud AI 产品来完成为视频增加中文字幕。

该文档同样适用于为中文视频添加英语字幕等一种语言的视频添加其他语种的字幕场景,目前支持100多种语言相互翻译。

目标

利用 Google Cloud AI 等产品为视频增加翻译字幕

工作流程

以英文视频转为中文字幕视频为例:

英文视频–》提前英文音轨–》提取英文文本(使用 Cloud Speech API)–》翻译中文文本(使用 Cloud Translation API)–》生成中文字幕文件–》合成中文字幕的英语视频

利用 Google Cloud AI 产品为视频增加翻译字幕

详细流程:

  1. 从视频自动提取音轨,自动检测音频采样率和声道数量
  2. 利用谷歌云 Speech-to-Text API将音频转译成文本,并加入字幕时间戳
  3. 利用谷歌云 Translation API将文本翻译为指定语言
  4. 转换文本为字幕格式
  5. 把字幕硬编码进视频中
  6. 无服务器方案,使用 Google Cloud Run,免去设置服务器和扩展的麻烦

系统架构

利用 Google Cloud AI 产品为视频增加翻译字幕

使用到的 Google Cloud 产品

  • Cloud Speech API — 语音转换成文本
  • Cloud Translation API — 翻译
  • Cloud Run — 无服务计算
  • Pub/Sub — 全球消息队列
  • Cloud Storage — 对象存储
  • IAM — 身份与认证

实施步骤

您可以在 Cloud Shell 或您自己的 PC 中使用 gcloud 命令执行以下命令

0.前置请求

您需要启用Speech API、Cloud Run API、Translate API、Pubsub API、Eventarc API,如果您还没有启用的话。

gcloud services enable 
    speech.googleapis.com 
    translate.googleapis.com 
    run.googleapis.com 
    pubsub.googleapis.com 
    eventarc.googleapis.com

确认执行程序所需的IAM服务账号,需要权限至少包括:GCS读写,Speech-to-Text API, Translation API。或使用默认的 compute 服务账号,自带有整个项目的 Edit 权限。

利用 Google Cloud AI 产品为视频增加翻译字幕
利用 Google Cloud AI 产品为视频增加翻译字幕

1.下载代码并部署到 Cloud Run 服务

git clone https://github.com/OrganizationBin/trans_video_subs
cd trans_video_subs/Serverless
gcloud run deploy <CLOUD-RUN-NAME> --source . 
    --concurrency=1 
    --memory=1024Mi 
    --ingress=internal 
    --timeout=600 
    --no-allow-unauthenticated 
    --service-account=<SERVICE-ACCOUNT@PROJECT.iam.gserviceaccount.com> 
    --set-env-vars=video_src_language_code=en-US 
    --set-env-vars=translate_src_code=en 
    --set-env-vars=translate_des_code=zh 
    --set-env-vars=merge_sub_to_video=False 
    --set-env-vars=two_step_convert=False

此命令将自动构建容器并部署到 Cloud Run。请记住将 CLOUD-RUN-NAME 和SERVICE-ACCOUNT@
PROJECT.iam.gserviceaccount.com替换为您自己的。您可以根据视频大小调整内存和超时。

以下是环境变量说明:

  • video_src_language:视频语言代码。参考 Speech-to-Text API 语言代码文档
  • translate_src_language:源语言代码。参考 Translate API 语言代码文档
  • translate_des_language :目标语言代码。参考 Translate API 语言代码文档
  • merge_sub_to_video:True 表示自动将 srt 字幕硬编码成 Video,同时输出 srt 字幕文件。false 表示只输出 srt 字幕文件。

2.为上传视频创建GCS Bucket,请选择单地域Bucket。

gsutil mb -l us-central1 gs://<MY-BUCKET-NAME>

3.从 GCS Bucket 触发器创建 Eventarc 到 Cloud Run。

注意:部署eventarc trigger时,如果报ERROR类似这样:

service-xxxxxxxxxx@gs-project-accounts.iam.gserviceaccount.com has no permission to publish messages to pubsub topic

那么你需要去控制台IAM添加使用 pubsub publish 对该特定帐户的权限。

gcloud eventarc triggers create <TRIGGER-NAME> 
    --location=us-central1 
    --destination-run-service=<CLOUD-RUN-NAME> 
    --destination-run-region=us-central1 
    --event-filters="type=google.cloud.storage.object.v1.finalized" 
    --event-filters="bucket=<MY-BUCKET-NAME>" 
    --service-account=<SERVICE-ACCOUNT@PROJECT.iam.gserviceaccount.com>

4.上传视频,并验证结果

将视频上传到 Cloud Storage,即您刚刚创建的存储桶 gs://MY-BUCKET-NAME。

几分钟后,您可以从输出存储桶 gs://MY-BUCKET-NAME-out 下载 srt 字幕文件。

或者,如果您在 Cloud Run 环境变量中将 merge_sub_to_video 设置为 True,则可以下载带有编码字幕的视频 mp4。

注意事项

  • 这种 Serverless 解决方案可以弹性处理短视频。Cloud Run 最多可以运行 60 分钟。但是,如果您的视频处理时间超过 10 分钟,那么 Pub/sub 将在确认截止日期前超时。因此,您需要将这一 Cloud Run 服务的多个步骤分离为多个 Cloud Run 服务,并且不要等待 Cloud Run 代码中的 API 响应。这使得该架构解耦并节省成本。像这样: GCS 触发器 -> CloudRun 1 视频到音频 -> 语音 API -> GCS 触发器 -> CloudRun 2 合并格式 -> 翻译 API -> GCS 触发器 -> CloudRun 3 合并 srt 格式 -> GCS 触发器 -> (可选) CloudRun 4 将 srt 编码为视频 -> GCS 最终结果
  • 最大 Cloud Run 内存设置为 8GB,如果您的视频大于此,请选择此解决方案的 Server(VM) 分支。
  • 所有视频文件直接上传到GCS存储桶,并且没有子目录。本工具暂时不支持子目录,会在后续版本提供。
  • 对于文件名有特殊字符的,本工具会自动把GCS上的原文件改名后再开始后续处理,特殊字符修改为下划线 _。特殊字符包括 / : * ? ” < > | [] ‘ @

参考资料

  1. https://www.bilibili.com/video/BV1Bf4y1w7v3/
  2. https://github.com/OrganizationBin/trans_video_subs

发表评论

您的电子邮箱地址不会被公开。