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 |
μ-law | 否 | 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。詳情請參閱「內嵌音訊內容」。直接在這個欄位中傳遞的音訊,長度上限為一分鐘。
取樣率
您可以在要求設定的 sample_rate_hertz 欄位中指定音訊的取樣率,且該取樣率必須與相關聯音訊內容的取樣率相符。Speech-to-Text 支援 8000 Hz 至 48000 Hz (8000-48000) 之間的取樣率。LINEAR16、FLAC 和 MULAW 編碼 (包括 WAV 檔案) 必須提供 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 時,您可以使用機器學習模型處理音訊檔案,該模型經過訓練,可辨識特定來源類型的語音音訊。
如要在 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:表示這項結果結尾相對於音訊開頭的時間偏移。