Cloud Speech-to-Text 總覽

本文是使用 Cloud Speech-to-Text 的基本概念指南。這份概念指南涵蓋了您可以向 Cloud STT 提出的要求類型、如何建構這些要求,以及如何處理其回應等資訊。我們建議 Cloud STT 的所有使用者都先閱讀這份指南以及其中一份相關聯的教學課程,然後再深入瞭解 API 本身。

歡迎試用

如果您未曾使用過 Google Cloud,歡迎建立帳戶,親自體驗實際使用 Cloud STT 的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。

免費試用 Cloud STT

語音要求

Cloud STT 有三種主要的語音辨識方法:

  • 同步辨識 (REST 與 gRPC) 會將音訊資料傳送至 Cloud Speech-to-Text API,對該資料執行辨識,並在所有音訊資料處理完成後傳回結果。同步辨識要求的音訊資料時間長度上限不超過 1 分鐘。

  • 非同步辨識 (REST 與 gRPC) 會將音訊資料傳送至 Cloud Speech-to-Text API,並啟動「長時間執行作業」。您可以使用這個作業,對辨識結果進行定期輪詢。請針對任何長度最多為 480 分鐘的音訊資料使用非同步要求。

  • 串流辨識 (僅 gRPC) 會對 gRPC 雙向串流內提供的音訊資料執行辨識。串流要求的用途是即時辨識,例如擷取麥克風的即時音訊。串流辨識會在擷取音訊時提供暫時結果,進而在例如使用者還在說話時顯示結果。

要求包含設定參數以及音訊資料。下列各節將詳細說明這些類型的辨識要求、它們產生的回應,以及如何處理這些回應。

Cloud Speech-to-Text API 辨識

Cloud Speech-to-Text API 同步辨識要求是對語音資料執行辨識最簡單的方法。Cloud STT 可處理同步要求中所傳送最長 1 分鐘的語音資料。Cloud STT 處理及辨識所有音訊之後,會傳回回應。

同步要求採用封鎖模式,也就是說,Cloud STT 必須先傳回回應,才能處理下一個要求。Cloud STT 處理音訊的速度通常比即時要快,平均 15 秒處理 30 秒的音訊。如果音訊品質不佳,您的辨識要求可能會花費相當長的時間。

同步語音辨識要求

同步 Cloud Speech-to-Text API 要求包含語音辨識設定和音訊資料。例如:

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

所有 Cloud Speech-to-Text API 同步辨識要求都必須包含類型為 RecognitionConfig 的語音辨識 config 欄位。RecognitionConfig 包含下列子欄位:

  • encoding:必填。指定所提供音訊的編碼配置 (類型為 AudioEncoding)。如果可以選擇轉碼器,建議使用 FLAC 或 LINEAR16 等無損編碼方式,以獲得最佳效能。 (詳情請參閱「音訊編碼」)。針對編碼包含在檔案標頭中的 FLAC 與 WAV 檔案,您可以選擇是否要使用 encoding 欄位。
  • sampleRateHertz:必填。指定所提供音訊的取樣率 (單位為赫茲)。(如要深入瞭解取樣率,請參閱下文的「取樣率」)。針對取樣率包含在檔案標頭中的 FLAC 與 WAV 檔案,您可以選擇是否要使用 sampleRateHertz 欄位。
  • languageCode:必填。包含用於所提供音訊語音辨識的語言和地區/語言代碼。語言代碼必須為 BCP-47 ID。 請注意,語言代碼通常由主要語言標記與次要地區子標記組成,用於表示方言 (例如上述範例中的「en」表示英文,「US」則表示美國;如需支援的語言清單,請參閱支援的語言一文)。
  • maxAlternatives:選填,預設為 1。表示要在回應中提供的替代轉錄數。根據預設,Cloud Speech-to-Text API 會提供一個主要轉錄。如要評估不同的替代轉錄,請將 maxAlternatives 設定為較高的值。請注意,只有當辨識器判斷替代方案的品質足夠時,Cloud STT 才會傳回替代方案;一般來說,替代方案較適合需要使用者意見回饋的即時要求 (例如語音指令),因此更適合串流辨識要求。
  • profanityFilter:選用。表示是否要篩除不雅的字詞或詞組。篩除的字詞會包含其第一個字母,並用星號表示其餘字元 (例如 f***)。不雅用語篩選器適用於單一字詞,不會偵測違規或令人反感的詞組或字詞組合語音。
  • speechContext:選用。包含其他情境資訊來處理這個音訊檔案。背景資訊包含下列子欄位:
    • boost:包含的值會為辨識特定字詞或片語指派權重。
    • phrases:包含一組字詞和詞組清單,為語音辨識工作提供提示 詳情請參閱語音適應相關資訊。

