使用预签名 S3 时 Alexa 技能无效的 SSML 输出语音 url

Alexa skill Invalid SSML Output Speech when using presigned S3 url

我遇到了一个常见问题。当您创建 Alexa 托管技能时,我正在使用亚马逊生成的示例 python 代码为 S3 中的音频文件生成预签名 URL,如下所示:

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 但解决方案是在您自己的存储桶中创建对象 public,而不是使用 alexa 托管技能提供的对象,这对我来说不合适。

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

"request": {
        "type": "SessionEndedRequest",
        "requestId": "amzn1.echo-api.request.b25a36d3-be89-4952-b688-ae2dc9b7710c",
        "timestamp": "2020-09-26T08:28:23Z",
        "locale": "es-ES",
        "reason": "ERROR",
        "error": {
            "type": "INVALID_RESPONSE",
            "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