我正在使用 Amazon python Ask-sdk 包。它使用类似于 HTML 的图像,您可以在其中使用图像 URL 或 base64 字符串,如下所示:
{
"type": "Image",
"source": <image_url> or "data:image/jpeg;base64,<base64_string>",
"width": "30%",
"height": "100%"
}
问题是必须使用的图像是实时生成的,因此无法存储它们,因为随着请求数量的增加,会生成和存储太多图像。然而,使用 Base64 图像使得有效负载比 Alexa 端可以处理的负载大得多。所以我想知道是否有更有效的方法来在有效负载中发送这些图像。
由于我不是 HTML 专家,因此我不知道可以发送文件的其他格式,也不知道如何创建它们。我尝试寻找字节数组或十六进制字符串,但没有成功。
因此,我们非常感谢任何帮助!预先感谢。
由于图像不适合 Alexa 愿意处理的有效负载,因此您需要将它们发送到带外。
这意味着 Alexa 一旦解析了有效负载,就会向图像 URL 发出单独的请求。
这也意味着在 Alexa 解析有效负载并请求图像的同时,图像需要存储在某个地方。
最简单的方法是将图像存储在 S3 上,并将存储桶设置为在 1 天后使其对象过期(S3 中此设置的最小值)。这会产生一些存储成本,但这是最简单的开发方式,因为将对象放入 S3 后,您可以轻松生成一个 URL 供 Alexa 访问它,并带有一个临时签名,该签名可以设置为在几秒钟内过期。
如果生成图像的服务是有状态的(即作为长期进程运行),您可以向其中添加 Flask 或类似的 Web 服务器,并将图像存储在内存中的哈希映射中,在读取后删除它们.
如果服务是无状态的(API 网关或类似后面的一堆 lambda),您可以使用 Elasticache 实例来进行临时存储。最便宜的实例包含在免费套餐中,但即使您付费,每月费用也约为 20 美元。
一种选择是将图像生成与技能端点分离。
我已经通过一些技能完成了这项工作,我需要生成地图、QR 代码或其他图像以在 APL 屏幕中显示。
我没有在 Alexa 响应中内联图像数据,而是返回一个描述图像的 URL。该 URL 指向 API Gateway 中定义的 HTTP API,由一个简单的 Lambda 函数支持,该函数使用 API 的查询字符串参数来生成图像。它以 Base64 编码的图像数据形式返回图像,就像您所做的那样。对于设备来说,这与从 Web 服务器或 S3 请求图像没有什么不同。