了解语音识别功能

Speech-to-Text 是 Google Distributed Cloud (GDC) 气隙环境中的三项 Vertex AI 预训练 API 之一。Speech-to-Text 服务可识别音频文件中的语音,并将音频转写为文本。Speech-to-Text 符合数据驻留和合规性要求。

下表介绍了 Speech-to-Text 的主要功能:

主要功能
转录 运用先进的深度学习神经网络算法来进行自动语音识别。
模型 部署小于 1 GB 且消耗最少资源的识别模型。
与 API 兼容 使用 Speech-to-Text API 及其客户端库发送音频,即可从 Speech-to-Text 服务收到文字转录结果。

Speech-to-Text 支持的音频编码

Speech-to-Text API 支持多种不同编码。下表列出了支持的音频编解码器:

编解码器 名称 无损 使用说明
FLAC 免费无损音频编解码器 信息流要求使用 16 位或 24 位的位深
LINEAR16 线性 PCM 16 位线性脉冲编码调制 (PCM) 编码。文件头必须包含采样率。
MULAW μ 律 8 位 PCM 编码
OGG_OPUS Ogg 容器中的 Opus 编码音频帧 采样率必须为 8000 Hz、12000 Hz、16000 Hz、24000 Hz 或 48000 Hz 之一

FLAC 既是一种音频编解码器,也是一种音频文件格式。如需使用 FLAC 编码转录音频文件,您必须提供 .FLAC 格式的文件,该格式带有一个包含元数据的文件头。

Speech-to-Text 支持包含 LINEAR16MULAW 编码音频的 WAV 文件。

如需详细了解 Speech-to-Text 音频编解码器,请参阅 AudioEncoding 参考文档。

如果您在对源素材进行编码时可以选择编码方式,请使用 FLACLINEAR16 之类的无损编码,以获得更好的语音识别效果。

Speech-to-Text 功能

Distributed Cloud 上的 Speech-to-Text 有以下三种方法来执行语音识别:

  • 同步识别:将音频数据发送到 Speech-to-Text API,对该数据执行识别,并在音频处理完毕后返回结果。 同步识别请求仅限于时长不超过 1 分钟的音频数据。

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

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

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

同步请求和响应

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

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

语音识别请求

同步 Speech-to-Text API 请求包含语音识别配置和音频数据。以下示例展示了一个请求:

{
    "config": {
        "encoding": "LINEAR16",
        "sample_rate_hertz": 16000,
        "language_code": "en-US",
    },
    "audio": {
        "content": "ZkxhQwAAACIQABAAAAUJABtAA+gA8AB+W8FZndQvQAyjv..."
    }
}

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

  • encoding:指定所提供的音频的编码方案。此字段的类型为 AudioEncoding。如果您可以选择编解码器,可首选无损编码(如 FLACLINEAR16)以获得最佳性能。如需查看支持的音频编码格式列表,请参阅 Speech-to-Text 支持的音频编码。 对于编码包含在文件头中的 FLACWAV 文件,encoding 字段为可选字段。
  • sample_rate_hertz:指定所提供音频的采样率(以赫兹为单位)。 如需详细了解采样率,请参阅采样率。对于在文件头中包含采样率的 FLACWAV 文件,sample_rate_hertz 字段为可选字段。
  • language_code:包含所提供音频的语言和区域,以用于语音识别。语言代码必须是 BCP-47 标识符。语言代码包括语言主标记和表示方言的区域子标记。在此示例中,en 表示英语,US 表示美国。如需查看受支持的语言列表,请参阅支持的语言

如需详细了解可在 config 字段中添加的可选子字段,请参阅 RecognitionConfig

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

  • content:包含嵌入在请求之中的需要评估的音频。音频数据字节使用纯二进制表示法进行编码。JSON 表示法使用 Base64。如需了解详情,请参阅嵌入式音频内容。此字段中直接传递的音频的持续时间不能超过 1 分钟。

采样率

您可以在请求配置的 sample_rate_hertz 字段中指定音频的采样率,并且它必须与相关音频内容的采样率相一致。Speech-to-Text 支持的采样率为 8000 Hz 到 48000 Hz。您可以在文件头中指定 FLACWAV 文件的采样率,而不是使用 sample_rate_hertz 字段。不过,对于所有其他音频格式,sample_rate_hertz 字段是必需的。

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

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

语言

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

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

模型选择

向 Speech-to-Text 发送音频转写请求时,您可以使用经过训练以识别该特定来源类型的语音音频的机器学习模型来处理音频文件。

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

Distributed Cloud 上的 Speech-to-Text 支持以下两种模型:

  • default:转写非特定音频模型(例如长音频)的音频。
  • chirp:在需要更高准确度时转写多语言音频。 Chirp 可以使用多种语言执行自动语音识别,即使这些语言是低资源语言,没有大量可用于训练的已标记数据,也能正常运行。

嵌入音频内容

如果在请求的 audio 字段中传递 content 参数,嵌入音频将被包含在语音识别请求中。对于在 REST 请求中作为内容提供的嵌入音频,该音频必须与 JSON 序列化兼容。

仅当音频数据不超过 60 秒和 10 MB 时,才可在 content 字段中直接发送数据以进行同步识别。content 字段中的任何音频数据都必须采用 Base64 格式。

