Speech-to-Text 请求构造

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

自行试用

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

免费试用 Speech-to-Text

语音请求

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

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

  • 异步识别(REST 和 gRPC)将音频数据发送到 Speech-to-Text API 并启动长时间运行的操作。使用此操作,您可以定期轮询识别结果。异步请求可用于任何持续时间不超过 480 分钟的音频数据。

  • 流式识别(仅限 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 请求由语音识别配置和音频数据组成。示例请求如下所示:

{
    "config": {
        "encoding": "LINEAR16",
        "sampleRateHertz": 16000,
        "languageCode": "en-US",
    },
    "audio": {
        "uri": "gs://bucket-name/path_to_audio_file"
    }
}

所有 Speech-to-Text API 同步识别请求都必须包含语音识别 config 字段(类型为 RecognitionConfig)。RecognitionConfig 包含以下子字段:

  • encoding:该字段为必需字段,它指定所提供的音频(类型为 AudioEncoding)的编码方案。如果您可以选择编解码器,可首选无损编码(如 FLACLINEAR16)以获得最佳性能。如需了解详情,请参阅音频编码。对于编码包含在文件头中的 FLACWAV 文件,encoding 字段为可选字段。
  • sampleRateHertz:该字段为必需字段,它指定所提供音频的采样率(以赫兹为单位)。如需详细了解采样率,请参阅下面的采样率。对于采样率包含在文件头中的 FLACWAV 文件,sampleRateHertz 字段为可选字段。
  • languageCode:该字段为必需字段,它包含所提供音频的语言和区域/语言区域以用于语音识别。语言代码必须是 BCP-47 标识符。请注意,语言代码通常包括语言主标记和表示方言的区域子标记(例如,在上述示例中,“en”代表英语,“US”代表美国)。如需了解受支持的语言列表,请参阅支持的语言
  • maxAlternatives:该字段为可选字段,默认值为 1,表示在响应中提供的备选转录内容的数量。默认情况下,Speech-to-Text API 提供一个主要转录内容。如果您想评估多个不同的备选项,请将 maxAlternatives 设置为更高的值。请注意,仅当识别程序确定备选转录达到足够高的质量时,Speech-to-Text 才会返回该备选转录;一般来讲,备选转录更适合需要用户反馈的实时请求(例如语音命令),因此更适合流式识别请求。
  • profanityFilter:该字段为可选字段,它指示是否过滤掉亵渎性字词或短语。对于英语,经过过滤的单词将包含其首字母,其余字符以星号代替(例如 f***)。脏话过滤器仅能处理单个字词,不能检测短语或字词组合形式的辱骂或冒犯性言语。
  • speechContext:该字段为可选字段,它包含用于处理此音频的其他上下文信息。上下文包含以下子字段:
    • boost - 包含指定权重以识别给定字词或短语的值。
    • phrases:它包含一个字词和短语的列表,用于为语音识别任务提供提示。如需了解详情,请参阅有关语音自适应的信息。

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

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

以下内容更为详细地介绍了这些请求和响应参数。

采样率

您可以在请求配置的 sampleRateHertz 字段中指定音频的采样率,并且它必须与相关音频内容或音频流的采样率相一致。Speech-to-Text 支持的采样率为 8000 Hz 到 48000 Hz。您可以在文件头中指定 FLACWAV 文件的采样率,而不是使用 sampleRateHertz 字段。FLAC 文件必须在 FLAC 文件头中包含采样率,才能提交到 Speech-to-Text API。

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

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

语言

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

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

时间偏移(时间戳)

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

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

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

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

{
"config": {
  "languageCode": "en-US",
  "enableWordTimeOffsets": true
  },
"audio":{
  "uri":"gs://gcs-test-data/gettysburg.flac"
  }
}

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

{
  "name": "6212202767953098955",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata",
    "progressPercent": 100,
    "startTime": "2017-07-24T10:21:22.013650Z",
    "lastUpdateTime": "2017-07-24T10:21:45.278630Z"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "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 可以使用经过训练以识别该特定类型源的语音音频的机器学习模型来处理您的音频文件。

如需为语音识别指定模型,请在请求的 RecognitionConfig 对象中加入 model 字段,并指定您要使用的模型。

请参阅可用机器学习模型的 Speech-to-Text 转写模型列表

嵌入音频内容

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

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

传递通过 URI 引用的音频

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

gs://bucket-name/path_to_audio_file

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

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

您必须拥有适当的访问权限才能读取 Google Cloud Storage 文件,例如以下权限之一:

  • 公开可读(例如我们的示例音频文件)
  • 可由您的服务账号读取(如果使用服务账号授权)。
  • 可由用户账号读取(如果使用三方模式 OAuth 进行用户账号授权)。

如需详细了解如果管理对 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"
        }
      ]
    }
  ]
}

