通过 HTTP/2 使用 Amazon Transcribe 流式处理 - Amazon Transcribe
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

通过 HTTP/2 使用 Amazon Transcribe 流式处理

Amazon Transcribe 对流式转录使用称为事件流编码 的格式。此格式对二进制数据进行编码,其中包含用于描述每个事件的内容的标头信息。有关更多信息,请参阅 事件流编码。您可以将此信息用于调用 Amazon Transcribe 终端节点的应用程序,而不必使用 Amazon Transcribe 开发工具包。

当 Amazon Transcribe 使用 HTTP/2 协议进行流式处理转录时,流式处理请求的关键组件包括:

  • 标头帧。这包含请求的 HTTP/2 标头和 authorization 标头中的签名,Amazon Transcribe 将使用该签名作为种子签名来签署以下数据帧。

  • 事件流编码中的一个或多个消息帧。这些帧包含元数据和原始音频字节。

  • 结束帧。这是事件流编码中正文为空的已签名消息。

流式处理请求

要发出流式处理请求,请使用 StartStreamTranscription 操作。

标头帧

标头帧是流式转录的授权帧。Amazon Transcribe 使用 authorization 标头的值作为种子,以便为请求中的数据帧生成授权标头链。

必需的标头

针对 Amazon Transcribe 的请求的标头帧需要以下 HTTP/2 标头:

POST /stream-transcription HTTP/2.0 host: transcribestreaming.region.amazonaws.com authorization: Generated value content-type: application/vnd.amazon.eventstream x-amz-target: com.amazonaws.transcribe.Transcribe.StartStreamTranscription x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-EVENTS x-amz-date: Date x-amzn-transcribe-language-code: en-US x-amzn-transcribe-media-encoding: pcm x-amzn-transcribe-sample-rate: Sample rate transfer-encoding: chunked

在请求中,对 hostauthorizationx-amz-date 标头使用以下值:

有关特定于 Amazon Transcribe 的标头的更多信息,请参阅 StartStreamTranscription 操作。

数据帧

每个请求都包含一个或多个数据帧。数据帧使用事件流编码。编码支持客户端和服务器之间的双向数据传输。

创建数据帧有两个步骤:

  1. 将原始音频数据与元数据组合以创建请求负载。

  2. 将负载与签名组合以构成将发送到 Amazon Transcribe 的事件消息。

下图演示了工作原理。

创建音频事件

要创建发送到 Amazon Transcribe 的消息,请创建音频事件。将下表中描述的标头与音频字节区块一起组合到事件编码消息中。

要创建事件消息负载,请按照原始字节格式使用缓冲区。

创建消息

使用发送到 Amazon Transcribe 的音频事件负载创建数据帧。数据帧包含事件编码标头,这些标头包含音频区块和音频事件的当前日期和签名。要向 Amazon Transcribe 指示音频流已完成,请发送仅包含日期和签名的空数据帧。

要为数据帧创建签名,请先创建待签字符串,然后计算事件的签名。按照如下方式构造待签字符串:

String stringToSign = "AWS4-HMAC-SHA256-PAYLOAD" + "\n" + DATE + "\n" + KEYPATH + "\n" + Hex(priorSignature) + "\n" + HexHash(nonSignatureHeaders) + "\n" + HexHash(payload);
  • DATE:采用协调世界时 (UTC) 和 ISO 8601 格式的当前日期和时间。请勿在日期中包含毫秒。例如,20190127T223754Z 为 2019 年 1 月 27 日的 22:37:54。

  • KEYPATH:采用 date/region/service/aws4_request 格式的签名范围。例如:20190127/us-east-1/transcribe/aws4_request

  • priorSignature:上一帧的签名。对于第一个数据帧,请使用标头帧的签名。

  • nonSignatureHeaders:编码为字符串的 DATE 标头。

  • payload:包含音频事件数据的字节缓冲区。

  • Hex:一个将其输入编码为十六进制表示形式的函数。

  • HexHash:一个函数,该函数首先为其输入创建一个 SHA-256 哈希,然后使用 Hex 函数将此哈希编码。

在构造待签字符串后,使用您为签名版本 4 派生的密钥为其签名,如下所示。有关详细信息,请参阅 Amazon Web Services 一般参考 中的说明如何为签名版本 4 派生签名密钥的示例

String signature = HMACSHA256(derivedSigningKey, stringToSign);
  • HMACSHA256:一个使用 SHA-256 哈希函数创建签名的函数。

  • derivedSigningKey:签名版本 4 签名密钥。

  • stringToSign:您为数据帧计算得到的字符串。

