Amazon Transcribe
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon Transcribe 流格式

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

Amazon Transcribe 对流式转录使用 HTTP/2 协议。流式处理请求的关键组件包括:

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

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

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

事件流编码

事件流编码在客户端和服务器之间使用消息来提供双向通信。发送到 Amazon Transcribe 流式处理服务的数据帧使用此格式进行编码,来自 Amazon Transcribe 的响应也使用此编码。

每个消息都包含两部分:前导信息和数据。前导信息包括:

  1. 消息的总字节长度

  2. 所有标头的组合字节长度

数据部分包含:

  1. 标头

  2. 负载

每个部分都以 4 字节 big-endian 整数 CRC 校验和结尾。Amazon Transcribe 使用 CRC32(一般称为“GZIP CRC32”)计算这两个 CRC。有关 CRC32 的更多信息,请参阅 GZIP 文件格式规范版本 4.3

总消息开销(包括前导信息和两个校验和)为 16 个字节。

下图显示了构成消息和标头的组件。每个消息有多个标头。

每个消息都包含以下组件:

  • 前导信息:大小始终固定为 8 字节,由两个 4 字节的字段组成。

    • 第一个 4 字节:总字节长度。这是整个消息的 big-endian 整数字节长度,包括 4 字节长度字段本身。

    • 第二个 4 字节:标头字节长度。这是消息的标头部分的 big-endian 整数字节长度,不包括标头长度字段本身。

  • 前导信息 CRC:消息的前导信息部分的 4 字节 CRC 校验和,不包括 CRC 本身。前导信息具有不同于消息 CRC 的 CRC,以确保 Amazon Transcribe 可以立即检测到损坏的字节长度信息,而不会导致缓冲区溢出之类的错误。

  • 标头:用于批注消息(如消息类型、内容类型等)的元数据。消息有多个标头。标头是一些键值对,其中的键为 UTF-8 字符串。标头可按任何顺序出现在消息的标头部分中,并且任何给定标头只能出现一次。对于必需的标头类型,请参阅以下部分。

  • 负载:要转录的音频内容。

  • 消息 CRC:从消息开头到校验和开头的 4 字节 CRC 校验和。也就是说,消息中除 CRC 本身之外的所有内容。

每个标头都包含以下组件。每个帧有多个标头。

  • 标头名称字节长度:标头名称的字节长度。

  • 标头名称:指示标头类型的标头名称。有关有效值,请参阅下面的帧描述。

  • 标头值类型:指示标头值类型的枚举。

  • 值字符串字节长度:标头值字符串的字节长度。

  • 标头值:标头字符串的值。此字段的有效值取决于标头的类型。有关有效值,请参阅下面的帧描述。

流式处理请求

要发出流式处理请求,请使用 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-amz-transcribe-language-code: en-US x-amz-transcribe-media-encoding: pcm x-amz-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 结构的示例,请参阅使用 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 结构的示例,请参阅使用 Amazon Transcribe 流式处理

步骤 6 - 结束转录流

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

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