在使用客户端库构建请求时,您会直接在 content 字段中写出此二进制数据或 Base64 编码的数据。

大多数开发环境都附带一个 base64 实用程序,用于将二进制文件编码为 ASCII 文本数据,为您提供必要的工具和支持。 此外,Python 还内置有适用于 Base64 编码内容的机制。以下示例展示了如何对文件进行编码:

Linux

使用 base64 命令行工具对文件进行编码。使用 -w 0 标志可防止换行:

base64 INPUT_FILE -w 0 > OUTPUT_FILE

Python

在 Python 中,使用 Base64 编码的音频文件如下所示:

# Import the base64 encoding library.
import base64

# Pass the audio data to an encoding function.
def encode_audio(audio):
  audio_content = audio.read()
  return base64.b64encode(audio_content)

语音识别响应

同步 Speech-to-Text API 响应可能需要一些时间才能返回结果。处理完成后,该 API 会返回如下示例所示的响应:

{
  "results": [
    {
      "alternatives": [
        {
          "transcript": "how old is the Brooklyn Bridge",
          "words": [
            {
              "word": "how"
            },
            {
              "word": "old"
            },
            {
              "word": "is"
            },
            {
              "word": "the"
            },
            {
              "word": "Brooklyn"
            },
            {
              "word": "Bridge"
            }
          ]
        }
      ]
    }
  ]
}

所有 Speech-to-Text API 同步识别响应都包含类型为 RecognizeResponse 的语音识别结果。RecognizeResponse 对象包含以下字段:

  • results:包含一组类型为 SpeechRecognitionResult 的结果,其中每个结果对应一段音频。每个结果都包含以下一个或多个子字段:

    • alternatives:包含一组可能的转写内容(类型为 SpeechRecognitionAlternative)。回答中的第一个备选项始终是最有可能的。每个备选项都包含以下子字段:

      • transcript:包含转写的文本。如果为您提供了按顺序的备选项,则您可以将这些转录串连起来。
      • words:包含每个识别出的字词的特定字词信息列表。

如需了解详情,请参阅 RecognizeResponse

异步请求和响应

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

以下是操作响应的示例:

{
  "name": "OPERATION_NAME",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.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_v1p1beta1.LongRunningRecognizeMetadata",
    "startTime": "2016-08-31T00:16:29.539820Z",
    "progressPercent": 100
  }
  "response": {
    "@type": "type.googleapis.com/google.cloud.speech_v1p1beta1.LongRunningRecognizeResponse",
    "results": [{
      "alternatives": [{
        "transcript": "how old is the Brooklyn Bridge",
        "words": [
            {
              "word": "how"
            },
            {
              "word": "old"
            },
            {
              "word": "is"
            },
            {
              "word": "the"
            },
            {
              "word": "Brooklyn"
            },
            {
              "word": "Bridge"
            }
          ]
      }]}]
  },
  "done": True
}

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

流式传输请求和响应

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

流式识别请求

不同于可以在单个请求中发送配置和音频的同步和异步调用,调用流式 Speech-to-Text API 需要发送多个请求。第一个 StreamingRecognizeRequest 必须包含一个类型为 StreamingRecognitionConfig 的配置。

StreamingRecognitionConfigconfig 字段组成,该字段包含类型为 RecognitionConfig 的音频的配置信息,并且与同步和异步请求中显示的信息相同。

流式识别响应

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

  • speech_event_type:包含类型为 SpeechEventType 的事件。这些事件的值表明一段话语何时已经完成。语音事件可用作您的流响应中的标记。
  • results:包含一组结果,可能是临时结果也可能是最终结果,类型为 StreamingRecognitionResultresults 列表包含以下子字段:
    • alternatives:包含备选转录的列表。
    • is_final:表示此列表条目中获得的结果是临时结果还是最终结果。
    • result_end_time:表示此结果的结束相对于音频开头的时间偏移值。

Chirp:通用语音模型

Chirp 是 Google Distributed Cloud (GDC) 网闸隔离环境中的新一代 Speech-to-Text 模型。Chirp 是通用语音模型的一个版本,包含超过 20 亿个参数,可在单个模型中转写多种语言。

您可以通过启用 Chirp 组件来转写其他支持的语言的音频文件。

Chirp 在各种公开测试集和语言上实现了极低的字词错误率 (WER),并在分布式云上提供多语言支持。它使用通用编码器,该编码器使用许多其他语言的数据来训练模型,这些模型的架构与当前的语音模型不同。然后对模型进行微调,以提供特定语言的转写服务。单个模型统一了多种语言的数据。不过,用户仍需指定模型必须用以识别语音的语言。

与其他模型相比,Chirp 将语音分成更大的块进行处理。只有在整个话语说完后,才能获得结果,这意味着 Chirp 可能不适合真正的实时使用。

Chirp 的模型标识符为 chirp。因此,您可以在请求的 RecognitionConfig 对象的 model 字段中设置值 chirp

可用的 API 方法

Chirp 同时支持 RecognizeStreamingRecognize Speech-to-Text API 方法。

这两种方法之所以不同,是因为 StreamingRecognize 仅在每次发声后返回结果。因此,与 Recognize 方法相比,此方法在开始语音后具有秒级延迟,而不是毫秒级延迟。不过,StreamingRecognize 在说完话后(例如,在说完一个句子后停顿一下)的延迟时间非常短。