数字人到底缺了什么?从「低交互」到「实时交互」,我用 SDK 重构终端 AI 交互认知

一个让我重新思考数字人的经历

前段时间公司要做一个展厅项目,需要在入口大屏上放一个数字人讲解员。我调研了一圈市面上的方案,发现一个普遍现象:这些数字人「看起来像人」,但「用起来不像人」。

具体来说有这么几个问题:

- 延迟高:用户问一个问题,等三四秒数字人才开口,体验非常割裂

- 不能打断:数字人开始播报后就像放录播,用户想追问或换话题,只能等它说完

- 表情动作僵硬:嘴在动,但眼神空洞、手势机械,看久了就觉得是个「皮套」

我跟同事开玩笑说,这些数字人就像商场门口的迎宾机器人——长得像人,但你走过去跟它说话,它只会循环播放「欢迎光临」。

这让我开始思考一个根本问题:如何实现数字人能够实时交互?

认知重构:从「数字人」到「具身交互智能体」

在搜方案的过程中,我接触到了魔珐星云。说实话一开始我也以为又是一个数字人工具,但看完技术文档后,我的认知被刷新了。

魔珐星云的定位不是「数字人工具」,也不是「Agent 套壳框架」,而是具身交互智能开放平台。它解决的核心问题是:

大模型让 AI 具备了理解、推理和生成能力,但如果 AI 要进入真实场景,仅靠聊天框是不够的。AI 还需要可被看见的身体、可被感知的状态、可自然表达的语音表情动作、可实时响应的交互能力。

我的理解是,传统数字人和具身交互智能体之间是两种完全不同的技术范式:

- 传统方案:云端完整画面渲染推流,带宽占用高、交互滞后、无法实时打断、大规模并发成本高昂;

- 魔珐星云自研参数流底层(具身交互智能标志性核心技术):云端仅下发轻量化表情 / 骨骼参数,终端本地 AI 解算渲染,端到端最低 500ms 响应,原生支持中途插话、千路低成本并发。

一句话总结这个认知差异:大模型解决 AI 的「大脑」,魔珐星云补齐 AI 的「身体、表达和交互」。

技术层面,魔珐星云把端到端全链路封装为 SDK 一站式接入:多模态感知层(听见·看见·理解)× 大模型智能体层(理解·决策·调度)× 表达引擎层(3D 大模型·端侧渲染·百元芯片可跑·千路并发)。

光说概念不够直观,我决定动手搭一个 Demo,用实际体验来验证:参数流方案到底能不能解决传统数字人的那些痛点。

技术架构与工具选型

整体链路:

用户语音  → 文本 → Qwen LLM → 流式文本 → 魔珐星云具身交互智能 SDK(参数流驱动) → 3D数字人实时表达

选型决策如下:

模块 选型 理由
AI Coding 工具 Trae(字节跳动) 免费的 AI IDE,对话式编程 + 代码补全,适合前端项目
大模型 Qwen Plus(通义千问) 展厅讲解需要知识面广,Qwen 中文表现稳定,OpenAI 兼容接口
数字人驱动 魔珐星云具身驱动 SDK(JS 版) 参数流技术,端到端约 500ms
前端框架 原生 HTML + JS 零依赖,方便读者直接复制上手

这次我选了 Trae 作为 AI Coding 工具。Trae 是字节出的 AI IDE,免费且代码补全效果不错,跟 Cursor 用法类似。展厅讲解场景选 Qwen 是因为需要覆盖科技、文化、产品等多领域知识,Qwen Plus 的中文理解和流式输出都比较稳。

实操:搭建一个能实时交互的展厅讲解数字人

Step 1:在魔珐星云平台创建驱动应用

登录魔珐星云官网,注册开发者账号,进入控制台 → 应用管理 → 创建驱动应用。

按流程选择数字人形象、场景、音色和表演风格。展厅讲解场景我选了一个职业男性形象,音色选了沉稳大气的风格。平台内置了 5000+ 角色形象,也支持上传照片定制。

在这里插入图片描述
在这里插入图片描述

创建完成后在应用详情页点击「App 密钥」,拿到 App IDApp Secret

Step 2:让数字人渲染出来——第一次看到参数流的效果

打开 Trae,新建 HTML 文件。第一步先把数字人渲染出来,跑通 SDK 基础链路。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>展厅讲解具身智能体</title>
  <style>
    /* 容器比例需与控制台应用类型一致(横屏 16:9) */
    #avatar-container {
      width: 800px;
      height: 450px;
      position: relative;
      background: linear-gradient(135deg, #0a0e27 0%, #1a1f3a 50%, #0d1b2a 100%);
      border-radius: 12px;
      overflow: hidden;
    }
    #sdk {
      width: 100%;
      height: 100%;
    }
  </style>
