使用预先签名的S3网址时,Alexa技能无效的SSML输出语音

如何解决使用预先签名的S3网址时,Alexa技能无效的SSML输出语音

我遇到了一个常见问题。当您创建Alexa托管技能来为S3中的音频文件生成预签名URL时,我使用的是由Amazon生成的示例python代码

url = utils.create_presigned_url(f"Media/file.mp3")

speak_output = f'<audio src="{url}"/>'

正在生成的URL有效期为10分钟,如下所示:

https://s3.eu-west-1.amazonaws.com/88516b63-75bc-4c6a-a6cf-d12860d50b4e-eu-west-1/Media/file.mp3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAYFCHQ4OU2ZBBLLU4%2F20200926%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200926T082211Z&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjENH%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCWV1LXdlc3QtMSJIMEYCIQDfV53BV52momhRGAQkPJVym%2FN%2FrzPMYmCT8SOBke6CKgIhAI4AGnWd9gpzMeQb%2B1nhQ4VusllTzs2ZNZFcMpdxaSRPKuwBCOn%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEQABoMNTYwNjQzMjM2Nzc3IgzP4Hvvs9jrXQGNqCMqwAEysuGmMv8JVDGN4gUip2jplmM7JxiEURGyhQxB9KGycK9y5hQQ6U%2BNd85W%2FZpzFksrzGagC8jJXPgJGSl0eTN1EF%2BOq%2Bk504K%2FfaSKAQr06G7Lb87CKrDFSssoUZGcztQ3oixft9Y3FMCPzd5%2FoO9AG%2BLoK2HzG2YEQyEq05aUqsNDQZG13znFpv80uLELBQc35Oy888k9PYC2tJBvMnuFpMOWr%2FZiGvZKQm8OnpYElmyHjAvY81%2Fl6CxXcuTFwRowq%2FG7%2BwU63wHmb0KR%2BPtPngH3cWgdzkBobNewKpXvczWurUPR9e73SJEjoHPS7VIkGGx6DkWXyUZIB8eOMuy0rZdnsR7MUPc6%2FMjriqqbboLxqN%2B7vmls0tycCSe0INH%2Bo1Kkb2VZwU5kWb%2B3ZAHtzp4xERw2NQXvgVkK5gSoWbt7SGMJfjkp5cSbkxlI1aJxisgdWKWokZiU3GyqrlqVuNpRqom7ZZsuLTNowTzUqQSx92F3ZNefJE17Jr%2Fyy6PSqA7DHRd%2Bv6Jiyuk35GSDdEeJClCofkByxnbu3da%2B8Qtnm%2FtDsUMV&X-Amz-Signature=16fa135dadc7cfa83f9bce10ffcad0e0aff7617414d88fae4b068af5cc2ebd73

因此,该函数返回的最终SSML如下:

{
    "body": {
        "version": "1.0","sessionAttributes": {},"userAgent": "ask-python/1.11.0 Python/3.7.9","response": {
            "outputSpeech": {
                "type": "SSML","ssml": "<speak><audio src=\"superlongurl\"/></speak>"
            }
        }
    }
}

哪个对我来说正确,但Alexa说:

"request": {
        "type": "SessionEndedRequest","requestId": "amzn1.echo-api.request.effc325d-f969-4f3b-aa0e-d339c65ec349","timestamp": "2020-09-26T08:22:12Z","locale": "es-ES","reason": "ERROR","error": {
            "type": "INVALID_RESPONSE","message": "Invalid SSML Output Speech for requestId amzn1.echo-api.request.43ec04ea-4a0c-4971-bb28-71de95141fd6. Error: Fatal error occurred when processing SSML content. This usually happens when the SSML is not well formed. Error: Unexpected character '=' (code 61); expected a semi-colon after the reference for entity 'X-Amz-Credential'\n at [row,col {unkNown-source}]: [1,168]"
        }
    }

我不知道为什么。我已经读过this question,但是解决方案是在您自己的存储桶中公开该对象,而不是使用Alexa托管技能提供的对象,这对我来说不合适。

我也尝试过this one用cgi来转义字符(我使用了html包),但是得到的响应是:

"request": {
        "type": "SessionEndedRequest","requestId": "amzn1.echo-api.request.b25a36d3-be89-4952-b688-ae2dc9b7710c","timestamp": "2020-09-26T08:28:23Z","message": "Invalid Audio Content for requestId amzn1.echo-api.request.5fac838c-0bd1-4704-bdaf-3cbf42d9c766. Error: The audio is not of a supported MPEG version"
        }
    }

这没有意义,因为第一个URL可以正常工作。如果我尝试访问转义的URL,它将不允许我访问并且抱怨字段不存在(查询参数)。

有人对此有真正的解决方案吗?

非常感谢您!

解决方法

在与支持人员交谈了几次并检查了很多事情之后。问题是 MP3 文件的比特率和采样率。您在此处拥有音频文件的所有要求:

https://developer.amazon.com/en-US/docs/alexa/custom-skills/speech-synthesis-markup-language-ssml-reference.html#audio

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?