真正的终端 Agent,不是多接几个功能,而是打通一条具身智能链路!

0 阅读16分钟

前言

过去一年,Agent 被反复讨论。

很多产品的讲法也越来越相似:接入大模型、配置工具、增加工作流、挂上知识库,然后告诉用户——这是一个 Agent。

但当我们把 Agent 放到真实终端场景里,比如展厅屏、导览机、客服屏、政务自助终端、门店导购屏,就会发现一个问题:

会回答,不等于能服务。

一个真正可落地的终端 Agent,不只是把 LLM 接进来,也不是把几个工具堆在一起,而是要让 AI 能够完成一条连续链路:

听懂用户 → 生成回应 → 自然表达 → 屏幕展示 → 状态反馈 → 继续交互。

这也是为什么,讨论魔珐星云时,不能只把它看成“数字人播放工具”。从官方文档看,魔珐星云具身驱动 SDK 的定位,是把 AI 的表达从“文本”升级为“3D 多模态”,基于文本输入实时生成语音、表情与动作,驱动 3D 数字人或人形机器人。它的核心能力包括实时 3D 数字人渲染与驱动、语音合成与口型同步、多状态行为控制、Widget 组件展示,以及自定义事件回调与日志系统。

这意味着,魔珐星云解决的不是“让数字人说一句话”,而是补齐终端 Agent 最关键的一层:具身表达层

如下为魔珐星云官网所展示的专属场景数字人:

一、什么是具身智能体?

如果用一句话解释:

具身智能体,就是一个不仅能“思考”,还能通过声音、表情、动作、状态和屏幕组件与用户交互的 AI 服务角色。

普通 Agent 主要输出文本。 具身智能体则需要把 AI 的结果转化成用户可以感知的终端体验。

两者差别可以这样理解:

flowchart LR
    A[普通 Agent] --> B[理解问题]
    B --> C[生成文本答案]

    D[具身智能体] --> E[理解问题]
    E --> F[生成回应]
    F --> G[语音合成]
    G --> H[口型同步]
    H --> I[表情与动作]
    I --> J[屏幕组件展示]
    J --> K[状态反馈]

所以,具身智能体不是“数字人 + 大模型”的简单相加,而是一个围绕终端交互重新组织的系统。

魔珐星云 JS SDK Demo 文档也印证了这一点:它的 Demo 目标不是单纯展示数字人,而是通过接入第三方 ASR、LLM,完成一个可以交互对话的数字人应用;主要功能包括接入魔珐星云具身驱动 SDK、对接 LLM 实现文本对话、对接 ASR 实现语音转文本后的对话。

也就是说,具身智能体的关键不是“有没有一个虚拟形象”,而是这套形象能不能被放进一条完整的交互链路里。

二、为什么终端 Agent 不能只靠 LLM?

很多团队做 Agent,会从 LLM 开始。

这当然没错。 LLM 负责理解意图、生成答案,是智能体的大脑。

但如果终端 Agent 只有大脑,它就会变成这样:

flowchart LR
    A[用户输入] --> B[LLM 理解与生成]
    B --> C[文本输出]

这个结构适合聊天窗口,却不适合终端服务。

原因很简单:终端场景里,用户不只是来“看答案”的,而是来“完成交互”的。

比如用户站在展厅屏前问:

“你们这个方案适合哪些行业?”

如果系统只返回一段文字,它只是一个问答系统。 如果系统能够用数字人自然讲解,同时同步展示行业案例、图片或字幕,并在用户追问时切换到倾听、思考、回答状态,它才更接近一个终端 Agent。

魔珐星云文档中提到,SDK 支持 Idle、Listen、Speak 等多状态行为控制;在进阶接入部分,还提供了 offline、online、idle、interactive_idle、listen、think、speak 等状态方法,用来管理数字人在离线、在线、待机、倾听、思考和说话中的切换。

这说明终端 Agent 的关键不是“能不能生成回答”,而是:

AI 的思考结果能不能被稳定地表达出来,并且在交互过程中保持状态可控。

三、端到端架构应该怎么拆?

如果把一个具身智能体拆开,它至少包括五层。

flowchart TB
    A[输入层<br/>文本 / 语音 / 触控] --> B[理解层<br/>ASR / LLM / 上下文]
    B --> C[决策层<br/>回答生成 / 工具调用 / 业务判断]
    C --> D[具身表达层<br/>TTS / 口型 / 表情 / 动作 / 状态]
    D --> E[终端呈现层<br/>3D数字人 / 字幕 / 图片 / 视频 / Widget]
    E --> F[反馈层<br/>语音状态 / 网络状态 / SDK状态 / 事件回调]
    F --> B