</head>
<body>
  <div id="avatar-container">
    <div id="sdk"></div>
  </div>

  <!-- 引入魔珐星云具身驱动 SDK -->
  <script src="https://media.xingyun3d.com/xingyun3d/general/litesdk/xmovAvatar@latest.js"></script>

  <script>
    const sdk = new XmovAvatar({
      containerId: '#sdk',
      appId: 'your_appid',           // 替换为你的 App ID
      appSecret: 'your_appsecret',    // 替换为你的 App Secret
      gatewayServer: 'https://nebula-agent.xingyun3d.com/user/v1/ttsa/session',
      hardwareAcceleration: 'prefer-hardware', // 开启硬件加速
      onMessage: (message) => {
        console.log('SDK message:', message);
      },
    });

    // 初始化连接
    sdk.init({
      onDownloadProgress: (progress) => {
        console.log('资源加载:', progress + '%');
      },
    });

    // 页面关闭前主动销毁,避免触发房间并发限制
    window.addEventListener('beforeunload', () => {
      if (sdk) sdk.destroy();
    });
  </script>
</body>
</html>

注意一个坑:SDK 只支持 localhosthttps 访问,直接用 IP 地址打开会报 VideoDecoder is not defined。本地调试用 localhost 就行。

浏览器打开页面后,我注意到一个细节:数字人加载完成后并不是「跳出来」的,而是从 idle 状态自然过渡的——有微小的呼吸动作、眼神会缓缓移动。这个自然感跟传统数字人「贴图动嘴」的感觉完全不同。
在这里插入图片描述

踩坑提醒:开发时频繁刷新页面容易触发 10005 错误(房间并发限流)。原因是页面刷新后服务端旧连接还没释放,新连接被拒。等 1-2 分钟自动恢复,或者在 beforeunload 里主动调 sdk.destroy() 释放连接。

Step 3:接入 Qwen,让讲解员「有知识」

在 Trae 里新建 llm.js,用 Qwen 的 OpenAI 兼容接口做流式对话:

// llm.js - Qwen 大模型对接模块
const LLM_API = 'https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions';
const LLM_KEY = 'your_dashscope_api_key'; // 替换为你的 DashScope API Key

// 展厅讲解 System Prompt
const SYSTEM_PROMPT = `你是科技展厅的讲解员"小科",负责介绍展厅内的各项技术展品。
回答要求:
1. 语言专业但不生硬,像跟参观者面对面交流
2. 每个展品介绍控制在3-4句话,先讲是什么,再讲解决了什么问题
3. 能根据参观者的兴趣点展开,不要背稿子
4. 回答简洁,保持对话节奏`;

