本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定串流轉錄
本節擴充主要串流傳輸部分。其目的是為想要使用 HTTP/2 或 WebSockets 直接設定串流的使用者提供資訊,而不是使用 AWS SDK。本節中的資訊也可用於建置您自己的 SDK。
重要
我們強烈建議使用 SDKs,而不是直接使用 HTTP/2 和 WebSockets 。SDKs 是轉錄資料串流最簡單且最可靠的方法。若要使用 開始串流 AWS SDK,請參閱 使用 SDK 進行轉錄 AWS。
使用 串流轉錄請求的 HTTP/2 通訊協定
注意
Amazon Transcribe 每個 HTTP/2 工作階段僅支援一個串流。如果您嘗試使用多個串流,轉錄要求會失敗。
-
將下列政策連接至發出請求 IAM 的角色。如需詳細資訊,請參閱新增 IAM 政策。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "
my-transcribe-http2-policy
", "Effect": "Allow", "Action": "transcribe:StartStreamTranscription
", "Resource": "*" } ] } -
若要開始工作階段,請將 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:YYYYMMDD
THHMMSS
Z 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
-
建立包含音訊資料的音訊事件。將下表中所述的標頭與音訊位元組塊結合,成為事件編碼訊息。若要建立事件訊息的承載,請以原始位元組格式使用緩衝區。
標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (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==
-
建立音訊訊息,其中包含您的音訊資料。
-
您的資訊訊息資料框架包含事件編碼標頭,其中包含目前日期,以及音訊區塊和音訊事件的簽章。
標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 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 -
如 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:包含音訊事件資料的位元組緩衝區。
-
-
從 AWS 秘密存取金鑰衍生簽署金鑰,並使用它來簽署
stringToSign
。為了提供更大程度的保護,衍生的金鑰有專屬的日期、服務和 AWS 區域。如需詳細資訊,請參閱 AWS Signature 第 4 版的計算簽章。確保您實作該
GetSignatureKey
函數以衍生出您的簽名密鑰。如果您尚未衍生出簽名密鑰,請參閱 Signature 第 4 版中如何衍生簽名密鑰的範例。String signature = HMACSHA256(derivedSigningKey, stringToSign);
-
HMACSHA256:使用 SHA-256 雜湊函數建立簽章的函數。
-
derivedSigningKey:簽章第 4 版簽署金鑰。
-
stringToSign:您為資料影格計算的字串。
在計算資料框架的簽章之後,請建構位元組緩衝區,其中包含日期、簽章和音訊事件承載。將位元組陣列傳送到 Amazon Transcribe 以進行轉錄。
-
-
-
若要指出音訊串流完成,請傳送結束框架 (空資料框架),其中僅包含日期和簽章。您建構該結束框架的方式與您建構資料框架的方式相同。
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
] } } -
若要結束串流,請將空白音訊事件傳送至 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 每個 WebSocket 工作階段僅支援一個串流。如果您嘗試使用多個串流,轉錄要求會失敗。
-
將下列政策連接至發出請求 IAM 的角色。如需詳細資訊,請參閱新增 IAM 政策。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "
my-transcribe-websocket-policy
", "Effect": "Allow", "Action": "transcribe:StartStreamTranscriptionWebSocket
", "Resource": "*" } ] } -
若要開始工作階段,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=YYYYMMDD
THHMMSS
Z &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 簽章 ,請參閱下列步驟。範例是虛擬程式碼。
-
建立正式請求。正式請求是其中包括來自您的請求的資訊的字串 (使用標準化格式)。這可確保 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 =YYYYMMDD
THHMMSS
Z # Date without time for credential scope datestamp =YYYYMMDD
-
建立標準 URI,這是網域與查詢字串URI之間 的一部分。
canonical_uri = "/stream-transcription-websocket"
-
建立正式標頭和已簽章標頭。請注意正式標頭中的結尾
\n
。-
附加小寫標頭名稱,後面接著冒號 ( : )。
-
為該標頭附加逗號分隔的值清單。不要在有多個值的標頭中排序值。
-
附加新的一行 (
\n
)。
canonical_headers = "host:" + host + "\n" signed_headers = "host"
-
-
演算法必須符合雜湊演算法。請使用
SHA-256
。algorithm = "AWS4-HMAC-SHA256"
-
建立憑證的範圍,將衍生的金鑰範圍限定於提出請求的日期、 AWS 區域和服務。例如:
。20220127
/us-west-2
/transcribe/aws4_requestcredential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
-
建立正式查詢字串。查詢字串值必須 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"
-
-
建立承載的雜湊。對於
GET
請求,承載為空字串。payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
-
結合下列元素以建立正式請求。
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
-
-
建立要簽署的字串,其中包含有關您的請求的中繼資料。您在下一個步驟計算請求簽章時,使用此字串登入。如需詳細資訊,請參閱 Signature 第 4 版的建立簽署字串。
string_to_sign=algorithm + "\n" + amz_date + "\n" + credential_scope + "\n" + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()
-
計算簽章。若要執行此操作,請從 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 函數。 -
將簽署資訊新增至請求並建立請求 URL。
您計算簽章之後,請將簽章新增到查詢字串。如需詳細資,請參閱新增簽章到請求。
首先將身分驗證資訊新增到查詢字串。
canonical_querystring += "&X-Amz-Signature=" + signature
其次,URL為請求建立 。
request_url = endpoint + canonical_uri + "?" + canonical_querystring
將請求URL與 WebSocket 程式庫搭配使用,以向 提出請求 Amazon Transcribe。
-
對 的請求 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
-
當 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 -
提出 WebSocket 串流請求。
建立 WebSocket 連線後,用戶端可以開始傳送一系列音訊影格,每個影格都使用事件串流編碼 進行編碼。
每個資料框架包含三個標頭並結合原始音訊位元組塊;下表描述這些標頭。
標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (UTF-8) 13 :content-type 7 24 application/octet-stream 11 :event-type 7 10 AudioEvent 13 :message-type 7 5 事件 -
若要結束資料串流,請將空的音訊串流區塊傳送到事件串流編碼的訊息中。
回應包含承載中的事件串流編碼的原始位元組。它包含標準序言和下列標頭。
標頭名稱位元組長度 標頭名稱 (字串) 標頭值類型 值字串位元組長度 值字串 (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 也會使用此編碼。
每則訊息包含兩個部分:序言和資料。序言包含:
-
訊息的總位元組長度
-
所有標頭的合併位元組長度
資料區段包含:
-
標頭
-
承載
每個區段以 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 串流,了解詳細資訊。
資料框架
每個串流請求都包含一或多個資料框架。建立資料框架的步驟有二:
-
結合原始音訊資料與中繼資料以建立您的請求的承載。
-
結合承載與簽章來形成傳送到 Amazon Transcribe的事件訊息。
下圖顯示此運作方式。