1. 输入层:用户先进入系统

终端 Agent 的输入可以是文本,也可以是语音。在官方 Demo 中,魔珐星云给出的交互数字人示例,是通过第三方 ASR 做语音转文本,再对接 LLM 完成对话。

这里要注意一点:魔珐星云文档并没有把 ASR 和 LLM 说成自己内置能力,而是明确展示了“对接第三方 ASR、LLM”的接入方式。所以更准确的架构表述是:

魔珐星云负责具身驱动与表达,ASR/LLM/业务系统可以由开发者按场景接入。

2. 理解层:LLM 负责把输入变成可用语义

当用户输入被转成文本后,LLM 负责理解用户意图并生成回应。

官方 Demo 文档中提到,Demo 可对接 LLM 大模型,实现文本对话,并给出了 OpenAI 兼容 API 的示例环境。

这说明,在魔珐星云的终端 Agent 架构中,LLM 更像“大脑层”:它负责理解和生成,但不负责数字人的语音、口型、动作和渲染。

3. 决策层:把回答变成可执行的表达指令

终端 Agent 不只是把 LLM 的文本原样吐出来,还要把内容转成适合数字人表达的指令。

在魔珐星云 SDK 中,speak 方法用于控制虚拟人说话,参数可以直接传入文本,也可以传入 SSML 格式标记语言来指定数字人做出 KA 动作。文档还给出了语义 KA 指令、技能 KA 指令和 Speak KA 指令示例。

这一步很关键。

因为它意味着开发者可以把“回答内容”和“表达动作”组织在一起,让数字人的表达不只是语音播报,而是带有动作、表情和语义配合的多模态表达。

4. 具身表达层:魔珐星云的核心位置

具身表达层是星云最核心的价值区,魔珐星云是 AI 屏幕操作系统、具身智能时代的表达层基础设施。

官方文档里写得很明确:魔珐星云具身驱动可以基于文本输入,实时生成语音、表情与动作,驱动 3D 数字人或人形机器人,并提供语音合成、口型同步、多状态行为控制、Widget 展示和事件回调等能力。

如果用架构语言翻译,它承担的是:

把 LLM 的文本结果,转成用户可感知的 3D 多模态输出。

flowchart LR
    A[LLM 输出文本] --> B[Speak / SSML]
    B --> C[语音合成]
    C --> D[口型同步]
    D --> E[表情与动作]
    E --> F[3D数字人渲染]
    F --> G[用户感知到的表达]

这也是它和普通数字人播放器最大的区别。播放器只是播一段内容。具身驱动则要在实时交互里管理说话、动作、状态、组件和反馈。

5. 终端呈现层:不只是数字人,还有屏幕组件

一个终端 Agent 不应该只有数字人站在那里说话。

在魔珐星云 JS SDK 中,Widget 组件可以展示图片、字幕、视频等内容;SDK 默认支持 subtitle_onsubtitle_offwidget_pic 事件,同时也可以通过 onWidgetEventproxyWidget 代理事件,实现默认事件重写或自定义事件。

这意味着,终端 Agent 的呈现层可以是:

  • 数字人讲解;
  • 字幕同步;
  • 图片展示;
  • 视频展示;
  • 背景切换;
  • 业务信息展示。

魔珐星云“从零到一教学”里也给出了更具体的实现方式:例如通过 proxyWidget 覆盖默认字幕行为,或者通过 widget_pic 事件切换背景图片;文档还说明了数字人渲染层、背景层和交互层可以通过 HTML/CSS 图层叠加来组织。

这让终端 Agent 从“单一播报”变成“屏幕协同表达”。

四、真正的架构升级:从播放器逻辑到智能体逻辑

传统数字人的逻辑通常是:

flowchart LR
    A[输入脚本] --> B[生成语音或视频]
    B --> C[播放展示]

这是一条单向链路。 它适合宣传片、固定讲解、标准话术。

但终端 Agent 的逻辑应该是:

flowchart LR
    A[用户实时输入] --> B[ASR / 文本识别]
    B --> C[LLM理解与生成]
    C --> D[Speak / SSML表达编排]
    D --> E[魔珐星云具身驱动]
    E --> F[数字人语音 / 口型 / 表情 / 动作]
    F --> G[Widget组件展示]
    G --> H[状态与事件回调]
    H --> C

这是一条闭环链路。

它不是“先生成,再播放”,而是“实时输入、实时生成、实时驱动、实时反馈”。