这些字段的含义如下:

  • results 包含一组类型为 SpeechRecognitionResult 的结果,其中每个结果对应一段音频(音频段通过暂停分隔)。每个结果将包含以下一个或多个字段:
    • alternatives 包含一组可能的转录内容(类型为 SpeechRecognitionAlternatives)。是否出现多个备选项取决于您是否要求超过一个备选项(通过将 maxAlternatives 设置为大于 1 的值)以及 Speech-to-Text 是否生成了具有足够高质量的备选项。每个备选项将由以下字段组成:
      • transcript 包含转录的文字。请参阅下面的处理转录
      • confidence 包含 0 到 1 之间的值,该值表示 Speech-to-Text 对于指定转录文字的置信度。请参阅下面的解释置信度值

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

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

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

选择备选项

成功的同步识别响应中的每个结果可以包含一个或多个 alternatives(如果请求的 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 值低于备选项,也会作为最佳结果返回。

异步请求和响应

LongRunningRecognize 方法的异步 Speech-to-Text API 请求与同步 Speech-to-Text API 请求的形式相同。但是,异步请求不会启动响应,而是启动一个长时间运行的操作(类型为 Operation),并立即将此操作返回给调用者。您可以将异步语音识别用于最长为 480 分钟的音频。

常见的操作响应如下所示:

{
  "name": "operation_name",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata"
    "progressPercent": 34,
    "startTime": "2016-08-30T23:26:29.579144Z",
    "lastUpdateTime": "2016-08-30T23:26:29.826903Z"
  }
}

请注意,目前还没有结果。Speech-to-Text 将继续处理音频,并使用此操作存储结果。结果将出现在 LongRunningRecognize 请求完成后返回的操作返回的 response 字段中。

请求完成后的完整响应如下所示:

{
  "name": "1268386125834704889",
  "metadata": {
    "lastUpdateTime": "2016-08-31T00:16:32.169Z",
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongrunningRecognizeMetadata",
    "startTime": "2016-08-31T00:16:29.539820Z",
    "progressPercent": 100
  }
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse",
    "results": [{
      "alternatives": [{
        "confidence": 0.98267895,
        "transcript": "how old is the Brooklyn Bridge"
      }]}]
  },
  "done": True,
}

请注意,done 已设置为 True,并且该操作的 response 包含一组类型为 SpeechRecognitionResult 的结果,该类型与同步 Speech-to-Text API 识别请求返回的类型相同。

默认情况下,异步 REST 响应将 done 设置为默认值 False,但是,由于 JSON 不要求字段中存在默认值,因此在测试操作是否完成时,应测试 done 字段是否存在以及是否设置为 True

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

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

流式请求

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

StreamingRecognitionConfig 包含以下字段:

  • config:该字段为必需字段,它包含类型为 RecognitionConfig 的音频配置信息,并且与同步和异步请求中显示的信息相同。
  • single_utterance:该字段为可选字段,默认值为 false,它指示此请求是否应该在检测不到语音后自动结束。如果设置了该字段,则 Speech-to-Text 将检测暂停、静音或非语音音频以确定何时停止识别。如果未设置该字段,则系统将继续侦听并处理音频,直到语音流直接关闭或超出此语音流的长度限制为止。将 single_utterance 设置为 true 对于处理语音命令很有用。
  • interim_results:该字段为可选字段,默认值为 false,它指示此语音流请求应该返回临时结果,这些结果稍后(处理更多音频之后)可能会被改进。响应中的临时结果通过将 is_final 设置为 false 来注明。

流式响应

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

  • speechEventType 包含类型为 SpeechEventType 的事件。这些事件的值可指示何时确定一段话语已经完成。语音事件用作您的语音流响应中的标记。
  • results 包含一组结果,可能是临时结果也可能是最终结果,类型为 StreamingRecognitionResultresults 列表包含以下子字段:
    • alternatives 包含备选转录的列表。
    • isFinal 表示此列表条目中获得的结果是临时结果还是最终结果。 Google 可能会在单个流中返回多个 isFinal=true 结果,但只有在写入流关闭(半关闭)后,isFinal=true 结果才会得到保证。
    • stability 表示目前为止获得的结果的稳定性,其中 0.0 表示完全不稳定,而 1.0 表示完全稳定。请注意,stability 与估计转录内容是否正确的置信度不同,它估计指定的部分结果是否可能改变。如果 isFinal 设置为 true,则将不会设置 stability