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 支持采用 LINEAR16 或 MULAW 编码音频的 WAV 文件。
如需详细了解 Speech-to-Text 音频编解码器,请参阅 AudioEncoding 参考文档。
如果您在对源素材进行编码时可以选择编码方式,请使用 FLAC 或 LINEAR16 之类的无损编码,以获得更好的语音识别效果。
Speech-to-Text 功能
Distributed Cloud 上的 Speech-to-Text 具有以下三种执行语音识别的方法:
同步识别:将音频数据发送到 Speech-to-Text API,对该数据执行识别,并在音频处理后返回结果。同步识别请求仅限于时长不超过一分钟的音频数据。
异步识别:将音频数据发送到 Speech-to-Text API 并启动长时间运行的操作。使用此操作,您可以定期轮询识别结果。 异步请求可用于任何持续时间不超过 480 分钟的音频数据。
流式识别:对双向流内提供的音频数据执行识别。流式请求专为实时识别(例如从麦克风采集实时音频)而设计。流式识别可以在采集音频的同时提供临时结果,例如,可以在用户仍在讲话时显示结果。
请求包含配置参数和音频数据。以下部分更详细地描述了这些识别请求、它们生成的响应以及如何处理这些响应。
同步请求和响应
Speech-to-Text 同步识别请求是对语音音频数据执行识别的最简单方法。Speech-to-Text 可以处理同步请求中发送的最长一分钟的语音音频数据。Speech-to-Text 在处理并识别所有音频内容后返回响应。
Speech-to-Text 必须返回响应,然后才能处理下一个请求。Speech-to-Text 通常能以快于实时的速度处理音频,平均可在 15 秒内处理 30 秒的音频。但在音质较差的情况下,您的识别请求所需时间可能会大幅增加。
语音识别请求
同步 Speech-to-Text API 请求由语音识别配置和音频数据组成。
以下示例展示了如何发送同步语音识别请求:
Python
import google.auth
from google.auth.transport import requests
from google.api_core.client_options import ClientOptions
from google.cloud import speech_v1p1beta1 as speech
audience = "https://ENDPOINT:443"
api_endpoint = "ENDPOINT:443"
try:
creds, _ = google.auth.default()
creds = creds.with_gdch_audience(audience)
def_req = requests.Request()
creds.refresh(def_req)
except Exception as e:
print("Caught exception", e)
raise e
client = speech.SpeechClient(
credentials=creds,
client_options=ClientOptions(api_endpoint=api_endpoint),
)
with open("SPEECH_FILE", "rb") as audio_file:
content = audio_file.read()
audio = speech.RecognitionAudio(content=content)
config = speech.RecognitionConfig(
encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16,
sample_rate_hertz=16000,
audio_channel_count=1,
language_code="en-US",
)
response = client.recognize(
config=config,
audio=audio,
metadata=[("x-goog-user-project", "projects/PROJECT_ID")],
)
print(response)
替换以下内容:
ENDPOINT:您为组织使用的 Speech-to-Text 端点。如需了解详情,请查看服务状态和端点。SPEECH_FILE:您要转录的音频文件的路径。PROJECT_ID:您的项目 ID。
curl (JSON)
在 Distributed Cloud 上,Speech-to-Text API Gateway 使用 speech_v1p1beta1 提供 gRPC 服务,默认情况下不启用 HTTP/JSON REST 转码。在 Distributed Cloud 上使用上述 Python speech_v1p1beta1 gRPC 客户端。
如果启用了 HTTP/JSON 转码,请按以下格式设置请求:
curl -X POST \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-H "x-goog-user-project: projects/PROJECT_ID" \
--data '{
"config": {
"encoding": "FLAC",
"sampleRateHertz": 16000,
"languageCode": "en-US",
"audioChannelCount": 1
},
"audio": {
"content": "ZkxhQwAAACIQABAAAAUJABtAA+gA8AB+W8FZndQvQAyjv..."
}
}' \
"https://ENDPOINT:443/v1p1beta1/speech:recognize"
替换以下内容:
所有 Speech-to-Text 同步识别请求都必须包含类型为 RecognitionConfig 的语音识别 config 字段。RecognitionConfig 对象包含以下必需子字段:
encoding:指定所提供音频的编码方案。此字段的类型为AudioEncoding。如果您有编解码器选择权,可首选无损编码(如FLAC或LINEAR16)以获得最佳性能。如需查看支持的音频编码格式列表,请参阅 Speech-to-Text 支持的音频编码。sample_rate_hertz:指定所提供音频的采样率(以赫兹为单位,8000-48000)。如需详细了解采样率,请参阅采样率。对于LINEAR16、FLAC和MULAW编码(包括 WAV 文件),sample_rate_hertz字段是必需的。audio_channel_count:指定输入音频数据中的声道数(1-8,例如单声道音频为1)。LINEAR16、FLAC和MULAW音频需要audio_channel_count字段。language_code:包含用于语音识别的语言和区域(适用于提供的音频)。语言代码必须是 BCP-47 标识符。语言代码由语言主标记和表示方言的次要区域子标记组成。在此示例中,en表示英语,US表示美国。如需查看支持的语言列表,请参阅支持的语言。
如需了解详情以及您可以添加到 config 字段中的可选子字段的说明,请参阅 RecognitionConfig。
通过类型为 RecognitionAudio 的 audio 参数向 Speech-to-Text 提供音频。audio 字段包含以下子字段:
content:包含嵌入在请求之中的需要评估的音频。音频数据字节使用纯二进制表示法进行编码。JSON 表示法使用 Base64。如需了解详情,请参阅嵌入式音频内容。此字段中直接传递的音频的持续时间不能超过 1 分钟。
采样率
您可以在请求配置的 sample_rate_hertz 字段中指定音频的采样率,并且它必须与相关音频内容的采样率相一致。Speech-to-Text 支持 8000 Hz 到 48000 Hz (8000-48000) 之间的采样率。sample_rate_hertz 字段是 LINEAR16、FLAC 和 MULAW 编码(包括 WAV 文件)的必需字段。
对源素材进行编码时,如果可以选择,请使用 16000 Hz 的采样率采集音频。低于此值可能损害语音识别的准确性,但更高的采样率对语音识别质量并没有明显影响。
但是,如果您录制音频数据时使用的采样率并非 16000 Hz,请勿将音频重新采样为 16000 Hz。例如,大多数传统电话音频使用 8000 Hz 的采样率,这可能会产生准确性较低的结果。如果您必须使用此类音频,请将其以原始采样率提供给 Speech-to-Text API。
语言
Speech-to-Text 的识别引擎支持多种语言和方言。您可以使用 BCP-47 标识符在请求配置的 language_code 字段中指定音频语言(以及国家或地区方言)。
支持的语言页面提供了各项功能所支持语言的完整列表。
模型选择
向 Speech-to-Text 发送音频转写请求时,您可以使用经过训练来识别特定来源类型语音音频的机器学习模型来处理您的音频文件。
如需在 Distributed Cloud 上使用默认语音识别模型,请省略 RecognitionConfig 对象中的 model 字段,或将 model 设置为 latest_long。请勿将 model 设置为 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 的配置。
StreamingRecognitionConfig 由 config 字段组成,该字段包含类型为 RecognitionConfig 的音频配置信息,且与同步和异步请求中显示的信息相同。
流式识别响应
流式语音识别结果会返回一系列类型为 StreamingRecognizeResponse 的响应。此类响应包含以下字段:
speech_event_type:包含类型为SpeechEventType的事件。这些事件的值可指示何时完成一段话语。语音事件用作您的语音流响应中的标记。results:包含一组结果,可能是临时结果也可能是最终结果,类型为StreamingRecognitionResult。results列表包含以下子字段:alternatives:包含备选转录的列表。is_final:表示此列表条目中获得的结果是临时结果还是最终结果。result_end_time:表示此结果的结束相对于音频开头的时间偏移值。