You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Google Actions Node.js客户端向Google Home流S3音频遇问题求助

如何将AWS S3中的Rasa TTS音频流到Google Home?

问题背景与当前困境

我正在尝试把AWS S3上托管的音频文件(来自Rasa机器人文本转语音的输出)流到我的Google Home设备上。整体流程是:用户在Google Home说话→Google Assistant捕获输入→传给Dialogflow→转发给集成好的Rasa机器人→Rasa生成响应转成音频存到S3,现在卡在最后一步:怎么把S3里的音频推回Google Home播放。

我写了一段Node.js代码,想用actions-on-google库处理请求,但完全没效果:

const { actionssdk,dialogflow, } = require('actions-on-google')
const assistant = actionssdk();
app.post('/assistant', assistant);
assistant.intent('', conv => {
  conv.ask(new MediaObject({
    name: 'botsAudioResponse',
    url: 'https://rapbot.s3.amazonaws.com/hi.mp3',
    description: `An audio rendering of my Rasa bot's response`
  }));
});

不管是返回音频还是简单的conv.ask('Hello!'),都没有消息出现在Dialogflow文本框里。打印conv参数还发现它缺少Google Actions测试器应有的信息(比如userName),看起来assistant实例根本没和正确的Dialogflow代理关联。我试过配置Google密钥JSON为环境变量,但还是没用。


解决方案与排查步骤

首先得纠正一个核心误解:Google Actions的请求必须来自Google服务器,不能由Rasa直接发POST调用你的端点。正确的链路应该是:

  1. Google Home → Google Assistant → Dialogflow → 你的Node.js Webhook
  2. Webhook转发用户请求给Rasa
  3. Rasa返回响应文本后,你在Webhook里完成TTS转码并上传到S3
  4. Webhook用conv.ask(MediaObject)把S3音频URL返回给Dialogflow,再由Google Assistant推给Google Home播放

接下来针对你的代码和配置问题逐个解决:

1. 改用Dialogflow SDK适配代理集成

你现在用的actionssdk()适合纯Actions Builder场景,基于Dialogflow代理的集成应该用dialogflow()创建实例,确保能正确解析Dialogflow的请求格式:

const { dialogflow, MediaObject } = require('actions-on-google');
const fetch = require('node-fetch'); // 需要安装node-fetch包

// 初始化Dialogflow客户端,配置密钥
const app = dialogflow({
  keyFilename: process.env.GOOGLE_APPLICATION_CREDENTIALS // 指向你的Google服务账号密钥文件
});

// 绑定Webhook端点
app.post('/assistant', app);

2. 配置正确的Intent关联

代码里的空Intent名称''是无效的,必须和Dialogflow控制台里创建的Intent名称对应(比如Default Welcome Intent或自定义Intent):

app.intent('Default Welcome Intent', async conv => {
  // 1. 把用户输入转发给Rasa
  const rasaResponse = await fetch('https://你的Rasa服务器地址/webhook', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      sender: conv.user.id, // 用Google用户ID作为Rasa的会话标识
      message: conv.query // 用户的输入文本
    })
  });
  const rasaData = await rasaResponse.json();
  const botText = rasaData[0].text;

  // 2. 这里假设你已经把botText转成音频并上传到S3,拿到公开可访问的URL
  const audioUrl = 'https://rapbot.s3.amazonaws.com/hi.mp3';

  // 3. 返回音频响应给Google Assistant
  conv.ask(new MediaObject({
    name: '机器人响应',
    url: audioUrl,
    description: 'Rasa机器人的语音回复'
  }));
});

3. 验证Dialogflow Webhook配置

  • 在Dialogflow控制台进入你的代理→Fulfillment→启用Webhook,填写你的Node.js端点URL(必须是HTTPS,本地测试可用ngrok做隧道)
  • 确保Intent的Fulfillment选项已勾选,触发时会调用你的Webhook

4. 检查S3音频的权限与格式

  • 确保S3音频文件是公开可读的,或者给Google服务账号赋予该文件的读取权限(后者更安全)
  • 音频格式必须符合Google要求:支持MP3/AAC,比特率≥128kbps,采样率44.1kHz或48kHz

5. 用正确的工具测试

不要直接用Rasa调用你的端点,应该用:

  • Dialogflow控制台右侧的Test工具(模拟Google Assistant请求)
  • 直接对着Google Home说话发起请求
    这样conv对象才会包含完整的用户上下文信息,响应才能正常流转。

内容的提问来源于stack exchange,提问作者Martin Connor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:34:48