关于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完全一致)- 严格回传请求里的
transactionID(一字不差,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. 调试小贴士
- 检查transaction匹配:在DevTools的WS面板里,对比请求和回复的
transaction值,必须完全一致(包括大小写、特殊字符),不匹配的响应会被Soul Machines直接丢弃。 - 验证JSON格式:在Node.js里打印
JSON.stringify后的回复内容,确保没有语法错误(比如引号未转义、逗号遗漏)。 - 隔离测试:先把
ragText固定成简单字符串(比如"Test response from RAG"),排除RAG返回内容的影响,确认格式正确后再接入真实的RAG结果。
按照这个结构修改后,你的Avatar应该就能正常朗读RAG返回的内容了。我之前就是误把response写成event导致Avatar没反应,改过来之后立刻就正常了😉




