如何让 Actions on Google 流式传输音频?

Posted

技术标签:

【中文标题】如何让 Actions on Google 流式传输音频?【英文标题】:How can I tell Actions on Google to stream audio? 【发布时间】:2017-06-22 05:59:31 【问题描述】:

我正在编写一个与 Google Actions 配合使用的应用程序。唯一令人遗憾的是,我找不到任何有关如何形成我的响应的信息,以便 Google 将从给定的 URL 流式传输音频。 Google 还支持这个吗?

我已经在 Alexa 上编写了相同的应用程序,在 Alexa 上您只需返回一个音频项目(令牌、URL、播放命令),Alexa 就会开始播放它。

我应该提到我没有使用 API.AI,而只是使用 Actions SDK 并使用 C# 在 Asure 上托管我的 Web 服务。

那么,底线...如何通过 Actions SDK 格式化响应以将 MP3 文件流式传输到 Google Home?

【问题讨论】:

请注意,目前不支持流式音频(例如 HLS),但操作平台可以播放 MP3 文件,如已接受的答案中所述。 【参考方案1】:

更新:第一个答案仅适用于 Dialogflow V1。至于 V2,您可以通过这种方式创建 mediaResponse(来自 Google 的文档):

conv.ask(new MediaObject(
  name: 'Jazz in Paris',
  url: 'http://storage.googleapis.com/automotive-media/Jazz_In_Paris.mp3',
  description: 'A funky Jazz tune',
  icon: new Image(
    url: 'http://storage.googleapis.com/automotive-media/album_art.jpg',
    alt: 'Media icon',
  ),
));

================================================ ==========================

我发布了一个答案over here。

基本上,您可以创建一个 mediaResponse 对象来播放您的音频文件。我可以播放 50 分钟的音频文件就好了。

Node.js 中的代码示例可以是(使用当前文档):

const richResponse = app.buildRichResponse()
 .addSimpleResponse("Here's song one.")
  .addMediaResponse(app.buildMediaResponse()
  .addMediaObjects([
    app.buildMediaObject("Song One", "https://....mp3")
      .setDescription("Song One with description and large image.") // Optional
      .setImage("https://....jpg", app.Media.ImageType.LARGE)
        // Optional. Use app.Media.ImageType.ICON if displaying icon.
  ])
)
.addSuggestions(["other songs"]);

【讨论】:

@RémiC。 Google Home 下载一个 50 分钟的 mp3 文件需要多长时间? Google Home 有很长的延迟?谢谢 @JordanMontel 要播放 50 分钟的专辑,我们需要它的 mp3 版本(如文档所述),然后我们需要将其上传到可以获得 https 链接的地方。我选择了谷歌云存储。最后,要播放它,您需要提供一个链接,当您单击它时播放音频,这很重要。因此,关于您的问题,Google Home 不会下载任何内容,而是流式传输您提供的链接中获得的音频。 @RémiC。谷歌表示 mp3 文件最长为 2 分钟。但是我们可以播放 mp3 超过 2 分钟,我们没有谷歌关于这个限制的答案。我们的 mp3 位于我们的服务器上,带有 https 链接(不在 Google Cloud 内),我们无法移动它。但是 Google Home 需要不同的时间来播放 mp3,具体取决于持续时间。这是因为我们认为 Google Home 在流式传输之前将 mp3 下载到他们的服务器上(因为我们的 mp3 是渐进式链接)。是因为我问你关于延迟的问题吗?如果流很短,你会做些什么来减少延迟吗?谢谢 我试过了,好像只能播放mp3。 ? 我想在我的上下文中播放 m3u8 流。 @JordanMontel 我从来没有尝试过存储在 Google 服务之外的文件,可能是因为我没有看到这个问题......并且使用媒体响应允许我们绕过音频的 120 秒限制由 SSML 提供。谷歌在播放之前下载你的音频可能是对的,我不知道。关于延迟,我只放了我的谷歌存储的音频链接,所以我不知道如何减少它,对不起【参考方案2】:

根据文档,您可以在 SSML 中嵌入元素。 https://developers.google.com/actions/reference/ssml 包含以下示例:

<speak>
  Here are <say-as interpet-as="characters">SSML</say-as> samples.
  I can pause <break time="3s"/>.
  I can play a sound
  <audio src="https://www.example.com/MY_MP3_FILE.mp3">didn't get your MP3 audio file</audio>.
  I can speak in cardinals. Your number is <say-as interpret-as="cardinal">10</say-as>.
  Or I can speak in ordinals. You are <say-as interpret-as="ordinal">10</say-as> in line.
  Or I can even speak in digits. The digits for ten are <say-as interpret-as="characters">10</say-as>.
  I can also substitute phrases, like the <sub alias="World Wide Web Consortium">W3C</sub>.
  Finally, I can speak a paragraph with two sentences.
  <p><s>This is sentence one.</s><s>This is sentence two.</s></p>
</speak>

编辑

p/s:SSML in Documents 有这些限制:

首选单声道,但也可以接受立体声。

最长持续时间为 120 秒。如果您想播放持续时间更长的音频,请考虑实施媒体响应。文件大小限制为 5 MB。

源 URL 必须使用 HTTPS 协议。

我们的 UserAgent 在获取 音频是“Google-Speech-Actions”。

【讨论】:

嘿,感谢您的回答,由于 120 秒的限制,这实际上不是我想要的。我们的组织每周发布大约一小时的音频播客。我们希望能够像在 Alexa 上那样根据请求将它们流式传输给用户。有什么方法可以播放一个小时长的 mp3 文件吗? 尚不支持流式传输。您可以在单个 SSML 响应中包含多个音频源。 开始一个演员会议怎么样?任何人都可以想出一种方法来启动与设备交谈的用户动作的演员会话。目前似乎只有 Netflix 和一些获得批准的合作伙伴能够在 chromecast 设备上启动投射会话。 @LeonNicholls 您知道 Actions on Google 何时支持流式传输吗? @LeonNicholls 我们可以使用 ssml 在 google home 设备上播放实时音频吗?

以上是关于如何让 Actions on Google 流式传输音频?的主要内容,如果未能解决你的问题,请参考以下文章

Actions on Google - 在我的 Android 设备上测试我的项目

在 Actions on Google 应用上设置语音识别上下文?

Actions-on-Google 自定义推送消息说明

帐户关联问题(Actions on Google)

Actions on Google - 哪里可以找到 gactions CLI 的最新文档

order-update.js 在事务 api actions-on-google 中发送“”作为响应