設定串流轉錄 - Amazon Transcribe

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定串流轉錄

本節擴充主要串流傳輸部分。其目的是為想要使用 HTTP/2 或 WebSockets 直接設定串流的使用者提供資訊,而不是使用 AWS SDK。本節中的資訊也可用於建置您自己的 SDK。

重要

我們強烈建議使用 SDKs,而不是直接使用 HTTP/2 和 WebSockets 。SDKs 是轉錄資料串流最簡單且最可靠的方法。若要使用 開始串流 AWS SDK,請參閱 使用 SDK 進行轉錄 AWS

使用 串流轉錄請求的 HTTP/2 通訊協定的關鍵元件 Amazon Transcribe 為:

  • 標頭框架。這包含請求的 HTTP/2 標頭,以及授權標頭中的簽章, Amazon Transcribe 以做為種子簽章來簽署資料影格。

  • 事件串流編碼中包含中繼資料和原始音訊位元組的一或多個訊息框架。

  • 結束框架。這是事件串流編碼中有空內文的簽章訊息。

注意

Amazon Transcribe 每個 HTTP/2 工作階段僅支援一個串流。如果您嘗試使用多個串流,轉錄要求會失敗。

  1. 將下列政策連接至發出請求 IAM 的角色。如需詳細資訊,請參閱新增 IAM 政策

    { "Version": "2012-10-17", "Statement": [ { "Sid": "my-transcribe-http2-policy", "Effect": "Allow", "Action": "transcribe:StartStreamTranscription", "Resource": "*" } ] }
  2. 若要開始工作階段,請將 HTTP/2 請求傳送至 Amazon Transcribe。

    POST /stream-transcription HTTP/2 host: transcribestreaming.us-west-2.amazonaws.com X-Amz-Target: com.amazonaws.transcribe.Transcribe.StartStreamTranscription Content-Type: application/vnd.amazon.eventstream X-Amz-Content-Sha256: string X-Amz-Date: YYYYMMDDTHHMMSSZ Authorization: AWS4-HMAC-SHA256 Credential=access-key/YYYYMMDD/us-west-2/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date;x-amz-target;x-amz-security-token, Signature=string x-amzn-transcribe-language-code: en-US x-amzn-transcribe-media-encoding: flac x-amzn-transcribe-sample-rate: 16000 transfer-encoding: chunked

    其他操作和參數會列在API參考 中;所有 AWS API操作常用的參數會列在通用參數區段中。

    Amazon Transcribe 會傳送下列回應:

    HTTP/2.0 200 x-amzn-transcribe-language-code: en-US x-amzn-transcribe-media-encoding: flac x-amzn-transcribe-sample-rate: 16000 x-amzn-request-id: 8a08df7d-5998-48bf-a303-484355b4ab4e x-amzn-transcribe-session-id: b4526fcf-5eee-4361-8192-d1cb9e9d6887 content-type: application/json
  3. 建立包含音訊資料的音訊事件。將下表中所述的標頭與音訊位元組塊結合,成為事件編碼訊息。若要建立事件訊息的承載,請以原始位元組格式使用緩衝區。

    標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8)
    13 :content-type 7 24 application/octet-stream
    11 :event-type 7 10 AudioEvent
    13 :message-type 7 5 事件

    此範例請求中的二進位資料是以 base64 編碼。在實際請求中,資料是原始位元組。

    :content-type: "application/vnd.amazon.eventstream" :event-type: "AudioEvent" :message-type: "event" UklGRjzxPQBXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YVTwPQAAAAAAAAAAAAAAAAD//wIA/f8EAA==
  4. 建立音訊訊息,其中包含您的音訊資料。

    1. 您的資訊訊息資料框架包含事件編碼標頭,其中包含目前日期,以及音訊區塊和音訊事件的簽章。

      標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 Value
      16 :chunk-signature 6 各有不同 產生的簽章
      5 :date 8 8 timestamp

      此請求中的二進位資料是以 base64 編碼。在實際請求中,資料是原始位元組。

      :date: 2019-01-29T01:56:17.291Z :chunk-signature: signature AAAA0gAAAIKVoRFcTTcjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0LOmV2ZW50LXR5 cGUHAApBdWRpb0V2ZW50DTptZXNzYWdlLXR5cGUHAAVldmVudAxDb256ZW50LVR5cGUHABphcHBsaWNhdGlv bi94LWFtei1qc29uLTEuMVJJRkY88T0AV0FWRWZtdCAQAAAAAQABAIA+AAAAfQAAAgAQAGRhdGFU8D0AAAAA AAAAAAAAAAAA//8CAP3/BAC7QLFf
    2. Signature 第 4 版中的建立字串以簽署所述,建構要簽署的字串。您的字串遵循以下格式:

      String stringToSign = "AWS4-HMAC-SHA256" + "\n" + DateTime + "\n" + Keypath + "\n" + Hex(priorSignature) + "\n" + HexHash(nonSignatureHeaders) + "\n" + HexHash(payload);
      • DateTime:建立簽章的日期和時間。格式為 YYYYMMDDTHHMMSSZ,其中 YYYY=year、MM=month、DD=day、HH=hour、MM=minute、SS=seconds 和 'T' 和 'Z' 是固定字元。如需詳細資訊,請參閱 Signature 第 4 版的處理日期

      • Keypath:格式 date/region/service/aws4_request 中的簽章範圍。例如:20220127/us-west-2/transcribe/aws4_request

      • Hex:此函數會將其輸入編碼為十六進位表示法。

      • priorSignature:上一個影格的簽章。對於第一個資料框架,請使用標頭框架的簽章。

      • HexHash:函數會先建立其輸入的 SHA-256 雜湊,然後使用十六進位函數來編碼雜湊。

      • nonSignatureHeaders:編碼為字串的 DateTime 標頭。

      • payload:包含音訊事件資料的位元組緩衝區。

    3. 從 AWS 秘密存取金鑰衍生簽署金鑰,並使用它來簽署 stringToSign。為了提供更大程度的保護,衍生的金鑰有專屬的日期、服務和 AWS 區域。如需詳細資訊,請參閱 AWS Signature 第 4 版的計算簽章

      確保您實作該 GetSignatureKey 函數以衍生出您的簽名密鑰。如果您尚未衍生出簽名密鑰,請參閱 Signature 第 4 版中如何衍生簽名密鑰的範例

      String signature = HMACSHA256(derivedSigningKey, stringToSign);
      • HMACSHA256:使用 SHA-256 雜湊函數建立簽章的函數。

      • derivedSigningKey:簽章第 4 版簽署金鑰。

      • stringToSign:您為資料影格計算的字串。

      在計算資料框架的簽章之後,請建構位元組緩衝區,其中包含日期、簽章和音訊事件承載。將位元組陣列傳送到 Amazon Transcribe 以進行轉錄。

  5. 若要指出音訊串流完成,請傳送結束框架 (空資料框架),其中僅包含日期和簽章。您建構該結束框架的方式與您建構資料框架的方式相同。

    Amazon Transcribe 會以轉錄事件串流回應,並傳送至您的應用程式。該回應是以事件串流編碼。它包含標準序言和下列標頭。

    標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8)
    13 :content-type 7 16 application/json
    11 :event-type 7 15 TranscriptEvent
    13 :message-type 7 5 事件

    事件是以原始位元組格式傳送。在這個範例中,位元組是以 base64 編碼的。

    AAAAUwAAAEP1RHpYBTpkYXRlCAAAAWiXUkMLEDpjaHVuay1zaWduYXR1cmUGACCt6Zy+uymwEK2SrLp/zVBI 5eGn83jdBwCaRUBJA+eaDafqjqI=

    若要查看轉錄結果,請使用事件串流編碼,將原始位元組解碼。

    :content-type: "application/vnd.amazon.eventstream" :event-type: "TranscriptEvent" :message-type: "event" { "Transcript": { "Results": [ results ] } }
  6. 若要結束串流,請將空白音訊事件傳送至 Amazon Transcribe。建立與任何其他音訊事件完全相同的音訊事件,但具有空承載。簽署事件,並將簽章併入 :chunk-signature 標頭中,如下所示:

    :date: 2019-01-29T01:56:17.291Z :chunk-signature: signature