在计算数据帧的签名后,构造一个包含日期、签名和音频事件负载的字节缓冲区。将字节数组发送到 Amazon Transcribe 以进行转录。

End Frame (结束帧)

要指示音频流已完成,请将结束帧发送到 Amazon Transcribe。结束帧 是负载为空的数据帧。构造结束帧的方式与构造数据帧的方式相同。

流响应

还将使用事件流编码发送来自 Amazon Transcribe 的响应。使用此信息对来自 StartStreamTranscription 操作的响应进行解码。

转录响应

转录响应是经过事件流编码的。它包含标准前导信息和以下标头:

有关详细信息,请参阅 事件流编码

响应经过解码后,将包含以下信息:

:content-type: "application/json" :event-type: "TranscriptEvent" :message-type: "event" JSON transcription information

有关 Amazon Transcribe 返回的 JSON 结构的示例,请参阅通过 HTTP/2 使用 Amazon Transcribe 流式处理

异常响应

如果处理转录流时出错,则 Amazon Transcribe 将发送异常响应。响应是经过事件流编码的。有关详细信息,请参阅 事件流编码

此响应包含标准前导信息和以下标头:

异常响应解码后将包含以下信息:

:content-type: "application/json" :event-type: "BadRequestException" :message-type: "exception" Exception message

示例请求和响应

下面是一个端到端的流式转录请求示例。在此示例中,二进制数据表示为 base64 编码的字符串。在实际响应中,数据为原始字节。

步骤 1 - 使用 Amazon Transcribe 启动会话

要启动会话,请向 Amazon Transcribe 发送 HTTP/2 请求:

POST /stream-transcription HTTP/2.0 host: transcribestreaming.region.amazonaws.com authorization: Generated value content-type: application/vnd.amazon.eventstream x-amz-content-sha256: STREAMING-AWS4-HMAC-SHA256-EVENTS x-amz-date: Date x-amzn-transcribe-language-code: en-US x-amzn-transcribe-media-encoding: pcm x-amzn-transcribe-sample-rate: Sample rate transfer-encoding: chunked

步骤 2 - 将身份验证信息发送到 Amazon Transcribe

Amazon Transcribe 会发送以下响应:

HTTP/2.0 200 x-amzn-transcribe-language-code: en-US x-amzn-transcribe-sample-rate: Sample rate x-amzn-request-id: 8a08df7d-5998-48bf-a303-484355b4ab4e x-amzn-transcribe-session-id: b4526fcf-5eee-4361-8192-d1cb9e9d6887 x-amzn-transcribe-media-encoding: pcm x-amzn-RequestId: 8a08df7d-5998-48bf-a303-484355b4ab4e content-type: application/vnd.amazon.eventstream

步骤 3 - 创建音频事件

创建一个音频事件,其中包含要发送的音频数据。有关详细信息,请参阅 事件流编码。此请求中的二进制数据是经过 base64 编码的。在实际请求中,数据为原始字节。

:content-type: "application/octet-stream" :event-type: "AudioEvent" :message-type: "event" UklGRjzxPQBXQVZFZm10IBAAAAABAAEAgD4AAAB9AAACABAAZGF0YVTwPQAAAAAAAAAAAAAAAAD//wIA/f8EAA==

步骤 4 - 创建音频事件消息

创建一个音频消息,其中包含要发送到 Amazon Transcribe 的音频数据。有关详细信息,请参阅 事件流编码。此示例中的音频事件数据是经过 base64 编码的。在实际请求中,数据为原始字节。

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

步骤 5 - 使用来自 Amazon Transcribe 的响应

Amazon Transcribe 为它发送到您的应用程序的转录事件创建一个流。这些事件采用原始字节格式发送。在此示例中,字节是经过 base64 编码的。

来自 Amazon Transcribe 的响应如下:

AAAAUwAAAEP1RHpYBTpkYXRlCAAAAWiXUkMLEDpjaHVuay1zaWduYXR1cmUGACCt6Zy+uymwEK2SrLp/zVBI 5eGn83jdBwCaRUBJA+eaDafqjqI=

要查看转录结果,请使用事件流编码对原始字节进行解码:

:event-type: "TranscriptEvent" :content-type: "application/json" :message-type: "event" {"Transcript":{"Results":[results]}}

有关 Amazon Transcribe 返回的 JSON 结构的示例,请参阅事件流编码

步骤 6 - 结束转录流

最后,向 Amazon Transcribe 发送空音频事件以结束转录流。完全像创建任何其他音频事件一样,创建负载为空的音频事件。为事件签名并将此签名包括在 :chunk-signature 标头中,如下所示:

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