使用 Dataflow、Pub/Sub 和 Speech-to-Text API 进行实时字幕媒体剪辑

;

了解如何在 Dataflow 流水线中使用 Speech-to-Text API,为音频或视频剪辑创建实时 WebVTT 字幕。

本教程介绍如何使用通过使用 Dataflow 从 Speech-to-Text API 自动提取 WebVTT 字幕参考实现中提供的 Dataflow 柔性模板,解决实时创建 WebVTT 字幕的几个常见难题。这些难题包括:

  • 创建字幕时最大限度地缩短延迟时间。
  • 为每个字幕构建开始和结束时间偏移。
  • 指定生成每个字幕的时长上限。

本教程面向开发者,并假定您对 Dataflow 流水线有着基本了解。

架构

本教程基于 GitHub 上的“通过使用 Dataflow 从 Speech-to-Text API 自动提取 WebVTT 字幕”参考实现。参考实现的工作原理如下:

  1. 媒体剪辑会上传到 Cloud Storage 存储分区。将对象添加到存储分区会导致消息发送到 Pub/Sub 主题。
  2. Dataflow 流水线订阅了该 Pub/Sub 主题。消息的传递会触发它检索和处理媒体剪辑。
  3. 流水线处理媒体剪辑。它首先调用 Speech-to-Text API 以从媒体文件中获取音频文本转录,然后通过该转录内容构建字幕。
  4. 流水线以 WebVTT 格式输出字幕,并将其发布到 Pub/Sub 主题。

此参考实施最适合较小的媒体文件。我们建议文件大小不超过 5 MB。

下图说明了参考实现的架构:

显示媒体转录解决方案架构的图表。

数据处理设计决策

运行 Dataflow 流水线时,您需要使用公开托管的柔性模板,该模板会从参考实现中调用 Java 代码。该代码会根据 Speech-to-Text API 返回的结果构建字幕。此代码中的关键设计决策如下:

  • 代码使用 Speech-to-Text API 的流式识别方法处理剪辑。此方法不仅提供最终结果,还可提供临时结果,并且临时结果质量较差,但速度会更快。参考实现中的代码会处理临时结果,这可减少接收剪辑和生成字幕之间的延迟时间。
  • 临时结果中返回的转录文字必须满足稳定性栏才能得到处理。临时结果的稳定值的范围为 0.0(表示完全不稳定)到 1.0(表示完全稳定性)。默认情况下,稳定性栏设置为 0.8,但在运行流水线时,您可以使用 --stabilityThreshold 参数对其进行更改。
  • 由于临时结果未完全处理,因此转录可能包含低稳定性和重叠的短语。如需了解其外观,请参阅 StreamingRecognizeResponse 示例。

    为处理这种情况,代码会根据由 --wordCount 参数指定的字数统计,将结果分为字幕。然后,它使用 Apache Beam Timer API 来将每个字幕与先前字幕进行比较,并跳过已显示的字词。如需查看实现此逻辑的代码,请参阅 @ProcessElement

    通过使代码评估和比较较小的字幕,较低的 --wordCount 值可提升流水线性能。--wordCount 默认设置为 10。

  • 使用 StreamingRecognitionResult 对象的 result_end_time 字段构造每个字幕的开始时间和结束时间偏移量。从 00:00 开始,代码用于跟踪处理的每个字幕的 result_end_time,并将其用作以下字幕的开始时间。

目标

  • 创建 Cloud Storage 存储分区、Pub/Sub 主题和 Cloud Storage 的 Pub/Sub 通知以关联这些存储分区。这些资源共同创建了将媒体文件馈送至流水线进行处理的机制。
  • 创建并运行 Dataflow 流水线,该流水线会利用媒体剪辑、通过 Speech-to-Text API 处理文本转录,然后通过这些转录内容创建 WebVTT 格式的字幕。
  • 将 WebVTT 字幕发布到 Pub/Sub 主题。

费用

本教程使用 Google Cloud 的以下收费组件:

  • Cloud Storage
  • Dataflow
  • Pub/Sub
  • Speech-to-Text API

请使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Cloud Storage, Dataflow, Pub/Sub, and the Speech-to-Text API API。

    启用 API

设置环境变量

为本教程中使用的项目和区域设置环境变量。

  1. 激活 Cloud Shell
  2. 在 Cloud Shell 中,运行以下命令以设置项目和区域的环境变量。将 myProject 替换为您用于完成本教程的项目的 ID:

    export PROJECT=myProject
    export REGION=us-central1
    

创建 Cloud Storage 存储分区

创建一个存储分区以接收要获取字幕的媒体文件。

在 Cloud Shell 中,运行以下命令以创建存储分区:

export MEDIA_CLIPS_BUCKET=media_$PROJECT
gsutil mb gs://$MEDIA_CLIPS_BUCKET

创建 Pub/Sub 主题和订阅

