Speech-to-Text 基础知识

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

概览

本文档介绍了使用 Speech-to-Text 的基础知识。 本概念指南说明您可以对 Speech-to-Text 发出的请求类型、如何构建这些请求以及如何处理其响应。 我们建议所有 Speech-to-Text 用户先阅读本指南和相关教程之一,再深入了解该 API 本身。

自行试用

如果您是 Google Cloud 新手,请创建一个帐号来评估 Speech-to-Text 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费试用 Speech-to-Text

识别器

识别器是支持 V2 识别功能的基本资源。可通过识别器定义可配置且可重复使用的识别配置。识别器包含用于实现识别功能的模型和语言代码列表。使用识别器发出识别请求时,不能替换这些值。识别器还有一个默认的 RecognitionConfig,您可以根据需要在每个识别请求中替换该配置。

RecognitionConfig 包含以下子字段:

  • decoding_config:选择 auto_decoding_config 以指定启用音频元数据的自动检测,或者选择 explicit_decoding_config 以指定对特定音频元数据进行识别。对于无标头的 PCM 音频,必须设置 explicit_decoding_config
  • features:要为识别功能设置的 RecognitionFeatures
  • adaptation:要用于识别功能的 SpeechAdaptation。如需了解详情,请参阅语音自适应概念页面

在发出任何识别请求之前,首先需要调用 CreateRecognizer 方法来创建识别器

然后,在发出识别请求时,您可以在请求中指定识别器的名称,其格式如下。

projects/PROJECT_ID/locations/LOCATION/recognizers/RECOGNIZER_ID

PROJECT_ID 替换为您的 Google Cloud 项目 ID,将 LOCATION 替换为所需的位置(美国、全球等),并将 RECOGNIZER_ID 替换为您的识别器的标识符。

语音请求

Speech-to-Text 有三种主要方法来执行语音识别,如下所列:

  • 同步识别(REST 和 gRPC)将音频数据发送到 Speech-to-Text API,对该数据执行识别,并在所有音频内容处理完毕后返回结果。同步识别请求仅限于持续时间不超过 1 分钟的音频数据。

  • 流式识别(仅限 gRPC)对 gRPC 双向流内提供的音频数据执行识别。流式请求专为实时识别(例如从麦克风采集实时音频)而设计。流式识别可以在采集音频的同时提供临时结果,例如当用户还在讲话时就显示结果。

请求包含配置参数以及音频数据。以下部分更详细地描述了这些类型的识别请求、它们生成的响应以及如何处理这些响应。

Speech-to-Text API 识别

Speech-to-Text API 同步识别请求是对语音音频数据执行识别的最简单方法。Speech-to-Text 可以处理同步请求中发送的最长 1 分钟的语音音频数据。Speech-to-Text 在处理并识别所有音频内容后返回响应。

同步请求具有阻塞性,意味着 Speech-to-Text 必须返回响应,然后才能处理下一个请求。Speech-to-Text 通常能比实时播放速度更快地处理音频,平均 15 秒内可处理 30 秒的音频。但在音频质量较差的情况下,您的识别请求所需时间可能会大幅增加。

Speech-to-Text 采用 REST 和 gRPC 方法来调用 Speech-to-Text API 同步请求。由于 REST API 更易于展示,本文介绍它的基本用法。不过,REST 与 gRPC 请求的基本构成非常相似。只有 gRPC 支持流式识别请求

同步语音识别请求

同步 Speech-to-Text API 请求由语音识别配置和音频数据组成。示例请求如下所示:

{
    "recognizer": "projects/PROJECT_ID/locations/LOCATION/recognizers/RECOGNIZER_ID",
    "config": {
        "explicitDecodingConfig": {
            "encoding": "LINEAR16",
            "sampleRateHertz": 16000,
        }
    },
    "uri": "gs://bucket-name/path_to_audio_file"
}

