PostContent - Amazon Lex V1

如果您使用的是 Amazon Lex V2,请改为参阅 Amazon Lex V2 指南

 

如果您使用的是 Amazon Lex V1,我们建议您将机器人升级到 Amazon Lex V2。我们不再向 V1 添加新功能,强烈建议使用 V2 以获得全新的机器人。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

PostContent

将用户输入(文本或语音)发送到 Amazon Lex。客户端使用此 API 在运行时向 Amazon Lex 发送文本和音频请求。Amazon Lex 使用其为机器人构建的机器学习模型来解释用户输入。

PostContent 操作支持 8kHz 和 16kHz 的音频输入。在电话音频应用中,您可以使用 8kHz 音频来实现更高的语音识别精度。

在响应中,Amazon Lex 会返回下一条要传达给用户的消息。考虑以下示例消息:

  • 对于用户输入“我想要披萨”,Amazon Lex 可能会返回一条响应,其中包含一条引发插槽数据的消息(例如,PizzaSize):“您想要什么尺寸的披萨?”。

  • 在用户提供所有披萨订单信息后,Amazon Lex 可能会返回一条消息以获取用户确认:“是否下披萨订单?”。

  • 用户对确认提示回答“是”后,Amazon Lex 可能会返回结论语句:“谢谢,已经为您的奶酪披萨下订单。”。

并非所有 Amazon Lex 消息都需要用户响应。例如,结论语句不需要响应。有些消息只需要“是”或“否”响应。除了 message 之外,Amazon Lex 还提供了有关响应中消息的其他上下文,您可以使用这些上下文来增强客户行为,例如显示相应的客户端用户界面。考虑以下示例:

  • 如果消息是为了引发插槽数据,Amazon Lex 会返回以下上下文信息:

    • x-amz-lex-dialog-state 标头设置为 ElicitSlot

    • x-amz-lex-intent-name 标头设置为当前上下文中的意图名称

    • x-amz-lex-slot-to-elicit 标头设置为 message 正在引发信息的插槽名称

    • x-amz-lex-slots 标头设置为使用当前值为意图配置的插槽映射

  • 如果消息是确认提示,则 x-amz-lex-dialog-state 标头设置为 Confirmationx-amz-lex-slot-to-elicit 标头将被省略。

  • 如果消息是为意图配置的澄清提示,表示用户意图未被理解,则 x-amz-dialog-state 标头设置为 ElicitIntentx-amz-slot-to-elicit 标头将被省略。

此外,Amazon Lex 还会返回您的应用程序特定的 sessionAttributes。有关更多信息,请参阅管理对话上下文

请求语法

POST /bot/botName/alias/botAlias/user/userId/content HTTP/1.1 x-amz-lex-session-attributes: sessionAttributes x-amz-lex-request-attributes: requestAttributes Content-Type: contentType Accept: accept x-amz-lex-active-contexts: activeContexts inputStream

URI 请求参数

请求使用以下 URI 参数。

accept

您将此值作为 Accept HTTP 标头进行传递。