音訊會透過類型為 RecognitionAudioaudio 參數提供給 Cloud STT。audio 欄位包含下列其中一個子欄位:

  • content 包含要評估的音訊,且嵌入在要求中。詳情請參閱「嵌入音訊內容」。 在這個欄位內直接傳送的音訊內容時間長度上限為 1 分鐘。
  • uri 包含指向音訊內容的 URI。該檔案不得壓縮 (例如 gzip)。這個欄位必須包含格式為 gs://bucket-name/path_to_audio_file 的 Cloud Storage URI。請參閱「透過 URI 傳送音訊參照」。

取樣率

您可以在要求設定的 sampleRateHertz 欄位中指定音訊的取樣率,且它必須與相關聯音訊內容或串流的取樣率相符。Cloud STT 支援介於 8000 Hz 和 48000 Hz 之間的取樣率。您可以在檔案標頭中指定 FLAC 或 WAV 檔案的取樣率,而不使用 sampleRateHertz 欄位。FLAC 檔案必須在 FLAC 標頭中包含取樣率,才能提交至 Speech-to-Text API。

如果您在編碼原始內容時可以進行選擇,請使用 16000 Hz 的取樣率擷取音訊。若低於這個值,可能會影響語音辨識準確率,若層級較高,則不會對語音辨識品質造成明顯影響。

不過,如果音訊資料已以 16000 Hz 以外的取樣率錄製,請勿將音訊重新取樣為 16000 Hz。舉例來說,大多數舊版電話音訊使用的取樣率為 8000 Hz,這可能會導致結果準確度降低。如果必須使用這類音訊,請以原始取樣率將音訊提供給 Speech API。

語言

Cloud STT 的辨識引擎支援各種語言與方言。您可以在要求設定的 languageCode 欄位內,使用 BCP-47 ID 指定音訊的語言 (以及國家或地區方言)。

如需各項功能支援的語言完整清單,請前往「語言支援」頁面。

時間偏移 (時間戳記)

Cloud STT 可包含時間偏移值 (時間戳記),用以表示在提供的音訊中辨識出的每個所說字詞的開始與結束。時間偏移值代表從音訊開始起算經過的時間量,以 100 毫秒為遞增量。

時間偏移在分析較長的音訊檔案時特別實用,因為在此情況下,您可能需要在經過辨識的文字中搜尋特定字詞,並在原始音訊中找出該字詞 (搜尋)。所有辨識方法都支援時間偏移:recognizestreamingrecognizelongrunningrecognize

系統僅會在辨識回應中提供的第一個替代轉錄加上時間偏移值。

如要在要求結果中納入時間偏移,請在要求設定中將 enableWordTimeOffsets 參數設為 true。如需使用 REST API 或用戶端程式庫的範例,請參閱「使用時間偏移 (時間戳記)」。舉例來說,您可以在要求設定中加入 enableWordTimeOffsets 參數,如下所示:

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

Cloud 語音轉文字 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,
          }
        ]
      }
    ]
  }
}

多種模型供您選擇