處理 HTTP/2 串流錯誤

如果在處理媒體串流時發生錯誤, 會 Amazon Transcribe 傳送例外狀況回應。回應是以事件串流編碼的。

回應包含標準序言和下列標頭:

標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8)
13 :content-type 7 16 application/json
11 :event-type 7 19 BadRequestException
13 :message-type 7 9 例外狀況

當異常回應解碼時,它包含下列資訊:

:content-type: "application/vnd.amazon.eventstream" :event-type: "BadRequestException" :message-type: "exception" Exception message

使用 串流轉錄請求的WebSocket通訊協定的關鍵元件 Amazon Transcribe 為:

  • 升級請求。這包含請求的查詢參數,以及 Amazon Transcribe 使用 作為種子簽章來簽署資料影格的簽章。

  • 事件串流編碼中包含中繼資料和原始音訊位元組的一或多個訊息框架。

  • 結束框架。這是事件串流編碼中有空內文的簽章訊息。

注意

Amazon Transcribe 每個 WebSocket 工作階段僅支援一個串流。如果您嘗試使用多個串流,轉錄要求會失敗。

  1. 將下列政策連接至發出請求 IAM 的角色。如需詳細資訊,請參閱新增 IAM 政策

    { "Version": "2012-10-17", "Statement": [ { "Sid": "my-transcribe-websocket-policy", "Effect": "Allow", "Action": "transcribe:StartStreamTranscriptionWebSocket", "Resource": "*" } ] }
  2. 若要開始工作階段,URL請以下列格式建立預先簽章的 。已加入分行符號以提高可讀性。

    GET wss://transcribestreaming.us-west-2.amazonaws.com:8443/stream-transcription-websocket? &X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=access-key%2FYYYYMMDD%2Fus-west-2%2Ftranscribe%2Faws4_request &X-Amz-Date=YYYYMMDDTHHMMSSZ &X-Amz-Expires=300 &X-Amz-Security-Token=security-token &X-Amz-Signature=string &X-Amz-SignedHeaders=content-type%3Bhost%3Bx-amz-date &language-code=en-US &media-encoding=flac &sample-rate=16000
    注意

    X-Amz-Expires 的最大值為 300(5 分鐘)。

    其他操作和參數會列在API參考 中;所有 AWS API操作常用的參數會列在通用參數區段中。

    若要URL為您的請求建構 並建立 Signature Version 4 簽章 ,請參閱下列步驟。範例是虛擬程式碼。

    1. 建立正式請求。正式請求是其中包括來自您的請求的資訊的字串 (使用標準化格式)。這可確保 AWS 收到請求時,它可以計算您為 建立的相同簽章URL。如需詳細資訊,請參閱 Signature 第 4 版的建立正式請求

      # HTTP verb method = "GET" # Service name service = "transcribe" # Region region = "us-west-2" # Amazon Transcribe streaming endpoint endpoint = "wss://transcribestreaming.us-west-2.amazonaws.com:8443" # Host host = "transcribestreaming.us-west-2.amazonaws.com:8443" # Date and time of request amz-date = YYYYMMDDTHHMMSSZ # Date without time for credential scope datestamp = YYYYMMDD
    2. 建立標準 URI,這是網域與查詢字串URI之間 的一部分。

      canonical_uri = "/stream-transcription-websocket"
    3. 建立正式標頭和已簽章標頭。請注意正式標頭中的結尾 \n

      • 附加小寫標頭名稱,後面接著冒號 ( : )。

      • 為該標頭附加逗號分隔的值清單。不要在有多個值的標頭中排序值。

      • 附加新的一行 (\n)。

      canonical_headers = "host:" + host + "\n" signed_headers = "host"
    4. 演算法必須符合雜湊演算法。請使用 SHA-256

      algorithm = "AWS4-HMAC-SHA256"
    5. 建立憑證的範圍,將衍生的金鑰範圍限定於提出請求的日期、 AWS 區域和服務。例如:20220127/us-west-2/transcribe/aws4_request

      credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
    6. 建立正式查詢字串。查詢字串值必須 URI- 編碼並依名稱排序。

      • 依照字元字碼指標的參數名稱遞增排序。​具有重複名稱的參數應依數值排序。例如,以大寫字母 F 開頭的參數名稱,放在以小寫字母 b 開頭的參數名稱之前。

      • 請勿 URI-編碼 3986 RFC 定義的任何未保留字元:A-Z、a-z、0-9、連字號 ( - )、底線 ( _ )、句點 ( . ) 和波浪 ( ~ )。

      • 對所有其他含有 %XY 的字元執行百分比編碼,其中 X 和 Y 是十六進位字元 (0-9 和大寫 A-F)。例如,空格字元必須編碼為 %20 (不包括 '+',如同某些編碼方案);延伸的 UTF-8 個字元必須是 %XY%ZA%BC 格式。

      • 對參數值中的任何等於 (=) 字元進行雙倍編碼。

      canonical_querystring = "X-Amz-Algorithm=" + algorithm canonical_querystring += "&X-Amz-Credential="+ URI-encode(access key + "/" + credential_scope) canonical_querystring += "&X-Amz-Date=" + amz_date canonical_querystring += "&X-Amz-Expires=300" canonical_querystring += "&X-Amz-Security-Token=" + token canonical_querystring += "&X-Amz-SignedHeaders=" + signed_headers canonical_querystring += "&language-code=en-US&media-encoding=flac&sample-rate=16000"
    7. 建立承載的雜湊。對於 GET 請求,承載為空字串。

      payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
    8. 結合下列元素以建立正式請求。

      canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
  3. 建立要簽署的字串,其中包含有關您的請求的中繼資料。您在下一個步驟計算請求簽章時,使用此字串登入。如需詳細資訊,請參閱 Signature 第 4 版的建立簽署字串

    string_to_sign=algorithm + "\n" + amz_date + "\n" + credential_scope + "\n" + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()
  4. 計算簽章。若要執行此操作,請從 AWS 秘密存取金鑰衍生簽署金鑰。為了提供更大程度的保護,衍生的金鑰有專屬的日期、服務和 AWS 區域。您使用衍生的金鑰以簽署請求。如需詳細資訊,請參閱計算簽章第 4 版的 AWS 簽章

    確保您實作該 GetSignatureKey 函數以衍生出您的簽名密鑰。如果您尚未衍生出簽名密鑰,請參閱 Signature 第 4 版中如何衍生簽名密鑰的範例

    #Create the signing key signing_key = GetSignatureKey(secret_key, datestamp, region, service) # Sign the string_to_sign using the signing key signature = HMAC.new(signing_key, (string_to_sign).Encode("utf-8"), Sha256()).HexDigest

    函數HMAC(key, data)代表以二進位格式傳回結果的 HMAC-SHA256 函數。

  5. 將簽署資訊新增至請求並建立請求 URL。

    您計算簽章之後,請將簽章新增到查詢字串。如需詳細資,請參閱新增簽章到請求

    首先將身分驗證資訊新增到查詢字串。

    canonical_querystring += "&X-Amz-Signature=" + signature

    其次,URL為請求建立 。

    request_url = endpoint + canonical_uri + "?" + canonical_querystring

    將請求URL與 WebSocket 程式庫搭配使用,以向 提出請求 Amazon Transcribe。

  6. 對 的請求 Amazon Transcribe 必須包含下列標頭。這些標頭通常由 WebSocket 用戶端程式庫管理。

    Host: transcribestreaming.us-west-2.amazonaws.com:8443 Connection: Upgrade Upgrade: websocket Origin: URI-of-WebSocket-client Sec-WebSocket-Version: 13 Sec-WebSocket-Key: randomly-generated-string
  7. 當 Amazon Transcribe 收到您的 WebSocket 請求時,它會以 WebSocket 升級回應來回應。通常,您的 WebSocket 程式庫會管理此回應,並設定與 通訊的通訊端 Amazon Transcribe。

    以下是 的回應 Amazon Transcribe。已加入分行符號以提高可讀性。

    HTTP/1.1 101 WebSocket Protocol Handshake Connection: upgrade Upgrade: websocket websocket-origin: wss://transcribestreaming.us-west-2.amazonaws.com:8443 websocket-location: transcribestreaming.us-west-2.amazonaws.com:8443/stream-transcription-websocket? &X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20220208%2Fus-west-2%2Ftranscribe%2Faws4_request &X-Amz-Date=20220208T235959Z &X-Amz-Expires=300 &X-Amz-Signature=Signature Version 4 signature &X-Amz-SignedHeaders=host &language-code=en-US &session-id=String &media-encoding=flac &sample-rate=16000 x-amzn-RequestId: RequestId Strict-Transport-Security: max-age=31536000 sec-websocket-accept: hash-of-the-Sec-WebSocket-Key-header
  8. 提出 WebSocket 串流請求。

    建立 WebSocket 連線後,用戶端可以開始傳送一系列音訊影格,每個影格都使用事件串流編碼 進行編碼

    每個資料框架包含三個標頭並結合原始音訊位元組塊;下表描述這些標頭。

    標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8)
    13 :content-type 7 24 application/octet-stream
    11 :event-type 7 10 AudioEvent
    13 :message-type 7 5 事件
  9. 若要結束資料串流,請將空的音訊串流區塊傳送到事件串流編碼的訊息中。

    回應包含承載中的事件串流編碼的原始位元組。它包含標準序言和下列標頭。

    標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8)
    13 :content-type 7 16 application/json
    11 :event-type 7 15 TranscriptEvent
    13 :message-type 7 5 事件

    當您解碼二進位回應時,最後會有一個包含轉錄結果的JSON結構。

