Навык Alexa Неверно выводит речь в формате SSML при использовании предустановленного URL-адреса S3

#amazon-web-services #amazon-s3 #alexa-skills-kit #alexa-skill

#amazon-web-services #amazon-s3 #alexa-skills-kit #alexa-навык

Вопрос:

У меня то, что выглядит как обычная проблема. Я использую пример кода python, сгенерированный Amazon при создании навыка, размещенного на Alexa, для создания предустановленного URL-адреса для аудиофайла в S3 следующим образом:

 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-SHA256amp;X-Amz-Credential=ASIAYFCHQ4OU2ZBBLLU4/20200926/eu-west-1/s3/aws4_requestamp;X-Amz-Date=20200926T082211Zamp;X-Amz-Expires=600amp;X-Amz-SignedHeaders=hostamp;X-Amz-Security-Token=IQoJb3JpZ2luX2VjENH//////////wEaCWV1LXdlc3QtMSJIMEYCIQDfV53BV52momhRGAQkPJVym/N/rzPMYmCT8SOBke6CKgIhAI4AGnWd9gpzMeQb+1nhQ4VusLLTzs2ZNZFcMpdxaSRPKuwBCOn//////////wEQABoMNTYwNjQzMjM2Nzc3IgzP4Hvvs9jrXQGNqCMqwAEysuGmMv8JVDGN4gUip2JPlmM7JxiEURGyhQxB9KGycK9y5hQQ6U+Nd85W/ZpzFksrzGagC8jJXPgJGSl0eTN1EF+Oq+k504K/faSKAQr06G7Lb87CKrDFSssoUZGcztQ3oixft9Y3FMCPzd5/oO9AG+LoK2HzG2YEQyEq05aUqsNDQZG13znFpv80uLELBQc35Oy888k9PYC2tJBvMnuFpMOWr/ZiGvZKQm8OnpYElmyHjAvY81/l6CxXcuTFwRowq/G7+wU63wHmb0KR+PtPngH3cWgdzkBobNewKpXvczWurUPR9e73SJEjoHPS7VIkGGx6DkWXyUZIB8eOMuy0rZdnsR7MUPc6/MjRiqqbboLxqN+7vmls0tycCSe0INH+o1Kkb2VZwU5kWb+3ZAHtzp4xERw2NQXvgVkK5gSoWbt7SGMJfjkp5cSbkxlI1aJxisgdWKWokZiU3GyqrlqVuNpRqom7ZZsuLTNOWTzUqQSx92F3ZNefJE17Jr/yy6PSqA7DHRd+v6Jiyuk35GSDdEeJClCofkByxnbu3da+8Qtnm/tDsUMVamp;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]"
        }
    }
  

И я не могу понять, почему. Я уже читал этот вопрос, но решение заключается в том, чтобы сделать объект общедоступным в вашем собственном ведре, вместо того, чтобы использовать тот, который предоставлен alexa hosted skill, который мне не подходит.

Я также попробовал этот вариант, экранирующий символы с помощью 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-адресу, он мне не позволяет и жалуется на отсутствие полей (параметры запроса).

У кого-нибудь есть реальное решение для этого?

Большое вам спасибо!

Ответ №1:

После нескольких разговоров со службой поддержки и проверки многих вещей. Проблема заключалась в битрейте и частоте дискретизации файла MP3. Здесь у вас есть все требования к аудиофайлам:

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