魔珐星云文档中特别提到了大模型流式输出场景:可以流式调用 speak 方法,通过 is_startis_end 标识控制流式传入;首次调用 is_start=true,最后一次调用 is_end=true。文档也提醒,为保证较好呈现,首次可以积攒一小段内容后调用,并且 speak 过程中会通过 onVoiceStateChange 抛出讲话开始和结束事件,用于管理说话状态。

这正是终端 Agent 的工程关键: 不是等全部文本生成完再播放,而是要支持和大模型输出节奏更匹配的表达方式。

五、开发者如何理解“端到端完整能力”?

这里的“端到端”,不是说魔珐星云包办所有 Agent 能力。

更准确地说,魔珐星云官方资料呈现出的端到端能力,是围绕数字人具身表达与终端呈现展开的完整链路。

它覆盖了这些关键环节:

flowchart TB
    A[应用创建<br/>App ID / App Secret] --> B[SDK初始化<br/>容器 / 服务接口 / 硬件加速]
    B --> C[数字人呈现<br/>3D渲染与驱动]
    C --> D[说话控制<br/>Speak / SSML / 流式输入]
    D --> E[动作表达<br/>KA动作 / 表演风格]
    E --> F[组件展示<br/>字幕 / 图片 / 视频 / Widget]
    F --> G[状态监听<br/>Voice / Network / SDK State]
    G --> H[业务侧联动<br/>自定义事件 / 回调处理]

官方“从零到一教学”也从开发者实操角度说明了接入路径:先在魔珐星云平台获取 AppID 和 AppSecret,并配置数字人形象;然后定义装载数字人的容器,引入 JS SDK,创建 XmovAvatar 实例,并初始化显示数字人。

也就是说,魔珐星云提供的是一个可以被开发者接入、配置、驱动和扩展的具身表达底座,而且支持端到端响应约 500ms、支持随时打断。

六、为什么它不是“堆功能”?

因为堆功能的结果,是模块之间各自独立。

比如:

  • LLM 只管生成文本;
  • TTS 只管转语音;
  • 数字人只管播放;
  • 前端只管展示;
  • 业务系统只管返回数据。

这样做出来的系统,经常会出现体验断裂:

  • 文字生成了,语音没跟上;
  • 语音播放了,口型不同步;
  • 用户打断了,系统不知道该停;
  • 内容变化了,屏幕组件没同步;
  • 网络异常了,前端无法感知状态。

魔珐星云 SDK 文档里大量出现的状态监听、事件回调和错误码,其实正是为了解决这种工程断裂。比如 SDK 初始化参数里包含 onWidgetEventproxyWidgetonNetworkInfoonMessageonStateChangeonStatusChangeonStateRenderChangeonVoiceStateChange 等回调;文档也列出了容器不存在、连接错误、音频解码错误、网络断开等错误码。

这些能力看起来不像“前台卖点”,但它们决定了终端 Agent 能不能稳定运行。

真正的终端 Agent 开发,拼的不是某一个功能多亮眼,而是每个环节之间能不能衔接起来。

七、一个具体场景:展厅讲解 Agent 的完整链路

假设我们要做一个企业展厅讲解 Agent。

用户站在屏幕前问:

“你们这个方案适合哪些行业?”

完整链路可以是:

sequenceDiagram
    participant U as 用户
    participant APP as 前端应用
    participant ASR as 第三方ASR
    participant LLM as 第三方LLM
    participant SDK as 魔珐星云具身驱动SDK
    participant Avatar as 3D数字人

    U->>APP: 语音提问
    APP->>ASR: 语音转文本
    ASR-->>APP: 返回文本
    APP->>LLM: 发送问题与上下文
    LLM-->>APP: 流式返回回答
    APP->>SDK: speak文本或SSML
    SDK->>Avatar: 生成语音、口型、表情、动作
    SDK->>APP: 触发字幕/图片/视频等Widget事件
    Avatar-->>U: 数字人讲解
    SDK-->>APP: 返回语音状态、SDK状态、网络状态

这条链路里,每一层都有明确分工:

  • ASR 负责把语音变成文本;
  • LLM 负责理解问题和生成内容;
  • 魔珐星云 SDK 负责把文本变成 3D 多模态表达;
  • Widget 和事件系统负责让屏幕内容同步变化;
  • 状态回调负责让业务侧知道当前是否在说话、是否异常、是否可以进入下一轮交互。

这就是真正的“能力链路打通”。

八、跨端与终端部署:为什么这对 Agent 很重要?

终端 Agent 不是只跑在浏览器 Demo 里。