音频通过类型为 RecognitionAudioaudio_source 参数提供给 Speech-to-Text。audio_source 字段包含以下子字段之一

  • content:包含嵌入在请求之中的需要评估的音频。请参阅下面的嵌入音频内容了解详情。
  • uri:包含一个指向音频内容的 URI。文件不得压缩(例如,不能使用 gzip 压缩文件)。目前,此字段必须包含 Google Cloud Storage URI(格式为 gs://bucket-name/path_to_audio_file)。请参阅下面的传递 URI 引用的音频

要进行同步识别的音频的时长不能超过 60 秒,大小不能超过 10 MB。

如需详细了解这些请求和响应参数,请参阅以下部分。

音频元数据

RecognitionConfig 中,您可以指定 ExplicitDecodingConfigAutoDetectDecodingConfig

使用 AutoDetectDecodingConfig 时,服务会自动检测音频元数据。

对于无标头的 PCM 音频,您只能使用 ExplicitDecodingConfig。若要设置 ExplicitDecodingConfig,您需要在 sampleRateHertz 字段中指定音频的采样率。它必须与相关音频内容或数据流的采样率相一致。Speech-to-Text 支持的采样率为 8000 Hz 到 48000 Hz。您还必须将 encoding 字段设置为任何 AudioEncoding 值。

对源素材进行编码时,如果可以选择,请使用 16000 Hz 的采样率采集音频。低于此值可能损害语音识别的准确性,但更高的采样率对语音识别质量并没有明显影响。

但是,如果您的音频数据已经录制完毕,但并非采用 16000 Hz 的采样率,请勿将音频重新采样为 16000 Hz。例如,大多数传统电话音频使用 8000 Hz 的采样率,这可能会产生不够准确的结果。但如果您必须使用此类音频,请将其以原生采样率提供给 Speech API。

语言

Speech-to-Text 的识别引擎支持大量语言和方言。您可以使用 BCP-47 标识符在请求配置的 languageCode 字段中指定音频语言(以及国家或地区方言)。

语言支持页面提供了各项功能所支持语言的完整列表。

时间偏移(时间戳)

对于从提供的音频中识别出的每个语音内容,Speech-to-Text 可以包括其开始和结束时间的时间偏移值(时间戳)。时间偏移值表示从音频开头起已过去的时间量,以 100ms 为增量。

在分析较长的音频文件时,您可能需要在识别出的文字中搜索特定字词并在原始音频中对其进行定位(跳转),这种情况下时间偏移特别有用。所有识别方法(recognizestreamingrecognize)均支持时间偏移。

Speech-to-Text 仅会为识别响应中提供的第一个备选项加上时间偏移值。

如需在请求结果中加入时间偏移,请在 RecognitionFeatures 中将 enableWordTimeOffsets 参数设置为 true。如需了解使用 REST API 或客户端库的示例,请参阅使用时间偏移(时间戳)。例如,您可以在请求中添加 enableWordTimeOffsets 参数,如下所示:

{
    "recognizer": "projects/PROJECT_ID/locations/LOCATION/recognizers/RECOGNIZER_ID",
    "config": {
      "features": {
        "enableWordTimeOffsets": true
      }
    },
    "uri":"gs://gcs-test-data/gettysburg.flac"
}

Speech-to-Text API 返回的结果将为每个识别出的字词添加时间偏移值,如下所示:

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "Four score and twenty...(etc)...",
          "confidence": 0.97186122,
          "words": [
            {
              "startTime": "1.300s",
              "endTime": "1.400s",
              "word": "Four"
            },
            {
              "startTime": "1.400s",
              "endTime": "1.600s",
              "word": "score"
            },
            {
              "startTime": "1.600s",
              "endTime": "1.600s",
              "word": "and"
            },
            {
              "startTime": "1.600s",
              "endTime": "1.900s",
              "word": "twenty"
            },
            ...
          ]
        }
      ]
    },
    {
      "alternatives": [
        {
          "transcript": "for score and plenty...(etc)...",
          "confidence": 0.9041967,
        }
      ]
    }
  ]
}

模型选择

Speech-to-Text 可以从多种机器学习模型中选择一种来转录音频文件。Google 已经针对特定的音频类型和来源训练了这些语音识别模型。

向 Speech-to-Text 发送语音转录请求时,您可以通过指定原始音频来源来改进您收到的结果。这样,Speech-to-Text API 可以使用经过训练以识别该特定类型源的语音音频的机器学习模型来处理您的音频文件。

如需为语音识别指定模型,请在创建识别器时在 Recognizermodel 字段中设置模型,然后在发出识别请求时引用该识别器。

Speech-to-Text 可以使用以下类型的机器学习模型来转录您的音频文件。

类型 枚举常量 说明
Latest Long latest_long

此模型适用于任何类型的长篇内容,例如媒体或自然言语和对话。考虑使用此模型来代替视频模型,尤其是在视频模型不支持您的目标语言的情况下。 您还可以用此模型来代替默认模型。

Latest Short latest_short

该模型适合用于几秒钟的短语音。它有助于尝试捕获命令或其他单发定向语音用例。请考虑使用此模型而不是命令和搜索模型。