创建两个 Pub/Sub 主题和两个 Pub/Sub 订阅。第一个主题/订阅对用于告知 Dataflow 流水线媒体文件可供处理。第二个主题/订阅对用于从 Dataflow 流水线输出字幕文件,以便这些文件能够与媒体文件重新集成。

  1. 在 Cloud Shell 中,运行以下命令以创建主题和订阅:

    export MEDIA_TOPIC="media-clips"
    export MEDIA_SUBSCRIPTION="media-clips"
    export CAPTION_TOPIC="captions"
    export CAPTION_SUBSCRIPTION="captions"
    gcloud pubsub topics create $MEDIA_TOPIC
    gcloud pubsub subscriptions create $MEDIA_SUBSCRIPTION --topic=$MEDIA_TOPIC
    gcloud pubsub topics create $CAPTION_TOPIC
    gcloud pubsub subscriptions create $CAPTION_SUBSCRIPTION --topic=$CAPTION_TOPIC
    

创建从 Cloud Storage 到 Pub/Sub 的通知

创建一个通知,以便在将媒体文件上传到 Cloud Storage 存储分区时向 media-clips 主题发送消息。这会触发 Dataflow 流水线来处理媒体文件。

获取 Cloud Storage 服务帐号电子邮件

  1. 打开 Cloud Storage 浏览器

  2. 点击设置

  3. 项目访问权限标签页的 Cloud Storage 服务帐号部分复制服务帐号电子邮件地址。

更新 Cloud Storage 服务帐号权限

  1. 打开 Pub/Sub 主题页面
  2. 对于 media-clips 主题,点击更多,然后点击查看权限
  3. 点击添加成员。在显示的窗格中,执行以下操作:
    1. 对于新成员,粘贴 Cloud Storage 服务帐号电子邮件地址。
    2. 对于选择角色,请选择 Pub/Sub,然后选择 Pub/Sub 发布者
    3. 点击保存

创建通知

  1. 激活 Cloud Shell
  2. 在 Cloud Shell 中,运行以下命令以创建 Pub/Sub 通知:

    gsutil notification create -t media-clips -f json gs://media_$PROJECT
    

启动 Dataflow 流水线

  1. 在 Cloud Shell 中,运行以下命令来运行流水线:

    gcloud beta dataflow flex-template run "create-captions" \
    --project=$PROJECT \
    --region=us-central1 \
    --template-file-gcs-location=gs://dataflow-stt-audio-clips/dynamic_template_stt_analytics.json \
    --parameters=^~^streaming=true~enableStreamingEngine=true~numWorkers=1~maxNumWorkers=3~runner=DataflowRunner~autoscalingAlgorithm=THROUGHPUT_BASED~workerMachineType=n1-standard-4~outputTopic=projects/$PROJECT/topics/$CAPTION_TOPIC~inputNotificationSubscription=projects/$PROJECT/subscriptions/$MEDIA_SUBSCRIPTION~wordCount=10
    
  2. 打开 Dataflow 作业页面

  3. 等待创建字幕流水线显示正在运行状态。这可能需要几分钟的时间。

测试流水线

将音频文件复制到 Cloud Storage 存储分区以触发流水线处理它,然后检查 captions 订阅中的消息以查看输出字幕。

  1. 激活 Cloud Shell
  2. 在 Cloud Shell 中,运行以下命令以复制音频文件:

    gsutil cp gs://dataflow-stt-audio-clips/wav_mono_kellogs.wav gs://$MEDIA_CLIPS_BUCKET
    
  3. 打开 Pub/Sub 订阅页面

  4. 点击订阅列表中的字幕

  5. 点击查看消息

  6. 消息窗格中,点击拉取

  7. 点击任意消息的展开 可查看内容。您应该会看到如下所示的结果:

    包含音频文件转录消息的消息

清理

为避免系统因本教程中使用的资源而向您的 Google Cloud 帐号收取费用,请删除包含资源的项目,或者保留项目但仅删除这些资源。

无论采用哪种方式,您都应移除这些资源,以免日后再为这些资源付费。以下部分介绍如何删除这些资源。

删除项目

为避免支付费用,最简单的方法是删除您为本教程创建的项目。

  1. 在 Cloud Console 中,转到管理资源页面。

    转到“管理资源”

  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

删除组件

如果您不想删除项目,请使用以下几个部分删除本教程的可计费组件。

停止 Dataflow 作业

  1. 打开 Dataflow 作业页面
  2. 在作业列表中,点击创建字幕
  3. 在作业详情页面上,点击停止
  4. 选择取消
  5. 点击停止作业

删除 Cloud Storage 存储分区

  1. 打开 Cloud Storage 浏览器
  2. 选中 media-<myProject>dataflow-staging-us-central1-<projectNumber> 存储分区对应的复选框。
  3. 点击删除
  4. 在出现的叠加窗口中,输入 DELETE,然后点击确认

删除 Pub/Sub 主题和订阅

  1. 打开 Pub/Sub 订阅页面
  2. 选中媒体剪辑字幕订阅对应的复选框。
  3. 点击删除
  4. 在出现的叠加窗口中,点击删除以确认要删除此订阅及其内容。
  5. 点击主题
  6. 选中媒体剪辑字幕主题对应的复选框。
  7. 点击删除
  8. 在出现的叠加窗口中,输入 delete,然后点击删除

后续步骤