處理 WebSocket 串流錯誤

如果在處理您的請求時發生例外狀況, Amazon Transcribe 會回應包含事件串流編碼回應的終端機 WebSocket 影格。該回應包含下表中所述的標頭;回應的內文包含描述性錯誤訊息。傳送例外狀況回應後, 會 Amazon Transcribe 傳送關閉影格。

標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8)
13 :content-type 7 16 application/json
15 :exception-type 7 各有不同 各有不同,請參閱以下內容
13 :message-type 7 9 例外狀況

exception-type 標頭包含以下其中一個值。

  • BadRequestException:建立串流時發生用戶端錯誤,或串流資料時發生錯誤。請確定您的用戶端已準備好接受資料,並再次嘗試請求。

  • InternalFailureException:在與用戶端交握期間 Amazon Transcribe 發生問題。請再次嘗試您的請求。

  • LimitExceededException:用戶端超過並行串流限制。如需詳細資訊,請參閱Amazon Transcribe 限制。減少正在轉錄的串流數量。

  • UnrecognizedClientException:使用不正確的存取金鑰或秘密金鑰簽署 WebSocket 升級請求。請確定您正確建立存取金鑰,並再次嘗試請求。

Amazon Transcribe 也可以傳回任何常見的服務錯誤。如需清單,請參閱常見錯誤

