【问题标题】:preloading short MP3 clips in Python to eliminate playback gaps (for use with an Alexa skill)在 Python 中预加载 MP3 短片段以消除播放间隙(用于 Alexa 技能)
【发布时间】:2020-07-06 07:53:52
【问题描述】:

我已经在 Alexa 论坛上问过这个问题,但并没有真正得到任何关注。希望广大Python社区能帮上忙,然后我看看能不能在Python Alexa技能环境下工作。

我在 Amazon S3 存储桶中托管了短(1-3 秒长度)的 mp3 文件,并希望在我的 alexa 技能中播放它们。我需要能够根据技能中发生的情况来混合效果的顺序,但它们在播放时需要听起来像 1 个长 MP3,即在每个样本的播放之间没有静音/延迟。目前我得到了大约 0.5 到 1 秒的间隔,而且它是可变的。虽然很小,但这种沉默对于我的技能应用来说是无法接受的。

我目前正在使用 SSML,有人建议我改用 Alexa 音频播放器,但我看到论坛 cmet 表明该播放器也存在延迟。

实际上,这就是我的技能:

speak_output =  '<speak> Here are some sounds'
if (a=b):
  speak_output += '<audio src="https://s3xxx/file/anEffect.mp3" />'
speak_output += '<audio src="https://s3xxx/file/anotherEffect.mp3" />'
speak_output += '<audio src="https://s3xxx/file/aThirdEffect.mp3" />'
speak_output +=  '</speak>'
        
print (speak_output)
        
return (
     handler_input.response_builder
         .speak(speak_output)
         .ask(speak_output)
         .response

有没有一种 python 技术可以预加载 MP3 文件,或者在播放之前将多个文件组合成 1 个“虚拟”文件?我希望在 1 个序列中播放的效果将持续不超过 10 秒左右。

【问题讨论】:

    标签: python mp3 alexa


    【解决方案1】:

    事情是这样的……您正在向 Alexa 发送一个 TEXT 响应,其中包含音频 URL。规范说它们必须可以通过 HTTPS 访问互联网并提供服务。因此,您不会将它们加载到您的技能处理程序中。 Alexa 服务会根据您的响应加载它们,然后将它们发送到设备。

    Audioplayer 不适用于混合您想要的小片段。当你使用它时,你应该支持 shuffle on/off、next/back 等。你必须支持一堆你不想要的行为,如果你不这样做,你的技能可能会被拒绝。

    我尝试在我的 SSML 中使用数据 URL(将文件转换为文本并将文件本身作为 URL 发送)来解决这个问题,但该服务给了我一个错误。即使没有,您也会很快遇到 URL 字符串中 8000 个字符和总响应中 24000 个字符的服务限制。

    您是否考虑过设置一个服务,该服务可以将序列作为查询,在内存中将它们相互附加,并将组合的音频作为文件返回?我不是 Python 人,但您似乎可以使用 PyDub 轻松“合理”地做到这一点。

    【讨论】:

    • 感谢@LetMyPeopleCode。我将调查 PyDub - 我假设您的意思是将其作为技能本身之外的服务运行(可能仍在 lambda 中) - 该技能会将所需的效果顺序发送到服务,并且服务会响应 URL 链接?那可以工作。我还需要注意的是计算时间。我不想被很多用户(假设使用了该技能!)经常点击 lamda 服务并让我每个月损失计算时间。这将是我评估的另一个因素!再次感谢。我会回来报告的。
    • 是的,服务将在技能之外运行。 Lambda 比您想象的要便宜得多。在这样的服务开始花费与快乐餐一样多之前,可能需要成千上万的月度用户。该服务将是链接(使用 API 网关),并会返回组合的声音,就像您直接链接到 MP3 一样,但它使用 PyDub 动态构建声音。根据有多少可能的组合,您也可以使用 pyDub 在本地预构建批次,将它们存储在 S3 上,然后从您的技能中调用正确的组合。
    • 明白。我买得起一顿美餐——所以我希望你是对的:-)。最终查询(!),我假设 lamda 服务需要将组合的 MP3 写入 S3 并将链接发送回技能?
    • 不,您应该能够将合成的声音作为流发送。只要确保您在 HTTP 响应标头中正确设置了 MIME 类型,它看起来应该与使用文件响应服务的任何使用者没有什么不同。
    猜你喜欢
    • 2018-10-16
    • 1970-01-01
    • 2020-11-09
    • 2020-03-12
    • 2011-05-03
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多