电话 telephony

使用此模型转录电话通话的音频。通常情况下,电话音频以 8000 Hz 的采样率录制。

医疗口录 medical_dictation

使用此模型来转录医疗专业人员口述的备注。

医疗对话 medical_conversation

使用此模型转录医疗专业人员和患者之间的对话。

嵌入音频内容

如果在请求的 audio_source 字段中传递 content 参数,嵌入音频将被包含在语音识别请求中。对于在 gRPC 请求中作为内容提供的嵌入音频,该音频必须与 Proto3 序列化兼容,并以二进制数据的形式提供。对于在 REST 请求中作为内容提供的嵌入音频,该音频必须与 JSON 序列化兼容,并首先进行 Base64 编码。如需了解详情,请参阅对您的音频进行 Base64 编码

在使用 Google Cloud 客户端库构建请求时,通常您会直接在 content 字段中写出此二进制(或 base64 编码)数据。

传递通过 URI 引用的音频

更常见的做法是,您在语音请求的 audio_source 字段内传递一个 uri 参数,指向位于 Google Cloud Storage 中的一个音频文件(二进制格式,不是 base64 编码),格式如下:

gs://bucket-name/path_to_audio_file

例如,某个语音请求的以下部分引用了快速入门中使用的示例音频文件:

...
"uri":"gs://cloud-samples-tests/speech/brooklyn.flac"
...

您必须为 Speech-to-Text 创建服务帐号,并为该帐号授予对相关存储对象的读取权限。如果目前没有服务帐号并且您想要创建一个服务帐号,请在 Cloud Shell 中运行以下命令以创建并显示帐号。

gcloud beta services identity create --service=speech.googleapis.com \
    --project=PROJECT_ID

如果系统提示您安装 gcloud Beta 命令组件,请输入 Y。安装后,该命令会自动重启。

服务帐号 ID 的格式与电子邮件地址类似:

Service identity created: service-xxx@gcp-sa-speech.iam.gserviceaccount.com

向此帐号授予对要运行识别的相关存储对象的读取权限。

如需详细了解如果管理对 Google Cloud Storage 的访问权限,请参阅 Google Cloud Storage 文档中的创建和管理访问权限控制列表

Speech-to-Text API 响应

如前所述,同步 Speech-to-Text API 响应可能需要一些时间才能返回结果,所需时间与提供的音频内容长度成正比。处理完成后,该 API 将返回响应,如下所示:

{
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.98267895,
          "transcript": "how old is the Brooklyn Bridge"
        }
      ],
     "resultEndOffset": "0.780s",
     "languageCode": "en-US"
    }
  ]
}

这些字段的含义如下:

  • results:包含一组类型为 SpeechRecognitionResult 的结果,其中每个结果对应一段音频(音频段通过暂停分隔)。每个结果将包含以下一个或多个字段:
    • alternatives:包含一组可能的转录内容(类型为 SpeechRecognitionAlternative)。是否出现多个备选项取决于您是否要求超过一个备选项(通过将 RecognitionFeatures 中的 maxAlternatives 设置为大于 1 的值)以及 Speech-to-Text 是否生成了具有足够高质量的备选项。每个备选项将由以下字段组成:
      • transcript:包含转录的文字。请参阅下面的处理转录
      • confidence:包含 0 到 1 之间的值,该值表示 Speech-to-Text 对于指定转录文字的置信度。请参阅下面的解释置信度值
    • channelTag:与识别出的音频所属声道相对应的声道标记。仅适用于多声道音频。
    • resultEndOffset:此结果的结束相对于音频开头的时间偏移。
    • languageCode:对应于此结果中用于识别功能的语言代码。如果为识别功能提供了多个语言代码,则此值对应于音频中最有可能被使用的语言。

如果无法从提供的音频中识别出语音,则返回的 results 列表将不包含任何内容。语音无法识别通常是由于音频质量很差,或语言代码、编码或采样率值与所提供音频不匹配。

以下部分介绍了此响应的组成部分。

每个同步 Speech-to-Text API 响应都会返回一个结果列表,而不是包含所有已识别音频的单一结果。识别出的音频列表(在 transcript 元素内)将以连续顺序显示。

选择备选项

成功的同步识别响应中的每个结果可以包含一个或多个 alternatives(如果 RecognitionFeatures 中的 maxAlternatives 值大于 1)。如果 Speech-to-Text 确定备选项具有足够高的置信度值,则该备选项将包含在响应中。响应中的第一个备选项始终是最佳(可能性最高)选择。