事件串流編碼

Amazon Transcribe 使用稱為事件串流編碼的格式進行串流轉錄。

事件串流編碼會在用戶端與伺服器之間提供雙向通訊。傳送至 Amazon Transcribe 串流服務的資料影格會以此格式編碼。的回應 Amazon Transcribe 也會使用此編碼。

每則訊息包含兩個部分:序言和資料。序言包含:

  1. 訊息的總位元組長度

  2. 所有標頭的合併位元組長度

資料區段包含:

  1. 標頭

  2. 承載

每個區段以 4 位元組大端點整數循環備援檢查 (CRC) 總和檢查碼結尾。訊息總和CRC檢查碼適用於 預先定義區段和資料區段。 Amazon Transcribe 會使用 CRC32(通常稱為 GZIP CRC32) 來計算兩者 CRCs。如需 的詳細資訊CRC32,請參閱GZIP檔案格式規格 4.3 版。

總訊息額外負荷 (包括序言和兩個檢查總和) 為 16 位元組。

下圖顯示構成訊息和標題的元件。每則訊息有多個標頭。

訊息元件的示意圖,以及串流轉錄的標頭。

每則訊息都包含下列元件:

  • 序言:由兩個 4 位元組欄位組成,總數固定為 8 個位元組。

    • 前 4 個位元組:這是整個訊息的大端序整數位元組長度,包括 4 位元組長度欄位。

    • 次 4 個位元組:這是訊息「標頭」部分的大端序整數位元組長度,不含「標頭」長度欄位本身。

  • Prelude CRC:訊息的 prelude 部分的 4 位元組總和CRC檢查碼,不包括 CRC本身。前置詞CRC與訊息 有單獨的 CRC。這可確保 Amazon Transcribe 可立即偵測損毀的位元組長度資訊,而不會造成錯誤,例如緩衝區超載。

  • 標頭:註釋訊息的中繼資料;例如訊息類型、訊息類型和內容類型。訊息具有多個標頭,這些標頭是金鑰:值對,其中金鑰是 UTF-8 字串。標頭可以任何順序出現在訊息的標頭部分中,而且每個標頭只能出現一次。

  • 承載:要轉錄的音訊內容。

  • 訊息 CRC:從訊息開始到CRC檢查總和開始的 4 位元組檢查總和。也就是說,除了 CRC本身之外,訊息中的所有內容。

