You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Soul Machines编排服务器对话回复规范的技术咨询(需确认正确消息信封格式)

关于Soul Machines编排服务器对话回复规范的技术咨询(需确认正确消息信封格式)

我之前在集成Soul Machines编排服务器的时候也踩过一模一样的格式坑,结合官方协议要求和实际调试经验,给你梳理下能解决问题的核心规范:


1. 正确的回复消息信封(核心错误点)

你之前用kind: "event" + name: "conversationResult"的结构是不符合Soul Machines请求-响应协议的,这是导致Avatar不说话的关键原因!

当你收到来自Default UI的scene/request/conversationRequest请求时,必须回复同名称、对应类型的响应,也就是:

  • kind: "response"(而非event)
  • name: "conversationRequest"(和请求的name完全一致)
  • 严格回传请求里的transaction ID(一字不差,Soul Machines靠这个匹配请求和响应)

正确的回复代码示例:

// 对应收到的conversationRequest请求,生成正确的回复
ws.send(JSON.stringify({
  category: "scene",
  kind: "response", // 必须是response,匹配请求的request类型
  name: "conversationRequest", // 和请求的name完全一致
  transaction: data.transaction, // 严格回传请求的transaction,不能修改
  body: {
    personaId: data.body?.personaId ?? 1,
    output: {
      text: ragText, // 你的RAG返回的文本内容
      // 可选:如果需要自定义语音(比如SSML),可以添加speech字段
      // speech: "<speak>Hi there! I'm powered by your RAG.</speak>"
    },
    variables: {} // 可选,根据你的业务需求添加变量
  }
}));

2. body.output的必填与可选字段

  • 必填字段text,这是Avatar显示和朗读的核心内容,只要这个字段存在且非空,Default UI就会触发Avatar说话。
  • 可选字段
    • speech:如果需要控制语音发音(比如带停顿、语调的SSML),可以添加这个字段,它的优先级高于text(Avatar会朗读speech的内容,同时显示text的文本)。
    • language:指定语言代码(比如"en-US""zh-CN"),如果你的RAG返回多语言内容,建议加上这个字段,确保Avatar用对应语言的语音包朗读。

3. 是否需要前置ready/ack事件?

不需要额外的ready或ack事件在第一个conversationRequest之前。只要你的编排WS连接成功(DevTools显示101状态、帧正常流动),Soul Machines的Default UI会自动发起对话请求,你直接回复对应的响应即可。

不过要注意:务必保持WS连接的心跳(你已经做了keep-alive ping/pong,这部分没问题),如果连接超时断开,Avatar会停止响应。


4. 调试小贴士

  1. 检查transaction匹配:在DevTools的WS面板里,对比请求和回复的transaction值,必须完全一致(包括大小写、特殊字符),不匹配的响应会被Soul Machines直接丢弃。
  2. 验证JSON格式:在Node.js里打印JSON.stringify后的回复内容,确保没有语法错误(比如引号未转义、逗号遗漏)。
  3. 隔离测试:先把ragText固定成简单字符串(比如"Test response from RAG"),排除RAG返回内容的影响,确认格式正确后再接入真实的RAG结果。

按照这个结构修改后,你的Avatar应该就能正常朗读RAG返回的内容了。我之前就是误把response写成event导致Avatar没反应,改过来之后立刻就正常了😉

火山引擎 最新活动