export async function streamChat(userMessage, onChunk) {
  const response = await fetch(LLM_API, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${LLM_KEY}`,
    },
    body: JSON.stringify({
      model: 'qwen-plus',
      messages: [
        { role: 'system', content: SYSTEM_PROMPT },
        { role: 'user', content: userMessage },
      ],
      stream: true,
    }),
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();
  let buffer = '';

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    buffer += decoder.decode(value, { stream: true });
    const lines = buffer.split('\n');
    buffer = lines.pop() || '';

    for (const line of lines) {
      if (!line.startsWith('data: ') || line === 'data: [DONE]') continue;
      try {
        const json = JSON.parse(line.slice(6));
        const content = json.choices?.[0]?.delta?.content;
        if (content) onChunk(content);
      } catch (e) { /* 忽略解析异常 */ }
    }
  }
}

Step 4:流式驱动——验证「能不能交互」的关键

这一步是我最关注的:参数流方案到底能不能做到实时交互?

星云 SDK 的 speak() 方法支持流式调用,通过 is_startis_end 标记控制:

  • 第一段:is_start=true, is_end=false

  • 中间段:is_start=false, is_end=false

  • 最后一段:is_start=false, is_end=true

// speech-manager.js - 语音状态管理 + 流式对话主流程
const avatarManager = {
  _pendingText: null,

  // 关键能力:打断当前播报,排队新内容
  // 这正是传统数字人做不到的
  interruptAndSpeak(text) {
    this._pendingText = text;
    sdk.interactiveidle(); // 打断当前播报状态
  },

  // 监听数字人语音状态,上一句结束后再播下一句
  handleVoiceState(res) {
    const state = (typeof res === 'string') ? res : (res.state || res.data);
    if ((state === 'end' || state === 'idle') && this._pendingText) {
      const nextText = this._pendingText;
      this._pendingText = null;
      sdk.speak(nextText, true, true);
    }
  }
};

// 流式对话:Qwen 输出 → 星云 SDK 参数流驱动
async function chatAndSpeak(userMessage) {
  let accumulated = '';
  let chunkCount = 0;
  const CHUNK_THRESHOLD = 8;

  await streamChat(userMessage, (chunk) => {
    accumulated += chunk;
    chunkCount++;

    if (chunkCount >= CHUNK_THRESHOLD) {
      const isStart = (accumulated === chunk);
      sdk.speak(accumulated, isStart, false);
      accumulated = '';
      chunkCount = 0;
    }
  });

  if (accumulated) {
    sdk.speak(accumulated, false, true);
  }
}

实测打断效果:数字人正在讲解展品时,我突然问了句「这个多少钱」,`interruptAndSpeak` 触发 `interactiveidle()`,数字人立刻停住、切换到倾听状态,然后回答新问题。这个体验跟之前用过的视频流数字人完全不同——那个得等它把整段话说完才能回应你。

Step 5:SSML 让讲解员「有动作」

展厅讲解不能光动嘴,得有配合手势。星云 SDK 支持 SSML 标记语言,可以同步触发语义化动作:

// 展品介绍开场,配合指引手势
const introSSML = `
<speak>
  <ue4event>
    <type>ka</type>
    <data><action_semantic>Guide</action_semantic></data>
  </ue4event>
  这边是我们展厅的核心展品——基于多模态感知的智能交互终端,我来为您详细介绍一下。
</speak>`;

sdk.speak(introSSML, true, true);

通过 KA 指令,数字人说话时能同步做出手摆动、摇晃身体、点赞等语义化动作。
在这里插入图片描述

Step 6:自定义字幕和 Widget 组件

proxyWidget 自定义字幕显示,同时利用 Widget 组件展示展品图片:

const sdk = new XmovAvatar({
  containerId: '#sdk',
  appId: 'your_appid',
  appSecret: 'your_appsecret',
  gatewayServer: 'https://nebula-agent.xingyun3d.com/user/v1/ttsa/session',

  proxyWidget: {
    // 自定义字幕
    "subtitle_on": (data) => {
      const el = document.getElementById('custom-subtitle');
      if (el && data.text) {
        el.textContent = data.text;
        el.classList.add('show');
      }
    },
    "subtitle_off": () => {
      const el = document.getElementById('custom-subtitle');
      if (el) el.classList.remove('show');
    },
    // 拦截图片指令,展示展品配图
    "widget_pic": (data) => {
      const img = document.getElementById('exhibit-image');
      if (img && data.image) {
        img.src = data.image;
        img.classList.add('show');
      }
    },
  },

  onVoiceStateChange: (res) => avatarManager.handleVoiceState(res),
});

字幕样式加了圆角半透明背景和淡入动画:

#custom-subtitle {
  position: absolute;
  bottom: 40px;
  left: 50%;
  transform: translateX(-50%);
  background: rgba(0, 0, 0, 0.65);
  color: #fff;
  padding: 10px 24px;
  border-radius: 20px;
  font-size: 16px;
  max-width: 70%;
  opacity: 0;
  transition: opacity 0.3s ease;
  pointer-events: none;
}
#custom-subtitle.show { opacity: 1; }

在这里插入图片描述
在这里插入图片描述

实测之后,我对数字人的认知彻底变了

跑通 Demo 后,我逐条对照之前调研传统数字人时发现的问题,看看参数流方案交了什么答卷。

关于延迟。 之前调研的视频流方案延迟 3-5 秒,根本没法实时对话。魔珐星云参数流下发的数据量极小,通过 AI 端渲和端侧解算在端侧完成渲染,端到端约 500ms 就能响应。从用户开口到数字人开始回答,整体延迟约 500ms (含 ASR + Qwen + SDK 驱动),日常对话基本无感知。这不是「快了一点」的差距,而是「能交互」和「不能交互」的质变。

关于打断。 传统数字人开始播报后就像放录播,用户只能被动听。星云 SDK 的 interactiveidle() 支持随时打断,数字人能立刻停下来切换到倾听状态。这个能力让我第一次觉得「数字人像个人」——真人对话也是这样的,你会随时根据对方的反应调整。

关于成本和并发。 百元级硬件芯片就能跑端侧渲染,千路并发不受限。这意味着展厅、门店、政务大厅这些多终端场景可以规模化部署,不用每块屏配一台高配 GPU。对甲方来说这是硬指标——技术再好,成本降不下来也落地不了。

关于终端覆盖。 星云的 SDK 同步适配屏幕、人形机器人、AR/VR 眼镜等终端形态。我做的这个展厅讲解 Demo,今天跑在大屏上,明天可以迁移到导览机器人上,后天可以放进 AR 眼镜里。对开发者来说,写一次代码适配多终端,这个投入产出比很划算。

关于开发效率。 这个项目我用 Trae 写代码,从零到跑通大概半天。Trae 对 SDK 接入这种有固定模式的代码补全效果不错,基本写个注释它就帮你生成框架。Qwen Plus 在展厅讲解场景的表现也超出预期,多领域知识覆盖到位,回答口语化不生硬。

写在最后

市面传统静态虚拟载体的核心短板不在于画面精致度,而是缺失完整具身交互智能底层能力。魔珐星云依托自研参数流、AI 端侧解算、LAM 文生动作整套交互底座,打破视频流技术桎梏,把单向画面展示升级为真人式双向实时沟通。

行业发展清晰路径:大模型补齐 AI 思考能力,魔珐星云补齐完整具身交互智能,让 AI 跳出文本对话框,以可视化交互智能体落地大屏、机器人、AR 全类终端,实现面对面自然沟通。

大模型让 AI 学会了思考,下一步是让 AI 进入终端,以具身的方式与人交互。

魔珐星云 PC 端体验

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