Cloud STT 可以使用數種機器學習「模型」的其中一種來轉錄音訊檔案。Google 已針對特定語音類型與來源,對這些語音辨識模型進行訓練。

當您將音訊轉錄要求傳送至 Cloud STT 時,可以指定原始音訊的來源來改善收到的結果。指定來源可以讓 Cloud Speech-to-Text API 使用經過訓練,可辨識出來自該特定來源資料的語音機器學習模型來處理音訊檔案。

如要為語音辨識指定模型,請將 model 欄位加入要求的 RecognitionConfig 物件中,即可指定您要使用的模型。

如需可用的機器學習模型,請參閱 Cloud STT 轉錄模型清單

內嵌音訊內容

在要求的 audio 欄位中傳遞 content 參數時,語音辨識要求會納入內嵌音訊。如果是以 gRPC 要求內提供的內容形式嵌入音訊,該音訊必須與 Proto3 序列化相容,並以二進位資料形式提供。針對 REST 要求內做為內容提供的嵌入音訊,該音訊必須與 JSON 序列化作業相容,且必須先採用 Base64 編碼。詳情請參閱「Base64 編碼音訊」。

使用 Google Cloud 用戶端程式庫建構要求時,您通常會直接在 content 欄位中填入這項二進位 (或採用 base-64 編碼的) 資料。

傳送 URI 參照的音訊

更常見的做法是在語音要求的 audio 欄位中傳遞 uri 參數,指向 Cloud Storage 中以下列格式儲存的音訊檔案 (二進位格式,而非 Base64):

gs://bucket-name/path_to_audio_file

例如,下列 Speech 要求部分參照在快速入門中使用的範例音訊檔案:

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

您必須具備適當的存取權限,才能讀取 Cloud Storage 檔案,例如:

  • 可公開讀取 (例如我們的範例音訊檔案)
  • 可由您的服務帳戶讀取 (如果使用服務帳戶授權的話)。
  • 可由使用者帳戶讀取 (如果為使用者帳戶授權使用三足式 OAuth 的話)。

如要進一步瞭解如何管理 Cloud Storage 存取權,請參閱 Cloud Storage 說明文件中的「建立及管理存取權控管清單」。

Cloud Speech-to-Text API 回應

如先前所述,同步 Cloud Speech-to-Text API 回應可能需要一段時間才能傳回結果,時間長度與提供的音訊長度成正比。處理完畢後,API 會傳回回應,如下列程式碼區塊所示:

{
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.98267895,
          "transcript": "how old is the Brooklyn Bridge"
        }
      ]
    }
  ]
}
  • results 包含結果 (類型為 SpeechRecognitionResult) 清單,當中每一項結果都會對應到一段音訊 (多段音訊由暫停分隔)。每項結果都是由下列一或多個欄位組成:
    • alternatives 包含可能的轉錄清單 (類型為 SpeechRecognitionAlternatives)。系統是否會顯示多個替代轉錄,取決於您是否要求多個替代轉錄 (透過將 maxAlternatives 設定為大於 1 的值),以及 Cloud STT 產生的替代轉錄品質是否夠高。每個替代轉錄都包含下列欄位:
      • transcript 包含轉錄的文字。請參閱「處理轉錄」。
      • confidence 包含介於 01 之間的值,表示 Cloud STT 對指定轉錄的信心程度。請參閱「解讀信心值」。

這個回應的元件在下列各節進行說明。

選取替代方案

成功同步辨識回應內的每個結果都可以包含一或多個 alternatives (如果要求的 maxAlternatives 值大於 1)。如果 Cloud STT 判斷某個替代轉錄擁有足夠的信心值,則會將該替代轉錄包含在回應中。回應中的第一個替代轉錄一律為最佳 (最可能) 的替代轉錄。

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.01.0 之間的預估值,計算方式是彙整音訊中每個字詞的「可能性」值。數字越高,表示系統估計個別字詞的辨識正確率越高。這個欄位通常只會提供最佳假設,且僅適用於 is_final=true 的結果。舉例來說,您可以使用 confidence 值,決定是否向使用者顯示替代結果,或要求使用者確認。