標頭影格是串流轉錄的授權影格。 Amazon Transcribe 會使用授權標頭的值作為種子,為請求中的資料影格產生授權鏈標頭。

每個標頭都包含下列元件;每個框架有多個標頭。

  • 標頭名稱位元組長度:標頭名稱的位元組長度。

  • 標頭名稱:指出標頭類型的標頭名稱。如需有效值,請參閱下列框架描述。

  • 標頭值類型:指出標頭值的數字。下列清單顯示標頭的可能值及其指示內容。

    • 0 – TRUE

    • 1 – FALSE

    • 2 – BYTE

    • 3 – SHORT

    • 4 – INTEGER

    • 5 – LONG

    • 6 – BYTE ARRAY

    • 7 – STRING

    • 8 – TIMESTAMP

    • 9 – UUID

  • 數值字串位元組長度:標頭值字串的位元組長度。

  • 標頭值:標頭字串的值。此欄位的有效值取決於標頭類型。請參閱 設定 HTTP/2 串流設定 WebSocket 串流,了解詳細資訊。

資料框架

每個串流請求都包含一或多個資料框架。建立資料框架的步驟有二:

  1. 結合原始音訊資料與中繼資料以建立您的請求的承載。

  2. 結合承載與簽章來形成傳送到 Amazon Transcribe的事件訊息。

下圖顯示此運作方式。

串流轉錄的資料框架元件。