了解语音识别功能

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 同步识别请求都必须包含语音识别 config 字段(类型为 RecognitionConfig)。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:转录非特定音频模型(例如长音频)的音频。

嵌入音频内容

如果在请求的 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:包含结果列表,该列表可能是类型为 StreamingRecognitionResult的临时结果或最终结果。 results 列表包含以下子字段:
    • alternatives:包含备选转录的列表。
    • is_final:指示此列表条目中获得的结果是临时结果还是最终结果。
    • result_end_time:指示此结果的结束相对于音频开头的时间偏移值。