在 Alexa 技能中播放由 AWS api 网关创建的 mp3

Playing an mp3 created by AWS api gateway in an Alexa skill

我有一个由 AWS api 网关调用的 AWS lambda 函数。该函数从 AWS S3 上托管的多个 mp3 文件中获取 URLs,并将它们连接成一个 mp3 文件。当我从浏览器调用 api 时一切正常(浏览器打开媒体播放器并播放组合音频 mp3)。

URL 请求如下所示:

https://0xxxxxxxx.execute-api.eu-west-1.amazonaws.com/alpha/files?file=https://xxx.s3-eu-west-1.amazonaws.com/file1.mp3&file=https://xxx.s3-eu-west-1.amazonaws.com/file2.mp3&file=https://xxx.s3-eu-west-1.amazonaws.com/file3.mp3

HTTP 响应的类型为 audio/mpeg,长约 10 秒,采用 base64 编码。

我试图用我的技能将其包装到 SSML 中,但失败了。从 Alexa 技能套件语音和音调模拟器中,我收到错误消息“检索文本到语音时出错;输入不兼容”

在模拟器中,我是这样写的:

<speak> 
    <audio src='https://0xxxxxxxx.execute-api.eu-west-1.amazonaws.com/alpha/files?file=https://xxx.s3-eu-west-1.amazonaws.com/file1.mp3&file=https://xxx.s3-eu-west-1.amazonaws.com/file2.mp3&file=https://xxx.s3-eu-west-1.amazonaws.com/file3.mp3'/>
</speak>

我用它来确认 S3 访问在模拟器中有效:

<speak> 
    <audio src='https://s3.amazonaws.com/ask-soundlibrary/human/amzn_sfx_crowd_applause_05.mp3'/>
</speak>

有什么问题吗?我的 lambda 技能的 http 响应有问题,还是需要在 api 网关中启用某些功能?从我的 api 网关日志来看,该技能似乎从未尝试访问网关。

我应该使用不同的方法来获取 mp3 进行播放吗?请注意,我想使用 SSML,因为我的音频是一种效果,因此不应使用音频播放器(这是亚马逊的要求)。

好的,我已经自己解决了。

似乎 SSML audio src 不喜欢 URL 调用中的参数太多。我现在只在 URL 中传递 1 个参数,并使用我的 lambda 函数从该单个参数中删除多个文件名。

https://0xxxxxxxx.execute-api.eu-west-1.amazonaws.com/alpha/files?file=/file1.mp3file=file2.mp3file=file3.mp3

我可能会帮你解决这个问题。同样的问题发生在我身上。经过研究,我解决了它。这里的问题是您在 SSML 中提供的 link 中的“&”。您提供的解决方案有效,因为您的 link 中现在没有“&”。参数太多不是问题。

我建议您将“&”替换为"&amp;"

在python-


url = 'https://0xxxxxxxx.execute-api.eu-west-1.amazonaws.com/alpha/files?file=https://xxx.s3-eu-west-1.amazonaws.com/file1.mp3&file=https://xxx.s3-eu-west-1.amazonaws.com/file2.mp3&file=https://xxx.s3-eu-west-1.amazonaws.com/file3.mp3'
url = url.replace("&","&amp;")


<speak> 
    "<audio src='" +  url + "'/>"
</speak>

希望对您有所帮助。如果不起作用请告诉我。