maxAlternatives 设置为高于 1 的值并不保证一定会返回多个备选项。通常,多个备选项更适合为通过流式识别请求获取结果的用户提供实时选项。

处理转录

响应中提供的每个备选项都将包含一个 transcript,其中包含识别出的文字。如果为您提供了按顺序的备选项,则您应当将这些转录串连起来。

以下 Python 代码遍历结果列表并将这些转录内容串连到一起。请注意,在所有情况下,我们均采用第一个(索引编号为零)备选项。

response = service_request.execute()
recognized_text = 'Transcribed Text: \n'
for i in range(len(response['results'])):
    recognized_text += response['results'][i]['alternatives'][0]['transcript']

置信度值

confidence 值是 0.0 到 1.0 之间的估计值。它是通过汇总分配给音频中每个字词的“可能性”值来计算的。数值越大,表示估计字词被正确识别的可能性越高。此字段通常只为最有可能的假设提供,并且仅适用于 is_final=true 时的结果。例如,您可以使用 confidence 值来决定是向用户显示备选结果还是要求用户确认。

不过请注意,该模型在确定排名最靠前的“最佳”结果时,并非单纯基于 confidence 分数,而会考虑更多的信息(例如句子上下文)。因此,在少数情况下,排名最靠前的结果并一不定具有最高的置信度分数。如果您未要求多个备选结果,返回的单个“最佳”结果的置信度值可能低于预期。例如,在使用生僻字词时就可能出现这种情况。一个很少使用的字词即使被正确识别,也可能分配一个较低的“可能性”值。如果模型根据上下文确定该生僻字词是最可能的选项,那么即使该结果的 confidence 值低于备选项,也会作为最佳结果返回。

Speech-to-Text API 流式识别请求

流式 Speech-to-Text API 识别调用旨在用于在双向流内实时捕获和识别音频。您的应用可以在请求流中发送音频,并实时在响应流中接收临时和最终识别结果。临时结果表示一段音频的当前识别结果,而最终识别结果表示该段音频的最后的最佳猜测结果。

流式请求

不同于可以在单个请求中发送配置和音频的同步调用,调用流式 Speech API 需要发送多个请求。第一个 StreamingRecognizeRequest 必须包含一个类型为 StreamingRecognitionConfig 的配置,不附带任何音频。随后在同一流中发送的 StreamingRecognizeRequest 将由原始音频字节的连续帧组成。

StreamingRecognitionConfig 包含以下字段:

  • config:类型为 RecognitionConfig 的可选配置,与同步请求中显示的信息相同。
  • config:一组可选字段,可用于替换识别器的默认 RecognitionConfig 中的值。如果未提供掩码,则 config 中的所有非默认值字段都将替换此识别请求所使用的识别器中的值。如果提供了掩码,则只有掩码中列出的字段才会替换此识别请求所使用的识别器中的配置。如果提供了通配符 (*),则 config 将完全替换此识别请求所使用的识别器中的配置。
  • features:可选。用于专门启用流式音频识别请求的语音识别功能。如需了解详情,请参阅 StreamingRecognitionFeatures

流式响应

流式语音识别结果在类型为 StreamingRecognizeResponse 的一系列响应中返回。此类响应包含以下字段:

  • speechEventType:包含类型为 SpeechEventType 的事件。这些事件的值可指示何时确定一段话语已经完成。语音事件用作您的语音流响应中的标记。
  • results:包含一组结果,可能是临时结果也可能是最终结果,类型为 StreamingRecognitionResultresults 列表包含以下子字段:
    • alternatives:包含备选转录的列表。
    • isFinal:表示此列表条目中获得的结果是临时结果还是最终结果。Google 可能会在单个流中返回多个 isFinal=true 结果,但只有在写入流关闭(半关闭)后,isFinal=true 结果才会得到保证。
    • stability:表示目前为止获得的结果的稳定性,其中 0.0 表示完全不稳定,而 1.0 表示完全稳定。请注意,stability 与估计转录内容是否正确的置信度不同,它估计指定的部分结果是否可能改变。如果 isFinal 设置为 true,则将不会设置 stability
    • result_end_offset:此结果的结束相对于音频开头的时间偏移。
    • channel_tag:与识别出的音频所属声道相对应的声道编号。仅适用于多声道音频。
    • language_code:此结果中语言的 BCP-47 语言标记。
  • speech_event_offset:音频开头与发出事件之时的时间偏移。
  • metadata:包含与计费音频秒数相关的 RecognitionResponseMetadata