不過請注意,模型會根據比 confidence 分數更多的信號 (例如句子脈絡),判斷「最佳」結果並排序。因此,有時最高信賴度分數的結果並非排名第一。如果未要求多個替代結果,傳回的單一「最佳」結果可信度值可能低於預期。舉例來說,如果使用罕見字詞,就可能發生這種情況。即使系統正確辨識出某個字詞,如果該字詞很少使用,也可能會被指派較低的「可能性」值。如果模型根據內容判斷罕見字詞是最有可能的選項,即使結果的 confidence 值低於其他選項,該結果仍會顯示在最上方。

非同步要求與回應

LongRunningRecognize 方法提出的非同步 Cloud Speech-to-Text API 要求,與同步 Cloud 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"
  }
}

請注意,目前尚未顯示任何結果。Cloud STT 會繼續處理音訊,並使用這項作業儲存結果。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 的結果,這種類型與同步 Cloud Speech-to-Text API 辨識要求傳回的類型相同。

串流 Cloud Speech-to-Text API 辨識要求

串流 Cloud Speech-to-Text API 辨識呼叫的用途,是在雙向串流中即時擷取及辨識音訊。您的應用程式可在要求串流中傳送音訊,並在回應串流中即時接收暫時與最終辨識結果。暫時結果代表一部分音訊的目前辨識結果,而最終辨識結果代表這部分音訊最後、最接近的猜測。

串流要求

與同步和非同步呼叫在單一要求內傳送設定和音訊不同,呼叫串流 Speech API 需要傳送多個要求。第一個 StreamingRecognizeRequest 必須包含類型為 StreamingRecognitionConfig 的設定,但不含任何隨附音訊。透過相同串流傳送的後續 StreamingRecognizeRequest 會包含連續的原始音訊位元組影格。

StreamingRecognitionConfig 包含下列欄位:

  • config:必要欄位。包含音訊的設定資訊 (類型為 RecognitionConfig),且與同步和非同步要求內顯示的設定相同。
  • single_utterance:(選填,預設為 false) 表示這項要求是否要在系統偵測不到語音後自動結束。如果設定這個欄位,Cloud STT 將偵測暫停、靜音或非語音音訊,以判斷何時停止辨識。如果沒有設定,串流會繼續聆聽並處理音訊,直到您直接關閉串流,或者串流超出長度限制為止。將 single_utterance 設定為 true 有助於處理語音指令。
  • interim_results:(選填,預設為 false) 表示這項串流要求應傳回暫時結果,這類結果可能會在稍後 (處理更多音訊之後) 進行修正。如果回應中的 is_final 設為 false,即可得知是暫時結果。

逐句顯示回覆

串流語音辨識結果會在一連串 StreamingRecognitionResponse 類型的回應中傳回。這類回應包含下列欄位:

  • speechEventType 包含類型為 SpeechEventType 的事件。這類事件的值會指出何時將單一語音內容判斷為已完成。語音事件會在您的串流回應中做為標記使用。
  • results 包含類型為 StreamingRecognitionResult 的結果清單,這些結果可能為暫時結果,也可能為最終結果。results 清單包含下列子欄位:
    • alternatives 包含替代轉錄的清單。
    • isFinal 表示在這個清單項目內取得的結果是暫時結果還是最終結果。Google 可能會在單一串流中傳回多個 isFinal=true 結果,但只有在寫入串流關閉 (半關閉) 後,才能保證 isFinal=true 結果。
    • stability 表示到目前為止所得結果的波動率,其中 0.0 表示完全不穩定,而 1.0 表示完全穩定。請注意,stability 表示系統預估某些結果發生變更的可能性,信心值則是指系統預估轉錄結果的正確程度,兩者並不相同。如果 isFinal 設為 true,系統就不會設定 stability