根据请求中的 Accept HTTP 标头值,Amazon Lex 在响应中返回的消息可以是文本,也可以是语音。

  • 如果值为 text/plain; charset=utf-8,则 Amazon Lex 会在响应中返回文本。

  • 如果值以 audio/ 开头,则 Amazon Lex 会在响应中返回语音。Amazon Lex 使用 Amazon Polly 生成语音(使用您在 Accept 标头中指定的配置)。例如,如果您将 audio/mpeg 指定为值,Amazon Lex 将返回 MPEG 格式的语音。

  • 如果值为 audio/pcm,则返回的语音采用 16 位小端序格式的 audio/pcm

  • 以下是接受的值:

    • audio/mpeg

    • audio/ogg

    • audio/pcm

    • text/plain; charset=utf-8

    • audio/*(默认值为 mpeg)

activeContexts

请求的活动上下文列表。可以在履行先前的意图时激活上下文,也可以通过在请求中包含上下文来激活上下文,

如果您未指定上下文列表,Amazon Lex 将使用会话的上下文的当前列表。如果您指定一个空列表,则会话的所有上下文都将被清除。

botAlias

Amazon Lex 机器人的别名。

必需:是

botName

Amazon Lex 机器人的名称。

必需:是

contentType

您将此值作为 Content-Type HTTP 标头进行传递。

表示音频格式或文本。标头值必须以下列其中一个前缀开头:

  • PCM 格式,音频数据必须按小端序字节顺序排列。

    • audio/l16; rate=16000; channels=1

    • audio/x-l16; sample-rate=16000; channel-count=1

    • audio/lpcm;sample-rate=8000;=16;channel-count=1;=false sample-size-bits is-big-endian

  • Opus 格式

    • audio/ x-cbr-opus-with-preamble;preamble-size=0;bit-rate=256000;=4 frame-size-milliseconds

  • 文本格式

    • text/plain; charset=utf-8

必需:是

requestAttributes

您将此值作为 x-amz-lex-request-attributes HTTP 标头进行传递。

在 Amazon Lex 和客户端应用程序之间传递的特定于请求的信息。该值必须是带有字符串键和值的 JSON 序列化和 base64 编码映射。requestAttributessessionAttributes 标头的总大小限制为 12 KB。

命名空间 x-amz-lex: 保留供特殊属性使用。请勿创建带有 x-amz-lex: 前缀的任何请求属性。

有关更多信息,请参阅设置请求属性

sessionAttributes

您将此值作为 x-amz-lex-session-attributes HTTP 标头进行传递。

在 Amazon Lex 和客户端应用程序之间传递的特定于应用程序的信息。该值必须是带有字符串键和值的 JSON 序列化和 base64 编码映射。sessionAttributesrequestAttributes 标头的总大小限制为 12 KB。

有关更多信息,请参阅设置会话属性

userId

客户端应用程序用户的 ID。Amazon Lex 使用它来识别用户与您的机器人的对话。在运行时,每个请求都必须包含 userID 字段。

要决定用于您的应用程序的用户 ID,请考虑以下因素。

  • userID 字段不得包含用户的任何个人身份信息,例如姓名、个人识别号或其他最终用户的个人信息。

  • 如果您希望用户在一台设备上开始对话,然后在另一台设备上继续对话,请使用用户特定的标识符。

  • 如果您希望同一个用户能够在两台不同的设备上进行两次独立的对话,请选择设备特定的标识符。

  • 用户不能与同一个机器人的两个不同版本进行两个独立的对话。例如,用户无法与同一个机器人的 PROD 和 BETA 版本进行对话。如果您预计用户需要与两个不同的版本进行对话(例如,在测试期间),请在用户 ID 中包含机器人别名以将这两个对话分开。

长度限制:最小长度为 2。最大长度为 100。

模式:[0-9a-zA-Z._:-]+

必需:是

请求正文

请求接受以下二进制数据。

inputStream

用户以 PCM 或 Opus 音频格式或文本格式输入,如 Content-Type HTTP 标头中所述。

您可以将音频数据流式传输到 Amazon Lex,也可以创建本地缓冲区,在发送之前捕获所有音频数据。通常,如果您流式传输音频数据而不是在本地缓冲数据,则性能会更好。

必需:是

响应语法

HTTP/1.1 200 Content-Type: contentType x-amz-lex-intent-name: intentName x-amz-lex-nlu-intent-confidence: nluIntentConfidence x-amz-lex-alternative-intents: alternativeIntents x-amz-lex-slots: slots x-amz-lex-session-attributes: sessionAttributes x-amz-lex-sentiment: sentimentResponse x-amz-lex-message: message x-amz-lex-encoded-message: encodedMessage x-amz-lex-message-format: messageFormat x-amz-lex-dialog-state: dialogState x-amz-lex-slot-to-elicit: slotToElicit x-amz-lex-input-transcript: inputTranscript x-amz-lex-encoded-input-transcript: encodedInputTranscript x-amz-lex-bot-version: botVersion x-amz-lex-session-id: sessionId x-amz-lex-active-contexts: activeContexts audioStream

响应元素

如果此操作成功,则该服务将会发送回 HTTP 200 响应。

响应将返回以下 HTTP 标头。

activeContexts

会话的活动上下文列表。可以在履行意图时设置上下文,也可以通过调用 PostContentPostTextPutSession 操作来设置上下文。

您可以使用上下文来控制可以跟进意图的意图,也可以修改应用程序的操作。

alternativeIntents

一到四个可能适用于用户意图的替代意图。

每个替代意图都包括一个分数,该分数表明 Amazon Lex 对意图与用户意图相匹配的信心程度。意图按置信度分数排序。

botVersion

响应对话的机器人的版本。您可以使用此信息来帮助确定机器人的一个版本的性能是否优于另一个版本。

长度限制:长度下限为 1。长度上限为 64。

模式:[0-9]+|\$LATEST

contentType

请求的 Accept HTTP 标头中指定的内容类型。

dialogState

标识用户交互的当前状态。Amazon Lex 返回以下任一值作为 dialogState。客户可以选择使用此信息来自定义用户界面。

  • ElicitIntent — Amazon Lex 想要引发的用户的意图。考虑以下示例:

    例如,用户可能会说出意图(“我想点披萨”)。如果 Amazon Lex 无法从此言语中推断出用户的意图,它将返回此对话状态。

  • ConfirmIntent — Amazon Lex 预计会有“是”或“否”响应。

    例如,Amazon Lex 希望用户在履行意图之前进行确认。用户可能会响应其他信息,而不是简单的“是”或“否”响应。例如,“是,但要做个厚皮披萨”或“否,我想点一份饮品”。Amazon Lex 可以处理此类额外信息(在这些示例中,更新外壳类型槽或将意图从更改 OrderPizza 为 OrderDrink)。

  • ElicitSlot — Amazon Lex 期望当前意图的插槽值。

    例如,假设 Amazon Lex 在响应中发送了以下消息:“您想要什么尺寸的披萨?”。用户可能会响应插槽值(例如,“中等”)。用户还可能在响应中提供其他信息(例如,“中厚皮披萨”)。Amazon Lex 可以适当地处理此类额外信息。

  • Fulfilled — 表示 Lambda 函数已成功履行意图。

  • ReadyForFulfillment — 表示客户必须满足请求。

  • Failed — 表示与用户的对话失败。

    发生这种情况的原因可能多种多样,包括用户没有对服务提示做出适当的响应(您可以配置 Amazon Lex 可以提示用户输入特定信息的次数),或者 Lambda 函数无法履行意图。

有效值:ElicitIntent | ConfirmIntent | ElicitSlot | Fulfilled | ReadyForFulfillment | Failed

encodedInputTranscript

用于处理请求的文本。

如果输入为音频流,则 encodedInputTranscript 字段包含从该音频流中提取的文本。这是经过实际处理以识别目的和槽值的文本。您可以使用该信息来确定 Amazon Lex 是否正确处理了您发送的音频。

encodedInputTranscript 字段采用 base-64 编码。必须先解码该字段,然后才能使用该值。

encodedMessage

要传达给用户的消息。消息可以来自机器人的配置或 Lambda 函数。

如果未使用 Lambda 函数配置意图,或者如果 Lambda 函数在其响应中返回 Delegate 作为 dialogAction.type,则 Amazon Lex 会决定下一步操作,并根据当前的交互上下文从机器人的配置中选择相应的消息。例如,如果 Amazon Lex 无法理解用户输入,则会使用澄清提示消息。

创建意图时,您可以将消息分配给群组。将消息分配给群组后,Amazon Lex 会在响应中返回来自每个群组的一条消息。消息字段是一个包含消息的转义的 JSON 字符串。有关返回的 JSON 字符串结构的更多信息,请参阅受支持的消息格式

如果 Lambda 函数返回消息,则 Amazon Lex 会在响应中将其传递给客户端。

encodedMessage 字段采用 base-64 编码。必须先解码该字段,然后才能使用该值。

长度限制:长度下限为 1。最大长度为 1366。

inputTranscript

此标头已被弃用。

用于处理请求的文本。

您只能在 de-DE、en-AU、en-GB、en-US、es-419、es-ES、es-US、fr-CA、fr-FR 和 it-IT 区域设置中使用此字段。在所有其他区域设置中,inputTranscript 字段均为空。您应改用 encodedInputTranscript 字段。

如果输入为音频流,则 inputTranscript 字段包含从该音频流中提取的文本。这是经过实际处理以识别目的和槽值的文本。您可以使用该信息来确定 Amazon Lex 是否正确处理了您发送的音频。

intentName

Amazon Lex 知道的当前用户意图。

message

此标头已被弃用。

您只能在 de-DE、en-AU、en-GB、en-US、es-419、es-ES、es-US、fr-CA、fr-FR 和 it-IT 区域设置中使用此字段。在所有其他区域设置中,message 字段均为空。您应改用 encodedMessage 字段。

要传达给用户的消息。消息可以来自机器人的配置或 Lambda 函数。

如果未使用 Lambda 函数配置意图,或者如果 Lambda 函数在其响应中返回 Delegate 作为 dialogAction.type,则 Amazon Lex 会决定下一步操作,并根据当前的交互上下文从机器人的配置中选择相应的消息。例如,如果 Amazon Lex 无法理解用户输入,则会使用澄清提示消息。

创建意图时,您可以将消息分配给群组。将消息分配给群组后,Amazon Lex 会在响应中返回来自每个群组的一条消息。消息字段是一个包含消息的转义的 JSON 字符串。有关返回的 JSON 字符串结构的更多信息,请参阅受支持的消息格式

如果 Lambda 函数返回消息,则 Amazon Lex 会在响应中将其传递给客户端。

长度限制:长度下限为 1。最大长度为 1024。

messageFormat

响应消息的格式。下列值之一:

  • PlainText — 消息包含 UTF-8 纯文本。

  • CustomPayload — 消息是客户端的自定义格式。

  • SSML — 消息包含为语音输出设置格式的文本。

  • Composite — 消息包含一个转义的 JSON 对象,其中包含一条或多条来自创建意图时消息分配到的群组中的一条或多条消息。

有效值:PlainText | CustomPayload | SSML | Composite

nluIntentConfidence

提供一个分数,表示 Amazon Lex 对返回的意图是符合用户的意图的信心程度。分数必须介于 0.0 到 1.0 之间。

分数是相对分数,而不是绝对分数。根据对 Amazon Lex 的改进,分数可能会发生变化。

sentimentResponse

用言语表达的情绪。

当机器人配置为向 Amazon Comprehend 发送言语以进行情绪分析时,此字段将包含分析结果。

sessionAttributes

表示会话特定上下文信息的键值对的映射。

sessionId

会话的唯一标识符。

slots

Amazon Lex 在对话期间从用户输入中检测到的零个或零个以上意图插槽值(键值对)的映射。字段采用 base-64 编码。

Amazon Lex 会创建包含插槽可能值的列表。它返回的值由创建或更新插槽类型时 valueSelectionStrategy 所选的值决定。如果 valueSelectionStrategy 设置为 ORIGINAL_VALUE,并且用户值与插槽值相近,则返回用户提供的值。如果 valueSelectionStrategy 设置为 TOP_RESOLUTION,Amazon Lex 会返回解决方案列表中的第一个值,如果没有解决方案列表,则返回空值。如果不指定 valueSelectionStrategy,则默认值为 ORIGINAL_VALUE

slotToElicit

如果 dialogState 值为 ElicitSlot,则返回 Amazon Lex 正在为其获取值的插槽的名称。

响应将以下内容作为 HTTP 正文返回。

audioStream

要向用户传达的提示(或语句)。这取决于机器人的配置和上下文。例如,如果 Amazon Lex 不了解用户意图,则会发送为机器人配置的 clarificationPrompt。如果意图需要在采取履行操作之前进行确认,则它会发送 confirmationPrompt。另一个示例:假设 Lambda 函数成功履行了意图,并向用户发送了一条消息。然后,Amazon Lex 在响应中发送了该消息。

错误

BadGatewayException

要么是 Amazon Lex 机器人仍在构建,要么其中一个依赖服务(Amazon Polly、AWS Lambda)因内部服务错误而失败。

HTTP 状态代码:502

BadRequestException

请求验证失败,上下文中没有可用的消息,或者机器人构建失败、仍在进行中或者包含未构建的更改。

HTTP 状态代码:400

ConflictException

两个客户端使用相同的 AWS 账户、Amazon Lex 机器人和用户 ID。

HTTP 状态代码:409

DependencyFailedException

其中一个依赖项(例如 AWS Lambda 或 Amazon Polly)引发了异常。例如,

  • 如果 Amazon Lex 没有足够的权限来调用 Lambda 函数。

  • 如果 Lambda 函数的执行时间超过 30 秒。

  • 如果履行 Lambda 函数返回 Delegate 对话操作而不删除任何插槽值。

HTTP 状态代码:424

InternalFailureException

内部服务错误。重试调用。

HTTP 状态代码:500

LimitExceededException

已超出限制。

HTTP 状态代码:429

LoopDetectedException

不使用此异常。

HTTP 状态代码:508

NotAcceptableException

请求中的接受标头没有有效值。

HTTP 状态代码:406

NotFoundException

未找到所引用的资源(例如 Amazon Lex 机器人或别名)。

HTTP 状态代码:404

RequestTimeoutException

输入的语音太长。

HTTP 状态代码:408

UnsupportedMediaTypeException

内容类型标头 (PostContent API) 的值无效。

HTTP 状态代码:415

示例

示例 1

在此请求中,URI 标识了机器人 (Traffic)、机器人版本 ($LATEST) 和最终用户名 (someuser)。Content-Type 标头标识正文中音频的格式。Amazon Lex 还支持其他格式。如有必要,要将音频从一种格式转换为另一种格式,可以使用 SoX 开源软件。您可以通过添加 Accept HTTP 标头来指定获取响应的格式。

在响应中,x-amz-lex-message 标头显示了 Amazon Lex 返回的响应。然后,客户端可以向用户发送此响应。相同的消息通过分块编码(按要求)以 audio/MPEG 格式发送。

示例请求

"POST /bot/Traffic/alias/$LATEST/user/someuser/content HTTP/1.1[\r][\n]" "x-amz-lex-session-attributes: eyJ1c2VyTmFtZSI6IkJvYiJ9[\r][\n]" "Content-Type: audio/x-l16; channel-count=1; sample-rate=16000f[\r][\n]" "Accept: audio/mpeg[\r][\n]" "Host: runtime.lex.us-east-1.amazonaws.com[\r][\n]" "Authorization: AWS4-HMAC-SHA256 Credential=BLANKED_OUT/20161230/us-east-1/lex/aws4_request, SignedHeaders=accept;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-lex-session-attributes, Signature=78ca5b54ea3f64a17ff7522de02cd90a9acd2365b45a9ce9b96ea105bb1c7ec2[\r][\n]" "X-Amz-Date: 20161230T181426Z[\r][\n]" "X-Amz-Content-Sha256: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855[\r][\n]" "Transfer-Encoding: chunked[\r][\n]" "Connection: Keep-Alive[\r][\n]" "User-Agent: Apache-HttpClient/4.5.x (Java/1.8.0_112)[\r][\n]" "Accept-Encoding: gzip,deflate[\r][\n]" "[\r][\n]" "1000[\r][\n]" "[0x7][0x0][0x7][0x0][\n]" "[0x0][0x7][0x0][0xfc][0xff][\n]" "[0x0][\n]" …

示例响应

"HTTP/1.1 200 OK[\r][\n]" "x-amzn-RequestId: cc8b34af-cebb-11e6-a35c-55f3a992f28d[\r][\n]" "x-amz-lex-message: Sorry, can you repeat that?[\r][\n]" "x-amz-lex-dialog-state: ElicitIntent[\r][\n]" "x-amz-lex-session-attributes: eyJ1c2VyTmFtZSI6IkJvYiJ9[\r][\n]" "Content-Type: audio/mpeg[\r][\n]" "Transfer-Encoding: chunked[\r][\n]" "Date: Fri, 30 Dec 2016 18:14:28 GMT[\r][\n]" "[\r][\n]" "2000[\r][\n]" "ID3[0x4][0x0][0x0][0x0][0x0][0x0]#TSSE[0x0][0x0][0x0][0xf][0x0][0x0][0x3]Lavf57.41.100[0x0][0x0][0x0][0x0][0x0][0x0][0x0][0x0][0x0][0x0][0x0][0xff][0xf3]`[0xc4][0x0][0x1b]{[0x8d][0xe8][0x1]C[0x18][0x1][0x0]J[0xe0]`b[0xdd][0xd1][0xb][0xfd][0x11][0xdf][0xfe]";[0xbb][0xbb][0x9f][0xee][0xee][0xee][0xee]|DDD/[0xff][0xff][0xff][0xff]www?D[0xf7]w^?[0xff][0xfa]h[0x88][0x85][0xfe][0x88][0x88][0x88][[0xa2]'[0xff][0xfa]"{[0x9f][0xe8][0x88]]D[0xeb][0xbb][0xbb][0xa2]!u[0xfd][0xdd][0xdf][0x88][0x94][0x0]F[0xef][0xa1]8[0x0][0x82]w[0x88]N[0x0][0x0][0x9b][0xbb][0xe8][0xe …

另请参阅

有关在特定语言的 AWS SDK 中使用此 API 的更多信息,请参阅以下内容: