了解如何在 Dataflow 流水线中使用 Speech-to-Text API,为音频或视频剪辑创建实时 WebVTT 字幕。
本教程介绍如何使用通过使用 Dataflow 从 Speech-to-Text API 自动提取 WebVTT 字幕参考实现中提供的 Dataflow 柔性模板,解决实时创建 WebVTT 字幕的几个常见难题。这些难题包括:
- 创建字幕时最大限度地缩短延迟时间。
- 为每个字幕构建开始和结束时间偏移。
- 指定生成每个字幕的时长上限。
本教程面向开发者,并假定您对 Dataflow 流水线有着基本了解。
架构
本教程基于 GitHub 上的“通过使用 Dataflow 从 Speech-to-Text API 自动提取 WebVTT 字幕”参考实现。参考实现的工作原理如下:
- 媒体剪辑会上传到 Cloud Storage 存储分区。将对象添加到存储分区会导致消息发送到 Pub/Sub 主题。
- Dataflow 流水线订阅了该 Pub/Sub 主题。消息的传递会触发它检索和处理媒体剪辑。
- 流水线处理媒体剪辑。它首先调用 Speech-to-Text API 以从媒体文件中获取音频文本转录,然后通过该转录内容构建字幕。
- 流水线以 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 帐号。
如果您还没有 Google 帐号,请注册新帐号。
-
在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能。
- 启用 Cloud Storage, Dataflow, Pub/Sub, and the Speech-to-Text API API。
设置环境变量
为本教程中使用的项目和区域设置环境变量。
- 激活 Cloud Shell
在 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 流水线输出字幕文件,以便这些文件能够与媒体文件重新集成。
在 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 服务帐号电子邮件
点击设置。
从项目访问权限标签页的 Cloud Storage 服务帐号部分复制服务帐号电子邮件地址。
更新 Cloud Storage 服务帐号权限
- 打开 Pub/Sub 主题页面
- 对于
media-clips
主题,点击更多 ,然后点击查看权限。 - 点击添加成员。在显示的窗格中,执行以下操作:
- 对于新成员,粘贴 Cloud Storage 服务帐号电子邮件地址。
- 对于选择角色,请选择 Pub/Sub,然后选择 Pub/Sub 发布者。
- 点击保存。
创建通知
- 激活 Cloud Shell
在 Cloud Shell 中,运行以下命令以创建 Pub/Sub 通知:
gsutil notification create -t media-clips -f json gs://media_$PROJECT
启动 Dataflow 流水线
在 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
等待创建字幕流水线显示正在运行状态。这可能需要几分钟的时间。
测试流水线
将音频文件复制到 Cloud Storage 存储分区以触发流水线处理它,然后检查 captions
订阅中的消息以查看输出字幕。
- 激活 Cloud Shell
在 Cloud Shell 中,运行以下命令以复制音频文件:
gsutil cp gs://dataflow-stt-audio-clips/wav_mono_kellogs.wav gs://$MEDIA_CLIPS_BUCKET
点击订阅列表中的字幕。
点击查看消息。
在消息窗格中,点击拉取。
点击任意消息的展开
可查看内容。您应该会看到如下所示的结果:
清理
为避免系统因本教程中使用的资源而向您的 Google Cloud 帐号收取费用,请删除包含资源的项目,或者保留项目但仅删除这些资源。
无论采用哪种方式,您都应移除这些资源,以免日后再为这些资源付费。以下部分介绍如何删除这些资源。
删除项目
为避免支付费用,最简单的方法是删除您为本教程创建的项目。
- 在 Cloud Console 中,转到管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入项目 ID,然后点击关闭以删除项目。
删除组件
如果您不想删除项目,请使用以下几个部分删除本教程的可计费组件。
停止 Dataflow 作业
- 打开 Dataflow 作业页面
- 在作业列表中,点击创建字幕。
- 在作业详情页面上,点击停止。
- 选择取消。
- 点击停止作业。
删除 Cloud Storage 存储分区
- 打开 Cloud Storage 浏览器
- 选中 media-<myProject> 和 dataflow-staging-us-central1-<projectNumber> 存储分区对应的复选框。
- 点击删除。
- 在出现的叠加窗口中,输入
DELETE
,然后点击确认。
删除 Pub/Sub 主题和订阅
- 打开 Pub/Sub 订阅页面
- 选中媒体剪辑和字幕订阅对应的复选框。
- 点击删除。
- 在出现的叠加窗口中,点击删除以确认要删除此订阅及其内容。
- 点击主题。
- 选中媒体剪辑和字幕主题对应的复选框。
- 点击删除。
- 在出现的叠加窗口中,输入
delete
,然后点击删除。
后续步骤
- 查看通过使用 Dataflow 从 Speech-to-Text API 自动提取 WebVTT 字幕参考实现。
- 了解其他智能分析解决方案。
- 详细了解 Dataflow。