

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Transcripción de audio en streaming
<a name="streaming"></a>

Con el Amazon Transcribe streaming, puedes producir transcripciones en tiempo real para tu contenido multimedia. A diferencia de las transcripciones por lotes, que implican la carga de archivos multimedia, el contenido multimedia en streaming se entrega Amazon Transcribe en tiempo real. Amazon Transcribe a continuación, devuelve una transcripción, también en tiempo real.

La transmisión puede incluir contenido multimedia pregrabado (películas, música y podcasts) y contenido multimedia en tiempo real (transmisiones de noticias en directo). Los casos de uso más comunes de la transmisión Amazon Transcribe incluyen los subtítulos opcionales en vivo para eventos deportivos y la supervisión en tiempo real del audio de los centros de llamadas.

El contenido en streaming se entrega como una serie de paquetes de datos secuenciales, o “fragmentos”, que Amazon Transcribe transcribe de forma instantánea. Las ventajas de utilizar el streaming en lugar de por lotes incluyen speech-to-text funciones en tiempo real en sus aplicaciones y tiempos de transcripción más rápidos. Sin embargo, este aumento de velocidad puede presentar limitaciones de precisión en algunos casos.

Amazon Transcribe ofrece las siguientes opciones de transmisión:
+ [SDKs](getting-started-sdk.md)(preferido)
+ [HTTP/2](streaming-setting-up.md#streaming-http2)
+ [WebSockets](streaming-setting-up.md#streaming-websocket)
+ [Consola de administración de AWS](https://console.aws.amazon.com/transcribe/)

Para transcribir la transmisión de audio en el Consola de administración de AWS, hable al micrófono de su ordenador.

**sugerencia**  
Para ver ejemplos de código del SDK, consulta el [repositorio de AWS muestras](https://github.com/orgs/aws-samples/repositories?language=&q=transcribe&sort=&type=all) en GitHub.

Los formatos de audio compatibles con las transcripciones en streaming son:
+ FLAC
+ Audio codificado con OPUS en un contenedor Ogg
+ PCM (sólo formatos de audio Little-Endian de 16 bits firmados, que **no** incluyan WAV)

Se recomiendan los formatos sin pérdidas (FLAC o PCM).

**nota**  
Las transcripciones en streaming no son compatibles con todos los idiomas. Consulte la columna “Entrada de datos” de la [tabla de idiomas admitidos](supported-languages.md) para obtener más información.

Para ver la disponibilidad Amazon Transcribe regional de las transcripciones en streaming, consulta: [Amazon Transcribe Puntos finales y cuotas](https://docs.aws.amazon.com/general/latest/gr/transcribe.html#transcribe_region).

## Prácticas recomendadas
<a name="best-practices"></a>

Las siguientes recomendaciones mejoran la eficiencia de la transcripción en streaming:
+ Si es posible, utilice audio codificado en PCM.
+ Asegúrese de que su secuencia esté lo más cerca posible al tiempo real.
+ La latencia depende del tamaño de los fragmentos de audio. Si puede especificar el tamaño de los fragmentos con su tipo de audio (por ejemplo, con el PCM), ajuste cada fragmento entre 50 ms y 200 ms. Puede calcular el tamaño del fragmento de audio mediante la siguiente fórmula: 

  ```
  chunk_size_in_bytes = chunk_duration_in_millisecond / 1000 * audio_sample_rate * 2
  ```
+ Use un tamaño de fragmento uniforme.
+ Asegúrese de especificar correctamente el número de canales de audio.
+ Con el audio PCM de un solo canal, cada muestra consta de dos bytes, por lo que cada fragmento debe constar de un número par de bytes.
+ Con el audio PCM de doble canal, cada muestra consta de cuatro bytes, por lo que cada fragmento debe ser un múltiplo de 4 bytes.
+ Cuando la secuencia de audio no contenga voz, codifique y envíe la misma cantidad de silencio. Por ejemplo, el silencio para PCM es una secuencia de cero bytes.
+ Asegúrese de especificar la frecuencia de muestreo correcta para el audio. Si es posible, grabe a una frecuencia de muestreo de 16 000 Hz; para proporcionar un mejor equilibrio entre la calidad y el volumen de datos enviados a través de la red. Tenga en cuenta que la mayoría de los micrófonos de gama alta graban a 44 100 Hz o 48 000 Hz.

# Streaming y resultados parciales
<a name="streaming-partial-results"></a>

*Como la transmisión funciona en tiempo real, las transcripciones se producen a partir de resultados parciales.* Amazon Transcribe divide la transmisión de audio entrante en función de los segmentos naturales del habla, como un cambio de altavoz o una pausa en el audio. La transcripción se devuelve a la aplicación en una secuencia de eventos de transcripción, y cada respuesta contiene más discurso transcrito hasta que se transcribe un segmento completo.

En el siguiente bloque de código se muestra una aproximación de esto. Para ver este proceso en acción, inicie sesión en [Consola de administración de AWS](https://console.aws.amazon.com/transcribe/), seleccione **Transcripción en tiempo real** y hable por el micrófono. Observe el panel **Resultado de la transcripción** mientras habla.

En este ejemplo, cada línea es el resultado parcial de un segmento de audio.

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

Estos resultados parciales están presentes en el resultado de la transcripción dentro de los objetos [https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_Result.html](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_Result.html). En este bloque de objetos también hay un **IsPartial**campo. Si este campo es true, el segmento de transcripción aún no está completo. A continuación, puede ver la diferencia entre un segmento incompleto y uno completo:

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

Cada palabra de un segmento *completo* tiene una puntuación de confianza asociada, que es un valor comprendido entre `0` y `1`. Un valor mayor indica una mayor probabilidad de que la palabra se transcriba correctamente.

**sugerencia**  
Los extremos `StartTime` y `EndTime` de un segmento de audio se pueden utilizar para sincronizar el resultado de la transcripción con el diálogo de vídeo.

Si está ejecutando una aplicación que requiere una latencia baja, quizás le interese utilizar la [estabilización parcial de los resultados.](#streaming-partial-result-stabilization)

## estabilización parcial de los resultados
<a name="streaming-partial-result-stabilization"></a>

Amazon Transcribe comienza a devolver los resultados de la transcripción en cuanto empiezas a reproducir tu audio. Devuelve estos resultados parciales de forma incremental hasta que genera un resultado final al nivel de un segmento de voz natural. Un segmento de voz natural es una voz continua que contiene una pausa o un cambio de hablante.

Amazon Transcribe sigue emitiendo resultados parciales hasta que genera el resultado final de la transcripción de un segmento de voz. Como el reconocimiento de voz puede revisar las palabras a medida que van adquiriendo más contexto, las transcripciones en streaming pueden cambiar ligeramente con cada nueva salida parcial de resultados.

Este proceso ofrece dos opciones para cada segmento de voz:
+ Esperar a que termine el segmento
+ Usar los resultados parciales del segmento

La estabilización parcial del resultado cambia la forma en Amazon Transcribe que se produce el resultado final de la transcripción para cada segmento completo. Cuando se activa, sólo se pueden cambiar las últimas palabras de los resultados parciales. Debido a esto, la precisión de la transcripción puede verse afectada. Sin embargo, la transcripción se devuelve más rápido que sin la estabilización de los resultados parciales. Esta reducción de la latencia puede resultar beneficiosa a la hora de subtitular vídeos o generar subtítulos descriptivos para transmisiones en directo.

Los siguientes ejemplos muestran cómo se gestiona la misma secuencia de audio cuando la estabilización de resultados parciales no está activada y cuándo sí lo está. Tenga en cuenta que puede establecer el nivel de estabilidad en bajo, medio o alto. La baja estabilidad proporciona la máxima precisión. La alta estabilidad transcribe más rápido, pero con una precisión ligeramente inferior.


| “Transcripción”: | "EndTime": | "IsPartial": | 
| --- | --- | --- | 
| La estabilización de resultados parciales no está habilitada | 
|  <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>  | 
| La estabilización de resultados parciales está activada (alta estabilidad) | 
|  <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>  | 

Al activar la estabilización de resultados parciales, Amazon Transcribe utiliza un `Stable` campo para indicar si un elemento es estable, donde «elemento» hace referencia a una palabra o un signo de puntuación transcritos. Los valores de `Stable` son `true` o `false`. Los elementos marcados como `false` (no estables) tienen más probabilidades de cambiar a medida que se transcribe el segmento. Por el contrario, los elementos marcados como `true` (estables) no cambiarán.

Puede elegir renderizar palabras no estables para que los subtítulos descriptivos se alineen con la voz. Aunque los subtítulos descriptivos cambien ligeramente a medida que se añade el contexto, esta experiencia de usuario es mejor que las ráfagas de texto periódicas, que pueden o no alinearse con la voz.

También puede optar por mostrar las palabras no estables en un formato diferente, por ejemplo, en cursiva, para indicar a los espectadores que estas palabras pueden cambiar. La visualización de resultados parciales limita la cantidad de texto que se muestra en un momento dado. Esto puede ser importante cuando se trata de limitaciones de espacio, como ocurre con los subtítulos descriptivos de los vídeos.

**Profundice más con el blog AWS de Machine Learning**  
Para obtener más información sobre cómo mejorar la precisión con las transcripciones en tiempo real, consulte:  
[Mejore la experiencia de transcripción en streaming con una estabilización Amazon Transcribe parcial de los resultados](https://aws.amazon.com/blogs/machine-learning/amazon-transcribe-now-supports-partial-results-stabilization-for-streaming-audio/)
[“¿Qué era eso?” Aumento de la precisión de los subtítulos para las transmisiones en directo con Amazon Transcribe](https://aws.amazon.com/blogs/media/what-was-that-increasing-subtitle-accuracy-for-live-broadcasts-using-amazon-transcribe/)

### Ejemplo de salida de estabilización de resultados parciales
<a name="streaming-stabilization-output"></a>

El siguiente ejemplo de salida muestra los indicadores `Stable` de un segmento incompleto (`"IsPartial": true`). Puede ver que las palabras “*to*” y “*Amazon*” no son estables y, por lo tanto, podrían cambiar antes de finalizar el segmento.

```
"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
        }
    ]
}
```

# Configuración de una transcripción de streaming
<a name="streaming-setting-up"></a>

Esta sección amplía la sección principal de [streaming](streaming.md). Su objetivo es proporcionar información a los usuarios que desean configurar su transmisión con HTTP/2 o WebSockets directamente, en lugar de hacerlo con un AWS SDK. La información de esta sección también se puede utilizar para crear su propio SDK.

**importante**  
Recomendamos encarecidamente utilizar HTTP/2 SDKs en lugar de hacerlo directamente. WebSockets SDKs son el método más sencillo y fiable para transcribir flujos de datos. Para empezar a transmitir con un AWS SDK, consulte[Transcribir con el AWS SDKs](getting-started-sdk-streaming.md).

## Configuración de una secuencia HTTP/2
<a name="streaming-http2"></a>

Los componentes clave de un [protocolo HTTP/2](https://http2.github.io/) para transmitir solicitudes de transcripción Amazon Transcribe son:
+ Una trama de encabezado. Contiene los encabezados HTTP/2 de su solicitud y una firma en el encabezado de autorización que se Amazon Transcribe utiliza como firma inicial para firmar los marcos de datos.
+ Una o más tramas de mensajes en la [codificación de secuencias de eventos](#streaming-event-stream) que contienen metadatos y bytes de audio sin procesar.
+ Una trama final. Se trata de un mensaje firmado en la [codificación de secuencias de eventos](#streaming-event-stream) con un cuerpo vacío.

**nota**  
Amazon Transcribe solo admite una transmisión por sesión de HTTP/2. Si intenta usar varias transmisiones, la solicitud de transcripción fallará.

1. Adjunta la siguiente política al IAM rol que realiza la solicitud. Consulte [Añadir IAM políticas](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policy-api) para obtener más información.

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

****  

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

------

1. Para iniciar la sesión, envíe una solicitud HTTP/2 a 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
   ```

   Las operaciones y los parámetros adicionales se enumeran en la [Referencia de la API](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_Reference.html); los parámetros comunes a todas las operaciones de la API de AWS se enumeran en la sección [Parámetros comunes](https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonParameters.html).

   Amazon Transcribe envía la siguiente respuesta:

   ```
   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. Cree un evento de audio que contenga sus datos de audio. Combine los encabezados, que se describen en la siguiente tabla, con un fragmento de bytes de audio en un mensaje codificado para eventos. Para crear la carga del mensaje del evento, utilice un búfer con un formato de bytes sin procesar.    
<a name="table-http2-frame-diagram-event-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/streaming-setting-up.html)

   Los datos binarios de este ejemplo están codificados en base64. En una solicitud real, los datos serán bytes sin procesar.

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

1. Cree un mensaje de audio que contenga sus datos de audio.

   1. Su trama de datos contiene encabezados de codificación de eventos que incluyen la fecha actual y una firma del fragmento y el evento de audio.    
<a name="table-http2-diagram-message-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/streaming-setting-up.html)

      Los datos binarios de esta solicitud están codificados en base64. En una solicitud real, los datos serán bytes sin procesar.

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

   1. Construya una cadena para firmar, tal y como se describe en la sección [Creación de una cadena de firma para Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html). La cadena debe seguir este formato:

      ```
      String stringToSign =
      "AWS4-HMAC-SHA256" +
      "\n" +
      DateTime +
      "\n" +
      Keypath +
      "\n" +
      Hex(priorSignature) +
      "\n" +
      HexHash(nonSignatureHeaders) +
      "\n" +
      HexHash(payload);
      ```
      + **DateTime**: La fecha y la hora en que se creó la firma. El formato es YYYMMDDTHHMMSSZ, donde YYYY=año, MM=mes, DD=día, HH=hora, MM=minuto, SS=segundos y 'T' y 'Z' son caracteres fijos. Para obtener más información, consulte [Control de fechas en Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-date-handling.html).
      + **Keypath**: ámbito de la firma en formato `date/region/service/aws4_request`. Por ejemplo, `20220127/us-west-2/transcribe/aws4_request`.
      + **Hex**: función que codifica la entrada en una representación hexadecimal.
      + **priorSignature**: firma de la trama anterior. En la primera trama de datos, utilice la firma de la trama del encabezado.
      + **HexHash**: función que primero crea un hash SHA-256 de su entrada y, a continuación, utiliza la función Hex para codificar el hash.
      + **nonSignatureHeaders**: El DateTime encabezado codificado como una cadena.
      + **payload**: búfer de bytes que contiene los datos del evento de audio.

   1. Obtenga una clave de firma de su clave de acceso AWS secreta y utilícela para firmar la`stringToSign`. Para un mayor grado de protección, la clave derivada es específica de la fecha, el servicio y Región de AWS. Para obtener más información, consulte la sección [Calcular la firma para Signature Version 4 de AWS](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html).

      Asegúrese de implementar la función `GetSignatureKey` para obtener la clave de firma. Si aún no ha obtenido una clave de firma, consulte los [ejemplos de cómo obtener una clave de firma para Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html).

      ```
      String signature = HMACSHA256(derivedSigningKey, stringToSign);
      ```
      + **HMACSHA256**: función que crea una firma utilizando la función hash SHA-256.
      + **derivedSigningKey**: clave de firma de Signature Version 4.
      + **stringToSign**: La cadena que calculó para el marco de datos.

      Después de calcular la firma de la trama de datos, cree un búfer de bytes que contenga la fecha, la firma y la carga del evento de audio. Envíe la matriz de bytes a Amazon Transcribe para que la transcriba.

1. Para indicar que la secuencia de audio se ha completado, envíe una trama (una trama de datos vacía) que contenga únicamente la fecha y la firma. Cree esta trama final del mismo modo que crea las tramas de datos.

   Amazon Transcribe responde con un flujo de eventos de transcripción, que se envía a su aplicación. Esta respuesta es la secuencia de eventos codificada. Contienen el preludio estándar y los siguientes encabezados.    
<a name="table-http2-frame-response-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/streaming-setting-up.html)

   Los eventos se envían en formato de bytes sin procesar. En este ejemplo, los bytes están codificados en base64.

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

   Para ver los resultados de la transcripción, descodifique los bytes sin procesar utilizando la codificación de secuencias de eventos.

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

1. Para finalizar la transmisión, envíe un evento de audio vacío a Amazon Transcribe. Cree el evento de audio exactamente igual que cualquier otro, pero utilice una carga vacía. Firme el evento e incluya la firma en el encabezado `:chunk-signature`, tal y como se describe a continuación:

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

### Cómo gestionar los errores de streaming de HTTP/2
<a name="http2-errors"></a>

Si se produce un error al procesar la transmisión multimedia, Amazon Transcribe envía una respuesta de excepción. La respuesta es la secuencia de eventos codificada.

La respuesta contiene el preludio estándar y los siguientes encabezados:


| Longitud en bytes del nombre de encabezado | Nombre de encabezado (cadena) | Tipo de valor de encabezado | Longitud en bytes de la cadena de valor | Cadena de valor (UTF-8) | 
| --- | --- | --- | --- | --- | 
| 13 | :content-type | 7 | 16 | application/json | 
| 11 | :event-type | 7 | 19 | BadRequestException | 
| 13 | :message-type | 7 | 9 | exception | 

Cuando se descodifica, la respuesta de excepción contiene la siguiente información:

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

## Configurar una WebSocket transmisión
<a name="streaming-websocket"></a>

Los componentes clave de un [WebSocketprotocolo](https://tools.ietf.org/html/rfc6455) para transmitir solicitudes de transcripción Amazon Transcribe son:
+ La solicitud de actualización. Contiene los parámetros de consulta de su solicitud y una firma que se Amazon Transcribe utiliza como firma inicial para firmar los marcos de datos.
+ Una o más tramas de mensajes en la [codificación de secuencias de eventos](#streaming-event-stream) que contienen metadatos y bytes de audio sin procesar.
+ Una trama final. Se trata de un mensaje firmado en la [codificación de secuencias de eventos](#streaming-event-stream) con un cuerpo vacío.

**nota**  
Amazon Transcribe solo admite una transmisión por WebSocket sesión. Si intenta usar varias transmisiones, la solicitud de transcripción fallará.

1. Adjunta la siguiente política al IAM rol que realiza la solicitud. Consulte [Añadir IAM políticas](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policy-api) para obtener más información.

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

****  

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

------

1. Para iniciar la sesión, cree una URL prefirmada con el siguiente formato. Se han añadido saltos de línea para facilitar la lectura.

   ```
   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
   ```
**nota**  
El valor máximo de `X-Amz-Expires` es 300 (5 minutos).

   Las operaciones y los parámetros adicionales se enumeran en la [Referencia de la API](https://docs.aws.amazon.com/transcribe/latest/APIReference/API_Reference.html); los parámetros comunes a todas las operaciones de la API de AWS se enumeran en la sección [Parámetros comunes](https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonParameters.html).

   Para construir la URL de la solicitud y crear la firma de [Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html), utilice los siguientes pasos. Los ejemplos están en pseudocódigo.

   1. Cree una solicitud canónica. Una solicitud canónica es una cadena que incluye información de su solicitud en un formato estandarizado. Esto garantiza que, cuando AWS reciba la solicitud, pueda calcular la misma firma que creaste para tu URL. Para obtener más información, consulte [Creación de una solicitud canónica para Signature Version 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. Cree el URI canónico, que es la parte del URI entre el dominio y la cadena de consulta.

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

   1. Cree los encabezados canónicos y los encabezados firmados. Tenga en cuenta el `\n` final en los encabezados canónicos.
      + Agregue el nombre de encabezado en minúsculas seguido de dos puntos ( : ).
      + Agregue una lista de valores separados por comas para ese encabezado. No ordene los valores de los encabezados que tengan múltiples valores.
      + Agregue una nueva línea (`\n`).

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

   1. Haga coincidir el algoritmo con el algoritmo de hash. Utilice `SHA-256`.

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

   1. Cree el ámbito de credenciales, que abarca la clave derivada de la fecha, Región de AWS y el servicio. Por ejemplo, `20220127/us-west-2/transcribe/aws4_request`.

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

   1. Cree la cadena de consulta canónica. Los valores de cadena de la consulta deben estar codificados en URI y ordenados por nombre.
      + Ordene los nombres de los parámetros en orden ascendente según el punto del código de caracteres. Los parámetros con nombres duplicados deben ordenarse por valor. Por ejemplo, un nombre de parámetro que comienza por la letra mayúscula F precede a un nombre de parámetro que empieza por la letra minúscula b.
      + No codifique según las normas de los URI ninguno de los caracteres no reservados definidos en la norma RFC 3986: A-Z, a-z, 0-9, guion (-), guion bajo (\$1), punto (. ) y tilde ( \$1 ).
      + Codifique con signos de porcentaje el resto de los caracteres con %XY, donde X e Y son caracteres hexadecimales (0-9 y A-F mayúsculas). Por ejemplo, el carácter de espacio debe codificarse como %20 (no incluya el signo “\$1” como en algunos esquemas de codificación) y los caracteres extendidos UTF-8 deben indicarse con el formato %XY%ZA%BC.
      + Codifique dos veces los caracteres de equivalencia (=) en los valores de los parámetros.

      ```
      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. Cree un hash de la carga útil. Para una solicitud `GET`, la carga es una cadena vacía.

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

   1. Combine los elementos siguientes para crear la solicitud canónica.

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

1. Cree la cadena para firmar, que contiene metainformación sobre su solicitud. Puede utilizar la cadena para firmar en el siguiente paso cuando calcule la firma de la solicitud. Para obtener más información, consulte la sección [Creación de una cadena para firmar para Signature Version 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. Calcule la firma. Para ello, extrae una clave de firma de tu clave de acceso AWS secreta. Para un mayor grado de protección, la clave derivada es específica de la fecha, el servicio y Región de AWS. Utilice la clave derivada para firmar la solicitud. Para obtener más información, consulte [Calcular la AWS firma para la versión 4](https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html).

   Asegúrese de implementar la función `GetSignatureKey` para obtener la clave de firma. Si aún no ha obtenido una clave de firma, consulte los [ejemplos de cómo obtener una clave de firma para Signature Version 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
   ```

   La función `HMAC(key, data)` representa una SHA256 función HMAC- que devuelve los resultados en formato binario.

1. Agregue información de firma a la solicitud y cree la URL de la solicitud.

   Después de calcular la firma, agrégesela a la cadena de la solicitud. Para obtener más información, consulte [Agregar la firma de la solicitud](https://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html).

   En primer lugar, agregue la información de autenticación a la cadena de consulta.

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

   En segundo lugar, cree la URL de la solicitud.

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

   Usa la URL de la solicitud junto con tu WebSocket biblioteca para realizar la solicitud. Amazon Transcribe

1. La solicitud Amazon Transcribe debe incluir los siguientes encabezados. Por lo general, estos encabezados los administra la biblioteca de su WebSocket cliente.

   ```
   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. Cuando Amazon Transcribe recibe su WebSocket solicitud, responde con una respuesta de WebSocket actualización. Por lo general, la WebSocket biblioteca gestiona esta respuesta y configura un conector para comunicarse con ella Amazon Transcribe.

   La siguiente es la respuesta de Amazon Transcribe. Se han añadido saltos de línea para facilitar la lectura.

   ```
   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. Haz tu solicitud WebSocket de streaming.

   Una vez establecida la WebSocket conexión, el cliente puede empezar a enviar una secuencia de fotogramas de audio, cada uno codificado mediante la [codificación de flujo de eventos](#streaming-event-stream).

   Cada trama de datos contiene tres encabezados combinados con un fragmento de bits de audio sin procesar. En la siguiente tabla se describen estos encabezados.    
<a name="table-websocket-frame-diagram-event-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/streaming-setting-up.html)

1. Para cerrar el flujo de datos, envíe un fragmento de audio vacío en un mensaje codificado de secuencia de eventos.

   La respuesta contiene bytes sin procesar codificados de la secuencia de eventos en la carga. Contienen el preludio estándar y los siguientes encabezados.    
<a name="table-websocket-frame-response-headers"></a>[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/streaming-setting-up.html)

   Cuando descodifique la respuesta binaria, dispondrá de una estructura JSON con los resultados de la transcripción.

### Manejo de errores WebSocket de transmisión
<a name="websocket-errors"></a>

Si se produce una excepción al procesar la solicitud, Amazon Transcribe responde con una WebSocket estructura de terminal que contiene una respuesta codificada en el flujo de eventos. La respuesta tiene los encabezados descritos en la siguiente tabla y el cuerpo de la respuesta contiene un mensaje de error descriptivo. Tras enviar la respuesta a la excepción, Amazon Transcribe envía un marco cerrado.


| Longitud en bytes del nombre de encabezado | Nombre de encabezado (cadena) | Tipo de valor de encabezado | Longitud en bytes de la cadena de valor | Cadena de valor (UTF-8) | 
| --- | --- | --- | --- | --- | 
| 13 | :content-type | 7 | 16 | application/json | 
| 15 | : excepción-type | 7 | varía | varía, consulte a continuación | 
| 13 | :message-type | 7 | 9 | exception | 

El encabezado `exception-type` contiene uno de los siguientes valores:
+ `BadRequestException`: se produjo un error en el cliente al crear la secuencia, o se produjo un error al transmitir los datos. Asegúrese de que su cliente esté listo para aceptar los datos e intente realizar la solicitud de nuevo.
+ `InternalFailureException`: Amazon Transcribe tuve un problema durante el apretón de manos con el cliente. Intente volver a realizar la solicitud.
+ `LimitExceededException`: el cliente ha superado el límite de secuencias simultáneas. Para obtener más información, consulte [Amazon Transcribe Límites](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits-amazon-transcribe). Reduzca el número de transmisiones que transcribe.
+ `UnrecognizedClientException`: La solicitud de WebSocket actualización se firmó con una clave de acceso o una clave secreta incorrectas. Asegúrese de crear correctamente la clave de acceso y vuelva a intentar realizar la solicitud.

Amazon Transcribe también puede devolver cualquiera de los errores de servicio más comunes. Para ver una lista, consulte [Errores comunes](https://docs.aws.amazon.com/transcribe/latest/APIReference/CommonErrors.html).

## Codificación de secuencias de eventos
<a name="streaming-event-stream"></a>

Amazon Transcribe utiliza un formato denominado codificación de flujo de eventos para la transmisión de transcripciones.

La codificación de secuencias de eventos permite establecer una comunicación bidireccional entre un cliente y un servidor. Los marcos de datos enviados al servicio Amazon Transcribe de streaming se codifican en este formato. La respuesta de Amazon Transcribe también utiliza esta codificación.

Cada mensaje se compone de dos secciones: el preludio y los datos. La preludio se compone de:

1. La longitud total de bytes del mensaje

1. La longitud de bytes combinada de todos los encabezados

La sección de datos se compone de:

1. Encabezados

1. Carga útil

Cada sección termina con una suma de comprobación de redundancia cíclica (CRC) de un número entero big-endian de 4 bytes. La suma de verificación del CRC del mensaje es tanto para la sección de preludio como para la sección de datos. Amazon Transcribe utiliza CRC32 (a menudo denominado GZIP CRC32) para calcular ambas. CRCs Para obtener más información CRC32, consulte la [https://www.ietf.org/rfc/rfc1952.txt](https://www.ietf.org/rfc/rfc1952.txt).

La carga total del mensaje, incluido el preludio y las dos sumas de comprobación, es de 16 bytes.

En el siguiente diagrama, se muestran los componentes que conforman un mensaje y un encabezado. Hay varios encabezados en cada mensaje.

![\[Esquema de los componentes de un mensaje y encabezado para una transcripción en streaming.\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/images/frame-diagram-frame-overview.png)


Cada mensaje contiene los siguientes componentes:
+ **Preludio**: consta de dos campos de 4 bytes, con un total fijo de 8 bytes.
  + *Primeros 4 bytes*: se trata de la longitud en bytes indicada en números enteros big-endian de todo el mensaje, incluido el propio campo de 4 bytes.
  + *Segundos 4 bytes*: se trata de la longitud en bytes indicada en números enteros big-endian de los ‘encabezados’ del mensaje, sin incluir el propio campo de longitud de los ‘encabezados’.
+  **CRC del preludio:** suma de comprobación CRC de 4 bytes del preludio del mensaje, sin incluir la propia CRC. El preludio tiene un CRC independiente del CRC del mensaje. Esto garantiza que Amazon Transcribe se pueda detectar inmediatamente información dañada de longitud de bytes sin provocar errores, como sobrecargas de búfer.
+ **Encabezados**: metadatos que actúan como comentarios del mensaje; por ejemplo, el tipo de mensaje y el tipo de contenido. Los mensajes tienen varios encabezados, que son pares clave-valor, donde la clave es una cadena UTF-8. Los encabezados pueden aparecer en cualquier orden en la parte ‘encabezados’ del mensaje y cada encabezado puede aparecer sólo una vez.
+ **Carga**: contenido de audio que se va a transcribir.
+ **CRC del mensaje:** suma de comprobación CRC de 4 bytes desde el comienzo del mensaje hasta el inicio de la suma de comprobación. Es decir, todo en el mensaje, excepto la propia CRC.

El marco de cabecera es el marco de autorización para la transcripción en streaming. Amazon Transcribe utiliza el valor del encabezado de autorización como base para generar una cadena de encabezados de autorización para los marcos de datos de la solicitud.

Cada encabezado contiene los siguientes componentes; hay varios encabezados por trama.
+ **Longitud en bytes del nombre de encabezado:** longitud en bytes del nombre del encabezado.
+ **Nombre de encabezado**: nombre del encabezado que indica el tipo de encabezado. Para ver los valores válidos, consulte las siguientes descripciones de tramas.
+ **Tipo de valor del encabezado**: número que indica el tipo de valor del encabezado. La siguiente lista muestra los valores posibles del encabezado y lo que indican.
  + `0` – TRUE
  + `1` – FALSE
  + `2` – BYTE
  + `3` – SHORT
  + `4` – INTEGER
  + `5` – LONG
  + `6` – MATRIZ DE BYTES
  + `7` – STRING
  + `8` – TIMESTAMP
  + `9` – UUID
+ **Longitud en bytes de cadena de valores**: longitud en bytes de la cadena de valores del encabezado.
+ **Valor del encabezado:** el valor de la cadena del encabezado. Los valores válidos de este campo dependen del tipo de encabezado. Para obtener más información, consulte [Configuración de una secuencia HTTP/2](#streaming-http2) o [Configurar una WebSocket transmisión](#streaming-websocket).

## Tramas de datos
<a name="streaming-data-frames"></a>

Cada solicitud contiene una o varias tramas de datos. Hay dos pasos para crear una trama de datos:

1. Combinar los datos de audio sin procesar con metadatos para crear la carga de la solicitud.

1. Combinar la carga con una firma para conformar el mensaje del evento que se envía a Amazon Transcribe.

En el siguiente diagrama, se muestra cómo funciona.

![\[Los componentes de una trama de datos para una transcripción en streaming.\]](http://docs.aws.amazon.com/es_es/transcribe/latest/dg/images/streaming10.png)
