

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

# 轉錄串流音訊
<a name="streaming"></a>

使用 Amazon Transcribe 串流，您可以為媒體內容產生即時轉錄。與涉及上傳媒體檔案的批次轉錄不同，串流媒體會 Amazon Transcribe 即時交付至 。 Amazon Transcribe 然後， 也會即時傳回文字記錄。

串流媒體可以包括預先錄製的媒體 (電影、音樂和播客) 和即時媒體 (實況新聞廣播)。的常見串流使用案例 Amazon Transcribe 包括運動賽事的即時隱藏式字幕，以及呼叫中心音訊的即時監控。

串流內容會以一系列連續資料封包或 Amazon Transcribe 即時轉錄的「區塊」形式提供。批次使用串流的優點包括應用程式中的即時語音轉文字功能，以及更快的轉錄時間。但是，在某些情況下，轉錄速度加快可能導致準確性有限。

Amazon Transcribe 提供下列串流選項：
+ [軟體開發套件](getting-started-sdk.md) (首選)
+ [HTTP/2](streaming-setting-up.md#streaming-http2)
+ [WebSockets](streaming-setting-up.md#streaming-websocket)
+ [AWS 管理主控台](https://console.aws.amazon.com/transcribe/)

若要轉錄 中的串流音訊 AWS 管理主控台，請對著電腦麥克風說話。

**提示**  
如需 SDK 程式碼範例，請參閱 GitHub 上的[AWS 範例儲存庫](https://github.com/orgs/aws-samples/repositories?language=&q=transcribe&sort=&type=all)。

串流轉錄支援的音訊格式為：
+ FLAC
+ Ogg 容器中的 OPUS 編碼音訊
+ PCM(僅簽名 16 位小端序音訊格式，**不**包括 WAV)

建議使用無失真格式 (FLAC 或 PCM)。

**注意**  
並非所有語言都支援串流轉錄。請參閱[支援語言表格](supported-languages.md)中的「資料輸入」欄，了解詳細資訊。

若要檢視串流轉錄的區域 Amazon Transcribe 可用性，請參閱：[Amazon Transcribe 端點和配額](https://docs.aws.amazon.com/general/latest/gr/transcribe.html#transcribe_region)。

## 最佳實務
<a name="best-practices"></a>

以下建議可提高串流轉錄效率：
+ 如果可能，請使用 PCM 編碼的音訊。
+ 確保您的串流盡可能即時取得。
+ 延遲需視音訊塊的大小。如果您可以依據音訊類型 (例如 PCM) 指定塊大小，請將每塊設定為 50 ms 和 200 ms 間。您可以利用下列公式計算音訊區塊大小：

  ```
  chunk_size_in_bytes = chunk_duration_in_millisecond / 1000 * audio_sample_rate * 2
  ```
+ 使用統一的塊大小。
+ 確保您正確指定音訊聲道的數量。
+ 對於單聲道 PCM 音訊，每個樣本由兩個位元組組成，因此每個塊應由偶數位元組組成。
+ 對於雙聲道 PCM 音訊，每個樣本由四個位元組組成，因此每個塊應該是 4 個位元組的倍數。
+ 您的音訊串流不包含語音時，請編碼並傳送相同數量的靜音。例如，PCM 的靜音是零位元組的串流。
+ 請務必為您的音訊指定正確的取樣率。如果可能，請以 16,000 Hz 的取樣率錄製；在品質和透過網路傳送的資料量間取得最佳平衡。請注意，多數高階麥克風的錄音速度為 44,100 Hz 或 48,000 Hz。

# 串流和部分結果
<a name="streaming-partial-results"></a>

由於串流可即時運作，因此會以*部分結果*產生文字記錄。 會根據自然語音區段 Amazon Transcribe 中斷傳入的音訊串流，例如喇叭變更或音訊暫停。系統會傳回轉錄事件串流中您的應用程式，每次回應皆會包含更多轉錄的語音，直到整個區段轉錄完成。

如下列程式碼區塊所示的近似值。您可以登入 [AWS 管理主控台](https://console.aws.amazon.com/transcribe/)，選擇**即時轉錄**並對著麥克風說話，以檢視執行中的流程。說話時，看著**轉錄輸出**窗格。

在此範例中，每一行都是音訊區段的部分結果。

```
The      
The Amazon.
The Amazon is
The Amazon is the law.
The Amazon is the largest
The Amazon is the largest ray
The Amazon is the largest rain for
The Amazon is the largest rainforest.
The Amazon is the largest rainforest on the
The Amazon is the largest rainforest on the planet.
```

部分結果會在 [https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_Result.html](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_Result.html) 物件內的轉錄輸出中顯示。此物件區塊中還有一個 **IsPartial** 欄位。如果此欄位為 true，代表您的轉錄區段尚未完成。您可以在下方檢視不完整區段與完整區段之間的差異：

```
"IsPartial": true (incomplete segment)
            
"Transcript": "The Amazon is the largest rainforest."

"EndTime": 4.545,
"IsPartial": true,
"ResultId": "12345a67-8bc9-0de1-2f34-a5b678c90d12",
"StartTime": 0.025


"IsPartial": false (complete segment)
            
"Transcript": "The Amazon is the largest rainforest on the planet."

"EndTime": 6.025,
"IsPartial": false,
"ResultId": "34567e89-0fa1-2bc3-4d56-78e90123456f",
"StartTime": 0.025
```

*完整*區段的每個單字都有相關的可信度分數，是介於 `0` 和 `1` 間的值。較大的值表示正確轉錄單字的可能性更高。

**提示**  
音訊區段的 `StartTime` 和 `EndTime` 可用於同步轉錄輸出與視訊對話。

如果您執行的應用程式需要低延遲，您可能需要使用[部分結果穩定](#streaming-partial-result-stabilization)功能。

## 部分結果穩定
<a name="streaming-partial-result-stabilization"></a>

Amazon Transcribe 一旦您開始串流音訊， 就會開始傳回轉錄結果。它以遞增方式傳回這些部分結果，直到在自然語音區段層級產生完成的結果。自然語音區段是包含暫停或發言者改變的連續語音。

Amazon Transcribe 繼續輸出部分結果，直到產生語音區段的最終轉錄結果。由於語音辨識可能會在了解上下文時修改字詞，因此串流轉錄可能會隨著新的部分結果輸出而變化。

此流程提供每個語音區段兩個選項：
+ 等待完成的區段
+ 使用區段的部分結果

部分結果穩定功能會變更 為每個完整區段 Amazon Transcribe 產生最終轉錄結果的方式。啟動時，部分結果中僅最後幾個單字可以變更。因此，轉錄的準確性可能會受到影響。不過，傳回文字記錄的速度會在沒有部分結果穩定功能時更快。在為直播加上字幕或產生字幕時，可能會有助於減少延遲。

下列範例顯示部分結果穩定功能未啟動及啟動時，如何處理相同的音訊串流。請注意，您可以將穩定性等級設定為低、中或高。低穩定性提供最高的準確性。穩定性的轉錄速度更快，但準確性略低。


| 「文字記錄」： | 「EndTime」： | 「IsPartial」: | 
| --- | --- | --- | 
| 部分結果穩定功能未啟用 | 
|  <pre>The<br />The      <br />The Amazon.<br />The Amazon is<br />The Amazon is the law.<br />The Amazon is the largest<br />The Amazon is the largest ray<br />The Amazon is the largest rain for<br />The Amazon is the largest rainforest.<br />The Amazon is the largest rainforest on the<br />The Amazon is the largest rainforest on the planet.<br />The Amazon is the largest rainforest on the planet.<br />The Amazon is the largest rainforest on the planet.</pre>  |  <pre>0.545<br />1.045<br />1.545<br />2.045<br />2.545<br />3.045<br />3.545<br />4.045<br />4.545<br />5.045<br />5.545<br />6.025<br />6.025</pre>  |  <pre>true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />false</pre>  | 
| 啟用局部結果穩定 (高穩定性) | 
|  <pre>The<br />The<br />The Amazon.<br />The Amazon is<br />The Amazon is the large<br />The Amazon is the largest<br />The Amazon is the largest rainfall.<br />The Amazon is the largest rain forest.<br />The Amazon is the largest rain forest on<br />The Amazon is the largest rain forest on the planet.<br />The Amazon is the largest rain forest on the planet.<br />The Amazon is the largest rain forest on the planet.<br />The Amazon is the largest rain forest on the planet.<br />The Amazon is the largest rain forest on the planet.</pre>  |  <pre>0.515<br />1.015<br />1.515<br />2.015<br />2.515<br />3.015<br />3.515<br />4.015<br />4.515<br />5.015<br />5.515<br />6.015<br />6.335<br />6.335</pre>  |  <pre>true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />true<br />false</pre>  | 

當您啟用部分結果穩定功能時， Amazon Transcribe 會使用 `Stable` 欄位來指出項目是否穩定，其中 'item' 是指轉錄的字詞或標點符號。`Stable` 的值是 `true` 或 `false`。標記為 `false`(不穩定) 的項目在轉錄區段時更有可能改變。相反地，標記為 `true`(穩定) 的項目不會改變。

您可以選擇顯示不穩定的單字，讓字幕與語音保持一致。即使字幕隨著內容新增而稍有變更，這也是比週期性文字連發 (可能會或不會與語音一致) 更好的使用者體驗。

您也可以選擇以不同的格式，顯示不穩定的文字，例如斜體，讓觀眾知道這些單字可能會變更。顯示部分結果會限制指定時間內顯示的文字數量。您處理影片字幕，面臨空間限制問題時，這可能很重要。

**使用 AWS Machine Learning部落格深入探索**  
若要了解透過即時轉錄提升準確性的更多資訊，請參閱：  
[透過 Amazon Transcribe 部分結果穩定功能改善串流轉錄體驗](https://aws.amazon.com/blogs/machine-learning/amazon-transcribe-now-supports-partial-results-stabilization-for-streaming-audio/)
[「那是什麼？」 使用 Amazon Transcribe 提高直播的字幕準確性](https://aws.amazon.com/blogs/media/what-was-that-increasing-subtitle-accuracy-for-live-broadcasts-using-amazon-transcribe/)

### 部分結果穩定範例輸出
<a name="streaming-stabilization-output"></a>

下列範例輸出顯示不完整區段 (`"IsPartial": true`) 的 `Stable` 標記。您可以看到，單字「*到*」和「*Amazon*」是不穩定的，因此可能會在區段完成前變更。

```
"Transcript": {
    "Results": [
        {
            "Alternatives": [
                {
                    "Items": [
                        {
                            "Content": "Welcome",
                            "EndTime": 2.4225,
                            "Stable": true,
                            "StartTime": 1.65,
                            "Type": "pronunciation",
                            "VocabularyFilterMatch": false
                        },
                        { 
                            "Content": "to",
                            "EndTime": 2.8325,
                            "Stable": false,
                            "StartTime": 2.4225,
                            "Type": "pronunciation",
                            "VocabularyFilterMatch": false
                        },
                        {
                            "Content": "Amazon",
                            "EndTime": 3.635,
                            "Stable": false,
                            "StartTime": 2.8325,
                            "Type": "pronunciation",
                            "VocabularyFilterMatch": false
                        },
                        {
                            "Content": ".",
                            "EndTime": 3.635,
                            "Stable": false,
                            "StartTime": 3.635,
                            "Type": "punctuation",
                            "VocabularyFilterMatch": false
                        }
                    ],
                    "Transcript": "Welcome to Amazon."
                }
            ],
            "EndTime": 4.165,
            "IsPartial": true,
            "ResultId": "12345a67-8bc9-0de1-2f34-a5b678c90d12",
            "StartTime": 1.65
        }
    ]
}
```

# 設定串流轉錄
<a name="streaming-setting-up"></a>

本節擴充主要[串流傳輸](streaming.md)部分。它旨在為想要直接使用 HTTP/2 或 WebSockets 設定串流的使用者提供資訊，而不是使用 AWS SDK。本節中的資訊也可用於建置自己的 SDK。

**重要**  
我們強烈建議您使用 SDK，而不是直接使用 HTTP/2 和 WebSockets。SDK 是轉錄資料串流最簡單且最可靠的方法。若要使用 AWS SDK 開始串流，請參閱 [使用 AWS SDKs 轉錄](getting-started-sdk-streaming.md)。

## 設定 HTTP/2 串流
<a name="streaming-http2"></a>

使用 串流轉錄請求的 [HTTP/2 通訊協定](https://http2.github.io/)的關鍵元件 Amazon Transcribe 為：
+ 標頭框架。這包含請求的 HTTP/2 標頭，以及授權標頭中的簽章，以 Amazon Transcribe 做為種子簽章來簽署資料影格。
+ [事件串流編碼](#streaming-event-stream)中包含中繼資料和原始音訊位元組的一或多個訊息框架。
+ 結束框架。這是[事件串流編碼](#streaming-event-stream)中有空內文的簽章訊息。

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

1. 將下列政策連接至發出請求 IAM 的角色。如需詳細資訊，請參閱[新增 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policy-api)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "myTranscribeHttp2Policy",
               "Effect": "Allow",
               "Action": "transcribe:StartStreamTranscription",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 若要開始工作階段，請將 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 參考資料》](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_Reference.html)中列出其他操作和參數；所有 AWS API 操作的通用參數都會於[通用參數](https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonParameters.html)一節列出。

   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
   ```

1. 建立包含音訊資料的音訊事件。將下表中所述的標頭與音訊位元組塊結合，成為事件編碼訊息。若要建立事件訊息的承載，請以原始位元組格式使用緩衝區。    
<a name="table-http2-frame-diagram-event-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/streaming-setting-up.html)

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

   ```
   :content-type: "application/vnd.amazon.eventstream"
   :event-type: "AudioEvent"
   :message-type: "event"
   UklGRjzxPQBXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YVTwPQAAAAAAAAAAAAAAAAD//wIA/f8EAA==
   ```

1. 建立音訊訊息，其中包含您的音訊資料。

   1. 您的資訊訊息資料框架包含事件編碼標頭，其中包含目前日期，以及音訊區塊和音訊事件的簽章。    
<a name="table-http2-diagram-message-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/streaming-setting-up.html)

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

      ```
      :date: 2019-01-29T01:56:17.291Z
      :chunk-signature: signature
      
      AAAA0gAAAIKVoRFcTTcjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0LOmV2ZW50LXR5
      cGUHAApBdWRpb0V2ZW50DTptZXNzYWdlLXR5cGUHAAVldmVudAxDb256ZW50LVR5cGUHABphcHBsaWNhdGlv
      bi94LWFtei1qc29uLTEuMVJJRkY88T0AV0FWRWZtdCAQAAAAAQABAIA+AAAAfQAAAgAQAGRhdGFU8D0AAAAA
      AAAAAAAAAAAA//8CAP3/BAC7QLFf
      ```

   1. 如 [Signature 第 4 版中的建立字串以簽署](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html)所述，建構要簽署的字串。您的字串遵循以下格式：

      ```
      String stringToSign =
      "AWS4-HMAC-SHA256" +
      "\n" +
      DateTime +
      "\n" +
      Keypath +
      "\n" +
      Hex(priorSignature) +
      "\n" +
      HexHash(nonSignatureHeaders) +
      "\n" +
      HexHash(payload);
      ```
      + **DateTime**：建立簽名的日期和時間。格式為 YYYYMMDDTHHMMSSZ，其中 YYYY = 年，MM = 月，DD = 日，HH = 小時，MM = 分鐘，SS = 秒，而「T」和「Z」為固定字元。如需詳細資訊，請參閱 [Signature 第 4 版的處理日期](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html)。
      + **Keypath**：格式 `date/region/service/aws4_request` 中的簽章範圍。例如 `20220127/us-west-2/transcribe/aws4_request`。
      + **Hex**：此函數會將其輸入編碼為十六進位表示法。
      + **priorSignature**：前一個框架的簽章。對於第一個資料框架，請使用標頭框架的簽章。
      + **HexHash**：此函數首先建立其輸入的 SHA-256 雜湊，然後使用 Hex 函數進行編碼雜湊。
      + **nonSignatureHeaders**：編碼為字串的 DateTime 標頭。
      + **payload**：包含音訊事件資料的位元組緩衝區。

   1. 從 AWS 私密存取金鑰衍生簽署金鑰，並使用它來簽署 `stringToSign`。為了提供更大程度的保護，衍生的金鑰有專屬的日期、服務和 AWS 區域。如需詳細資訊，請參閱 [AWS Signature 第 4 版的計算簽章](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html)。

      確保您實作該 `GetSignatureKey` 函數以衍生出您的簽名密鑰。如果您尚未衍生出簽名密鑰，請參閱 [Signature 第 4 版中如何衍生簽名密鑰的範例](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html)。

      ```
      String signature = HMACSHA256(derivedSigningKey, stringToSign);
      ```
      + **HMACSHA256**：此函數會使用 SHA-256 雜湊函數以建立簽章。
      + **derivedSigningKey**：Signature 第 4 版簽名金鑰。
      + **stringToSign**：您針對資料框架計算的字串。

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

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

   Amazon Transcribe 會以轉錄事件串流回應，並傳送到您的應用程式。該回應是以事件串流編碼。它包含標準序言和下列標頭。    
<a name="table-http2-frame-response-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/streaming-setting-up.html)

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

   ```
   AAAAUwAAAEP1RHpYBTpkYXRlCAAAAWiXUkMLEDpjaHVuay1zaWduYXR1cmUGACCt6Zy+uymwEK2SrLp/zVBI
   5eGn83jdBwCaRUBJA+eaDafqjqI=
   ```

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

   ```
   :content-type: "application/vnd.amazon.eventstream"
   :event-type: "TranscriptEvent"
   :message-type: "event"
   
   {
       "Transcript":
           {
               "Results":
                   [
                       results
                   ]
           }
   }
   ```

1. 若要結束串流，請將空白音訊事件傳送至 Amazon Transcribe。建立與任何其他音訊事件完全相同的音訊事件，但具有空承載。簽署事件，並將簽章併入 `:chunk-signature` 標頭中，如下所示：

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

### 處理 HTTP/2 串流錯誤
<a name="http2-errors"></a>

如果在處理媒體串流時發生錯誤， 會 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 串流
<a name="streaming-websocket"></a>

使用 串流轉錄請求的 [WebSocket 通訊協定](https://tools.ietf.org/html/rfc6455)的關鍵元件 Amazon Transcribe 為：
+ 升級請求。這包含請求的查詢參數，以及 Amazon Transcribe 使用 做為種子簽章來簽署資料影格的簽章。
+ [事件串流編碼](#streaming-event-stream)中包含中繼資料和原始音訊位元組的一或多個訊息框架。
+ 結束框架。這是[事件串流編碼](#streaming-event-stream)中有空內文的簽章訊息。

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

1. 將下列政策連接至發出請求 IAM 的角色。如需詳細資訊，請參閱[新增 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policy-api)。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "myTranscribeWebsocketPolicy",
               "Effect": "Allow",
               "Action": "transcribe:StartStreamTranscriptionWebSocket",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 若要開始工作階段，請以下列格式建立預先簽署的 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 參考資料》](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_Reference.html)中列出其他操作和參數；所有 AWS API 操作的通用參數都會於[通用參數](https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonParameters.html)一節列出。

   若要為請求建構 URL 及建立 [Signature 第 4 版簽章](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html)，請參閱下列步驟。範例是虛擬程式碼。

   1. 建立正式請求。正式請求是其中包括來自您的請求的資訊的字串 (使用標準化格式)。這可確保 AWS 收到請求時，可以計算您為 URL 建立的相同簽章。如需詳細資訊，請參閱 [Signature 第 4 版的建立正式請求](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html)。

      ```
      # 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
      ```

   1. 建立正式 URI，這是介於網域與查詢字串間的部分 URI。

      ```
      canonical_uri = "/stream-transcription-websocket"
      ```

   1. 建立正式標頭和已簽章標頭。請注意正式標頭中的結尾 `\n`。
      + 附加小寫標頭名稱，後面接著冒號 ( : )。
      + 為該標頭附加逗號分隔的值清單。不要在有多個值的標頭中排序值。
      + 附加新的一行 (`\n`)。

      ```
      canonical_headers = "host:" + host + "\n"
      signed_headers = "host"
      ```

   1. 演算法必須符合雜湊演算法。請使用 `SHA-256`。

      ```
      algorithm = "AWS4-HMAC-SHA256"
      ```

   1. 建立憑證的範圍，將衍生的金鑰範圍限定於提出請求的日期、 AWS 區域和服務。例如 `20220127/us-west-2/transcribe/aws4_request`。

      ```
      credential_scope = datestamp + "/" + region + "/" + service + "/" + "aws4_request"
      ```

   1. 建立正式查詢字串。查詢字串值必須是 URL 編碼並以名稱排序。
      + 依照字元字碼指標的參數名稱遞增排序。​具有重複名稱的參數應依數值排序。例如，以大寫字母 F 開頭的參數名稱，放在以小寫字母 b 開頭的參數名稱之前。
      + URI 編碼不能執行 RFC 3986 所定義的任何未預留字元：A-Z、a-z、0-9、連字號 (-)、底線 (\$1)、句點 ( . ) 和波狀符號 ( \$1 )。
      + 對所有其他含有 %XY 的字元執行百分比編碼，其中 X 和 Y 是十六進位字元 (0-9 和大寫 A-F)。例如，空間字元必須編碼為 %20 (而非像有些編碼結構描述那樣包含「\$1」)；延伸的 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"
      ```

   1. 建立承載的雜湊。對於 `GET` 請求，承載為空字串。

      ```
      payload_hash = HashSHA256(("").Encode("utf-8")).HexDigest()
      ```

   1. 結合下列元素以建立正式請求。

      ```
      canonical_request = method + '\n' 
         + canonical_uri + '\n' 
         + canonical_querystring + '\n' 
         + canonical_headers + '\n' 
         + signed_headers + '\n' 
         + payload_hash
      ```

1. 建立要簽署的字串，其中包含有關您的請求的中繼資料。您在下一個步驟計算請求簽章時，使用此字串登入。如需詳細資訊，請參閱 [Signature 第 4 版的建立簽署字串](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html)。

   ```
   string_to_sign=algorithm + "\n"
      + amz_date + "\n"
      + credential_scope + "\n"
      + HashSHA256(canonical_request.Encode("utf-8")).HexDigest()
   ```

1. 計算簽章。若要這樣做，請從 AWS 私密存取金鑰衍生簽署金鑰。為了提供更大程度的保護，衍生的金鑰有專屬的日期、服務和 AWS 區域。您使用衍生的金鑰以簽署請求。如需詳細資訊，請參閱[計算 Signature 第 4 版的 AWS Signature](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html)。

   確保您實作該 `GetSignatureKey` 函數以衍生出您的簽名密鑰。如果您尚未衍生出簽名密鑰，請參閱 [Signature 第 4 版中如何衍生簽名密鑰的範例](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html)。

   ```
   #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 函數，會以二進位格式傳回結果。

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

   您計算簽章之後，請將簽章新增到查詢字串。如需詳細資，請參閱[新增簽章到請求](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html)。

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

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

   然後，為請求建立 URL。

   ```
   request_url = endpoint + canonical_uri + "?" + canonical_querystring
   ```

   使用請求 URL 與您的 WebSocket 程式庫，以便向 Amazon Transcribe提出請求。

1. 對 的請求 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
   ```

1. 當 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
   ```

1. 提出 WebSocket 串流請求

   建立 WebSocket 連線後，用戶端即可開始傳送一系列音訊影格，每個影格都使用[事件串流編碼](#streaming-event-stream)。

   每個資料框架包含三個標頭並結合原始音訊位元組塊；下表描述這些標頭。    
<a name="table-websocket-frame-diagram-event-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/streaming-setting-up.html)

1. 若要結束資料串流，請將空的音訊串流區塊傳送到事件串流編碼的訊息中。

   回應包含承載中的事件串流編碼的原始位元組。它包含標準序言和下列標頭。    
<a name="table-websocket-frame-response-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/streaming-setting-up.html)

   您解碼二進位回應時，將獲得包含轉錄結果的 JSON 結構。

### 處理 WebSocket 串流錯誤
<a name="websocket-errors"></a>

如果在處理您的請求時發生例外狀況， 會 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 限制](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits-amazon-transcribe)。減少正在轉錄的串流數量。
+ `UnrecognizedClientException`：WebSocket 升級請求是以不正確的存取金鑰或私密金鑰簽署的。請確定您正確建立存取金鑰，並再次嘗試請求。

Amazon Transcribe 也可以傳回任何常見的服務錯誤。如需清單，請參閱[常見錯誤](https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html)。

## 事件串流編碼
<a name="streaming-event-stream"></a>

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

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

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

1. 訊息的總位元組長度

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

資料區段包含：

1. 標頭

1. 酬載

每個區段以 4 位元組大端序整數循環冗餘校驗 (CRC) 總和結束。訊息 CRC 檢查總和適用於序言區段和資料區段。 Amazon Transcribe 使用 CRC32 (通常稱為 GZIP CRC32)，計算兩個 CRC。如需 CRC32 的詳細資訊，請參閱 [https://www.ietf.org/rfc/rfc1952.txt](https://www.ietf.org/rfc/rfc1952.txt)。

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

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

![\[訊息元件的示意圖，以及串流轉錄的標頭。\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/images/frame-diagram-frame-overview.png)


每則訊息都包含下列元件：
+ **序言**：由兩個 4 位元組欄位組成，總數固定為 8 個位元組。
  + *前 4 個位元組*：這是整個訊息的大端序整數位元組長度，包括 4 位元組長度欄位。
  + *次 4 個位元組*：這是訊息「標頭」部分的大端序整數位元組長度，不含「標頭」長度欄位本身。
+ **序言 CRC**：訊息序言部分的 4 位元組 CRC 檢查總和，不含 CRC 本身。序言與訊息 CRC 有獨立的 CRC。這可確保 Amazon Transcribe 可以立即偵測損毀的位元組長度資訊，而不會造成錯誤，例如緩衝區溢位。
+ **標頭：**註釋訊息的中繼資料；例如訊息類型、訊息類型和內容類型。訊息有多個標頭，屬於 key:value 配對，其中鍵是 UTF-8 字串。標頭可以任何順序出現在訊息的標頭部分中，而且每個標頭只能出現一次。
+ **承載：**要轉錄的音訊內容。
+ **訊息 CRC：**從訊息開頭到檢查總和開頭的 4 位元組 CRC 檢查總和。亦即，訊息中的一切，但 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 串流](#streaming-http2) 或 [設定 WebSocket 串流](#streaming-websocket)，了解詳細資訊。

## 資料框架
<a name="streaming-data-frames"></a>

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

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

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

下圖顯示此運作方式。

![\[串流轉錄的資料框架元件。\]](http://docs.aws.amazon.com/zh_tw/transcribe/latest/dg/images/streaming10.png)
