原生 JS 驱动魔珐星云具身智能:开发高拟真零售导购大屏

本文分享如何利用原生 JS 集成魔珐星云 SDK,通过 proxyWidget 机制拦截大模型下发的图片指令,实现「左侧数字人+右侧商品图」的多模态分栏联动,打造高拟真电商导购终端。

原生 JSproxyWidget智慧零售
Undoom头像Undoom

项目背景:零售终端大屏"多模态联动"的业务诉求

在智慧零售(如女装供应链展厅、线下商超)场景中,一个合格的 AI 导购不仅需要具备流畅的语音解答能力,更需要极强的“多模态展演”能力。传统的智能屏幕通常只能全屏显示数字人,当提及某款具体商品时,无法直观地展示商品细节或参数。

为了实现真正的业务闭环,我们需要构建一种**“双栏分屏”**的交互 UI:左侧为具身数字人负责实时互动讲解,右侧为业务组件区,能够根据大模型的语义决策,实时同步弹出对应的商品详情图或促销海报。

核心突破:利用 proxyWidget 接管多模态业务渲染

魔珐星云不仅提供了底层的 3D 渲染引擎,还提供了一套连接业务系统的数据拦截协议——proxyWidget 代理机制。

在默认情况下,当云端大脑(大模型)下发一张图片或视频时,SDK 会使用内置的默认弹窗进行渲染。通过 proxyWidget,开发者可以在前端主动拦截 widget_slideshow(PPT/组图推送)、widget_pic(图片推送)等事件,阻止 SDK 默认行为,转而将获取到的图片 URL 渲染到开发者自定义的右侧商品面板中。这实现了 3D 表达层与 2D 业务数据层的完美解耦。

交互流转优化:首帧唤醒与"排队式打断"算法

在构建导购大屏的 JS 执行流时,有两个极易被忽视的工程体验痛点需要解决:

1. 浏览器自动播放限制(黑屏问题):在 Web 环境下,若无用户物理点击交互,3D 资产加载完成后可能卡在首帧之前。我们通过在资源加载达 100% 后立刻下发一个无声指令 avatar.speak(" "),强制打破浏览器限制,唤醒首帧画面。 2. 高频打断冲突:当导购正在长篇大论介绍商品时,顾客若插话提问,系统必须立刻中断当前播报。我们需要维护一个 isSpeaking 状态标识,在发送新指令前先调用 avatar.interactiveidle() 强行挂起当前动作,并预留 150ms 左右的缓冲期,确保底层的动画状态机平滑归位后再执行下一次 speak。

原生 JS 实战源码:女装导购双屏联动 Demo

以下为一个开箱即用的原生 HTML/JS 单页面应用实战源码。该 Demo 演示了如何初始化引擎、拦截后台商品推送指令,并实现带有状态校验的智能打断。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>魔珐星云 | 具身智能零售终端</title>
<script src="https://media.xingyun3d.com/xingyun3d/general/litesdk/xmovAvatar@latest.js"></script>
    <style>
        /* 核心分栏布局 */
        .retail-workspace { display: flex; gap: 20px; width: 100%; max-width: 1000px; height: 500px; }
        .stage-panel { flex: 2; background: #000; border-radius: 12px; position: relative; }
        .product-panel { flex: 1; border: 2px dashed #e2e8f0; border-radius: 12px; padding: 20px; text-align: center; }
        #sdk { width: 100%; height: 100%; }
        .product-img { max-width: 100%; display: none; margin-top: 20px; border-radius: 8px; }
    </style>
</head>
<body>
    <div class="retail-workspace">
        <!-- 左侧:数字人具身舞台 -->
        <div class="stage-panel">
            <div id="sdk"></div>
        </div>
        <!-- 右侧:多模态商品展示区 -->
        <div class="product-panel">
            <div id="empty-state">等待系统推送商品详情...</div>
            <img src="" id="product-img" class="product-img" alt="商品图">
        </div>
    </div>

    <div style="margin-top: 20px;">
        <button onclick="startSystem()">1. 激活智能导购</button>
        <button onclick="mockAgentPushProduct()">2. 模拟大模型推送商品图</button>
        <button onclick="handleCustomerAsk()">3. 模拟顾客打断提问</button>
    </div>

    <script>
        let avatar = null;
        let isSpeaking = false; // 全局播报状态标识

        async function startSystem() {
            // 1. 初始化数字人核心架构
            avatar = new XmovAvatar({
                containerId: '#sdk',
                appId: '您的APP_ID',
                appSecret: '您的APP_SECRET',
                gatewayServer: 'https://nebula-agent.xingyun3d.com/user/v1/ttsa/session',
                hardwareAcceleration: 'prefer-hardware', 
                
                // 监听发声状态,用于精准控制打断逻辑
                onVoiceStateChange: (status) => {
                    isSpeaking = (status === 'start');
                },

                // 2. 核心联动:接管业务渲染组件
                proxyWidget: {
                    "widget_slideshow": (data) => {
                        console.log("拦截到云端大模型下发的图片指令:", data);
                        // 隐藏空状态,渲染真实商品图至右侧 DOM
                        document.getElementById('empty-state').style.display = 'none';
                        const img = document.getElementById('product-img');
                        img.src = data.url;
                        img.style.display = 'block';
                    }
                }
            });

            // 加载 3D 资产
            await avatar.init();
            
            // 强制解除浏览器自动播放限制,唤醒首帧画面
            avatar.speak(" ", true, true); 
        }

        // 测试函数:模拟云端大模型在特定逻辑下下发图片指令
        function mockAgentPushProduct() {
            if(!avatar) return;
            // 驱动数字人进行商品话术播报
            avatar.speak("这款是我们春季主推款,特别适合门店走量,您可以看下右侧的面料细节图。", true, true);
            
            // 模拟大模型触发 widget_slideshow 事件,联动右侧业务屏幕
            setTimeout(() => {
                const mockData = { url: "https://images.unsplash.com/photo-1515886657613-9f3515b0c78f?auto=format&fit=crop&w=400&q=80" };
                const img = document.getElementById('product-img');
                img.src = mockData.url;
                img.style.display = 'block';
                document.getElementById('empty-state').style.display = 'none';
            }, 1000);
        }

        // 测试函数:智能打断算法
        async function handleCustomerAsk() {
            if (!avatar) return;
            
            // 若导购正在说话,必须先将其挂起至待机状态
            if (isSpeaking) {
                avatar.interactiveidle(); 
                await new Promise(r => setTimeout(r, 150)); // 预留底层状态流转缓冲期
            }

            // 响应顾客的新问题
            avatar.speak("好的,这款起批量是50件,今天下单即可发货。", true, true);
        }

        // 页面卸载时安全释放资源,防止云端并发并发数被持续占用
        window.addEventListener('beforeunload', () => { if (avatar) avatar.destroy(); });
    </script>
</body>
</html>

结语

在智慧零售场景中,具备强交互属性的具身大屏正逐步替代传统的静态宣导屏幕。通过原生 JS 与魔珐星云 proxyWidget 的结合,开发者仅需数十行代码,即可实现 3D 数字人行为与外部业务面板的帧级协同。这种对底层渲染能力与上层业务逻辑的精妙解耦,大幅降低了多模态展演终端的开发复杂度,为实体商业的智能化升级提供了极具参考价值的工程范式。

相关推荐

魔珐星云,不止是数字人,让 AI 从会思考,走向能表达、会交流。