减少 HTML 有效负载中的 base64 字符串的大小

问题描述 投票:0回答:2

我正在使用 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 专家,因此我不知道可以发送文件的其他格式,也不知道如何创建它们。我尝试寻找字节数组或十六进制字符串,但没有成功。

因此,我们非常感谢任何帮助!预先感谢。

html alexa-skills-kit ask-sdk
2个回答
1
投票

由于图像不适合 Alexa 愿意处理的有效负载,因此您需要将它们发送到带外。

这意味着 Alexa 一旦解析了有效负载,就会向图像 URL 发出单独的请求。

这也意味着在 Alexa 解析有效负载并请求图像的同时,图像需要存储在某个地方。

最简单的方法是将图像存储在 S3 上,并将存储桶设置为在 1 天后使其对象过期(S3 中此设置的最小值)。这会产生一些存储成本,但这是最简单的开发方式,因为将对象放入 S3 后,您可以轻松生成一个 URL 供 Alexa 访问它,并带有一个临时签名,该签名可以设置为在几秒钟内过期。

如果生成图像的服务是有状态的(即作为长期进程运行),您可以向其中添加 Flask 或类似的 Web 服务器,并将图像存储在内存中的哈希映射中,在读取后删除它们.

如果服务是无状态的(API 网关或类似后面的一堆 lambda),您可以使用 Elasticache 实例来进行临时存储。最便宜的实例包含在免费套餐中,但即使您付费,每月费用也约为 20 美元。


0
投票

一种选择是将图像生成与技能端点分离。

我已经通过一些技能完成了这项工作,我需要生成地图、QR 代码或其他图像以在 APL 屏幕中显示。

我没有在 Alexa 响应中内联图像数据,而是返回一个描述图像的 URL。该 URL 指向 API Gateway 中定义的 HTTP API,由一个简单的 Lambda 函数支持,该函数使用 API 的查询字符串参数来生成图像。它以 Base64 编码的图像数据形式返回图像,就像您所做的那样。对于设备来说,这与从 Web 服务器或 S3 请求图像没有什么不同。

© www.soinside.com 2019 - 2024. All rights reserved.