它可能要跑在 Web 页面、移动端、安卓设备、智能屏、自助机等环境里。

魔珐星云 JS SDK 文档给出了浏览器与 Android SDK 的环境要求,其中 Android 系统要求为 Android 11 及以上,并列出了 RK3588、RK3566 等芯片对应建议清晰度;Android SDK 接入指南也提供了 Android Demo 获取方式、AAR 依赖配置和示例工程运行方式。

这意味着,对终端 Agent 来说,架构设计不能只考虑“模型回答是否聪明”,还要考虑渲染、硬件、屏幕比例、状态管理和部署环境。

官方“从零到一教学”里还专门讲了移动端自适应屏幕:SDK 通过 Canvas 布局机制、偏移和缩放来实现数字人画面的自适应居中与填充,并建议应用层控制容器尺寸,使外层包装容器和 SDK 挂载节点撑满父容器。

这类细节很“工程”,但正是终端 Agent 从 Demo 走向真实屏幕时必须面对的问题。

九、上手实操环节

理论终究是理论,还是需要实践,方能出真知,所以,接下来,我便手把手教学,带着大家从魔珐星云上创建3D数字人,到代码项目中集成,其实呢,平台都已经把底层都搭建好了,我们只需要有一点编程基础,就完全可以把它接到自己的项目中来。一整条链路完整打通,辅助大家真正学以致用。

如下我先演示一个通过具身驱动SDK(JS版本)接入说明操作,大家请看:

9.1 准备工作

1.在页面中引入以下依赖:

<!DOCTYPE html>
<html lang="en">
<body>
  <div style="width: 540px;height: 960px">
    <div id="sdk"></div>
  </div>
  <script src="https://media.xingyun3d.com/xingyun3d/general/litesdk/xmovAvatar@latest.js"></script>
</body>
</html>

具体还以为官方文档为准:请关注JS SDK版本,以助于获取最新SDK特性和最新效果

9.2 设置虚拟人角色、音色、表演风格,获取App ID、App Secret

请登录魔珐星云(xingyun3d.com/),在应用中心创建驱动…

如下,我将手把手演示,我设置数字人的一系列调参配置,仅供参考。

首先是数字人形象设置:

数字人场景设置:

数字人音效设置:

数字人表演风格设置:

如下为具体完整操作演示步骤:

9.3 创建实例

如下是官方所提供的原生JS代码:

const LiteSDK = new XmovAvatar({
  containerId: '#sdk',
  appId: 'your_appid',
	// 您在魔珐星云平台建立的实时驱动应用的appid  
  appSecret: 'your_appsecret',
  // 您在魔珐星云平台建立的实时驱动应用的appsecret 
  gatewayServer: 'https://nebula-agent.xingyun3d.com/user/v1/ttsa/session',
  // 自定义渲染器,传递该方法,所有事件sdk均返回,由该方法定义所以类型事件的实现逻辑
  headers: {
    'Authorization': '888jn',
  },
  //自定义请求头
  hardwareAcceleration: "prefer-hardware", // 开启硬件加速
  // 自定义渲染器,传递该方法,所有事件sdk均返回,由该方法定义所以类型事件的实现逻辑
  onWidgetEvent(data) {
    // 处理widget事件
    console.log('Widget事件:', data)
  },
  // 代理渲染器,sdk默认支持subtitle_on、subtitle_off和widget_pic事件。通过代理,
  // 可以修改默认事件,业务侧也可实现各种其他事件。
  proxyWidget: {
    "widget_slideshow": (data: any) => {
      console.log("widget_slideshow", data);
    },
    "widget_video": (data: any) => {
      console.log("widget_video", data);
    },
  },
  onNetworkInfo(networkInfo) {
    console.log('networkInfo:', networkInfo)
  },
  onMessage(message) {
    console.log('SDK message:', message);
  },
  onStateChange(state: string) {
    console.log('SDK State Change:', state);
  },
  onStatusChange(status) {
    console.log('SDK Status Change:', status);
  },
  onStateRenderChange(state: string, duration: number) {
    console.log('SDK State Change Render:', state, duration);
  },
  onVoiceStateChange(status:string) {
      console.log("sdk voice status", status);
  },
  enableLogger: false, // 不展示sdk log,默认为false
})

如下是实际集成JS代码演示:

如下是具体的参数说明,辅助大家理解:

enum EErrorCode {
  // 容器不存在
  CONTAINER_NOT_FOUND = 10001,
  // socket连接错误
  CONNECT_SOCKET_ERROR = 10002,
  // 会话错误,start_session进入catch(/api/session的接口数据异常,均使用response.error_code)
  START_SESSION_ERROR = 10003,
  // 会话错误,stop_session进入catch
  STOP_SESSION_ERROR = 10004,

  VIDEO_FRAME_EXTRACT_ERROR = 20001, // 视频抽帧错误
  INIT_WORKER_ERROR = 20002, // 初始化视频抽帧WORKER错误
  PROCESS_VIDEO_STREAM_ERROR = 20003, // 抽帧视频流处理错误
  FACE_PROCESSING_ERROR = 20004, // 表情处理错误
  
  BACKGROUND_IMAGE_LOAD_ERROR = 30001, // 背景图片加载错误
  FACE_BIN_LOAD_ERROR = 30002, // 表情数据加载错误
  INVALID_BODY_NAME = 30003, // body数据无Name
  VIDEO_DOWNLOAD_ERROR = 30004, // 视频下载错误

  AUDIO_DECODE_ERROR = 40001, // 音频解码错误
  FACE_DECODE_ERROR = 40002, // 表情解码错误
  VIDEO_DECODE_ERROR = 40003, // 身体视频解码错误
  EVENT_DECODE_ERROR = 40004, // 事件解码错误
  INVALID_DATA_STRUCTURE = 40005, // ttsa返回数据类型错误,非audio、body、face、event等
  TTSA_ERROR = 40006, // ttsa下行发送异常信息

  NETWORK_DOWN = 50001, // 离线模式
  NETWORK_UP = 50002, // 在线模式
  NETWORK_RETRY = 50003, // 网络重试
  NETWORK_BREAK = 50004, // 网络断开
}

interface SDKMessage {
  code: EErrorCode
  message: string
  timestamp: number
  originalError?: string
}

interface SDKNetworkInfo {
  rtt: number // 延迟,毫秒
  downlink: number // 下载速率(MB/s)
}

enum SDKStatus {
  online = 0,
  offline = 1,
  network_on = 2,
  network_off = 3,
  close = 4,
  invisible = 5,
  visible = 6,
  stopped = 7,
}

9.4 初始化连接房间

如下为方式初始化:

具体实际效果如下:

9.5 驱动数字人说话

speak:控制虚拟人说话。

speak(ssml: string, is_start: boolean, is_end: boolean): void

参数说明:

ssml: 可以直接传入需要数字人说的内容,也可以传入SSML格式的标记语言用以指定数字人做出KA动作,详见进阶接入。

以下为非流式调用的示例说明:

speak("欢迎使用魔珐星云", is_start = true, is_end  = true)

9.6 销毁实例

destroy:销毁SDK实例,断开连接。

destroy(): void

如上就通过JS的方式集成进去了,可以做到与你指令会话使用。

9.7 调试

当然,这里也还有其他多种使用方式,比如:JS SDK Demo接入、Android SDK等。相关说明文档参考如下:xingyun3d.com/developers/…

如下是真正接入之后的数字人实际效果:

真正在按我们所设置的角色模型、声效,指令及相关动作在口播我们发出的指令,是不是非常的nice~

我们还能设置它的状态,如思考、待机、倾听等。

最后,我们还得留意调用积分消耗记录哟,以免过度消耗啦~

OK,如上便是完整的实操教学演示,若有任何不清楚的地方,请欢迎评论区提问~

十、结语:终端 Agent 的下一步,是从“大脑”走向“身体”

如果说 LLM 让 Agent 有了“大脑”,那么具身驱动让 Agent 有了“身体”。但这里的“身体”不是一个装饰性的数字人形象,而是一套完整的表达与交互系统:

  • 能说话;
  • 能同步口型;
  • 能做动作;
  • 能切换状态;
  • 能展示字幕、图片、视频;
  • 能反馈网络、语音和 SDK 状态;
  • 能通过事件机制与业务系统连接。

这也是为什么,真正的终端 Agent 开发,不是堆几个功能,而是打通能力链路。

魔珐星云展示出的核心价值,正在于它把 AI 从单纯文本输出推进到 3D 多模态表达,并提供了 SDK、状态、事件、Widget、KA 动作、视频生成和语音合成等一组可接入的能力。

所以,我用一句话总结:

终端 Agent 的架构升级,不是让 AI 多一个数字人外壳,而是让 AI 具备一条从理解、表达、呈现到反馈的完整具身智能链路。

这才是“具身智能体”真正值得讨论的地方。

官方地址:xingyun3d.com?utm_campaign=daily&utm_source=jixinghuiKoc49