使用预先签名的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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...