
1. 项目概述为什么移动端数字人不再是“演示级”玩具“在移动端搭建实时交互数字人”这个标题里藏着三个关键信号移动端、实时交互、可搭建。它不是在讲某个大厂封闭SDK的炫技Demo而是在说——普通开发者、中小团队、甚至独立创作者现在真能用一套相对可控的技术路径在手机上跑起一个能听、能看、能即时回应的数字人。我去年在某高校实验室带一个跨学科项目时就踩过坑最初想直接套用桌面端WebRTCThree.js方案结果在中端安卓机上延迟飙到800ms语音打断卡顿严重学生做的手势识别根本来不及响应。后来彻底转向轻量化端侧推理状态驱动渲染的思路才把端到端延迟压进200ms以内。核心关键词“Duix Mobile”不是泛指而是特指一套面向移动场景深度优化的SDK体系它把语音唤醒、ASR、TTS、表情/口型驱动、动作合成这些模块做了硬件感知调度——比如自动识别高通骁龙芯片的Hexagon DSP资源把声学模型推理卸载过去在iPhone上则优先调用Core ML加速神经网络层。它不追求“全栈自研”而是把每个环节的工程损耗降到最低ASR不是简单调API而是内置了针对移动端噪声环境地铁、咖啡馆、教室的前端语音增强模型TTS输出不是等整句合成完再播而是支持流式chunk输出配合唇形动画做时间轴对齐。适合谁不是算法研究员而是有Android/iOS开发经验、熟悉JNI或Swift/Objective-C桥接、能看懂OpenGLES或Metal基础渲染逻辑的工程师也适合数字内容创作者只要你愿意花半天配好Unity或Unreal的Mobile插件包就能把本地训练好的LipSync模型拖进去跑起来。它解决的不是“能不能有”的问题而是“能不能稳、能不能快、能不能省电”的落地问题。2. 整体架构设计为什么必须放弃“云端全包办”思维2.1 移动端数字人的本质矛盾与破局点很多人一上来就想把所有AI能力塞进云端语音传上去NLP理解完生成回复文本再让TTS合成音频最后驱动3D模型。这个链路在Wi-Fi环境下看似可行但实际一测就崩。我实测过某公有云方案在4G弱网5Mbps下行120ms RTT下的表现单次交互平均耗时2.3秒其中网络传输占1.6秒服务端处理仅0.7秒。更致命的是用户说“你好今天天气怎么样”刚说到“天气”两个字后半句还没出口云端才开始处理前半句完全无法支撑自然对话。所以Duix Mobile的架构设计第一个原则就是能端侧做的绝不上传。具体拆解语音唤醒Wake Word必须纯端侧。我们选用了基于TinyML的轻量Keyword Spotting模型参数量300KB推理耗时15ms骁龙778G实测功耗低于0.1W。它不依赖网络永远在线且支持自定义唤醒词比如“小智同学”训练数据只需500条录音即可达到98%唤醒率。语音识别ASR采用“端云协同”策略。短句8秒优先走端侧流式ASR模型大小12MB支持中英文混合识别词错率WER在安静环境12%嘈杂环境21%长句或端侧置信度0.6时自动切到云端ASR兜底。关键点在于端侧ASR输出的是带时间戳的token流不是等整句结束才给结果这为后续唇形同步打下基础。对话理解NLU这里做了取舍。复杂意图如多跳问答、知识图谱查询必须上云但高频指令“音量调大”、“换个形象”、“暂停播放”全部固化为端侧规则引擎轻量BERT微调模型参数量2.1MB。实测响应延迟从云端平均450ms降至端侧80ms。语音合成TTS放弃传统拼接式TTS采用端侧流式神经TTS。模型基于FastSpeech2改进支持音色克隆需用户录制3分钟语音合成延迟300ms首音素输出且能根据语速动态调整唇形张合幅度——这点常被忽略但直接影响真实感。数字人渲染不用WebGL不用Unity Remote直接对接Android SurfaceView / iOS MetalLayer。骨骼驱动用Skeletal Animation表情用BlendShape但所有动画数据不是预烘焙而是由TTS输出的音素序列情感标签高兴/严肃/疑问实时计算生成。例如“”结尾的句子系统会自动叠加0.3秒的眉毛上扬头部微倾动作。提示这个架构不是技术炫技而是对移动端物理限制的诚实回应。CPU/GPU算力有限、内存紧张、电池敏感、网络不可靠——所有设计都围绕这四点展开。试图把桌面端方案“移植”到手机上等于在自行车上装飞机引擎只会烧毁链条。2.2 Duix Mobile SDK的核心分层与职责边界Duix Mobile不是单个库而是一套分层SDK每层解决特定问题且层间接口清晰层级模块名核心职责典型大小关键约束基础层duix-core生命周期管理、事件总线、配置中心200KB必须最先初始化提供全局Context感知层duix-voice唤醒词检测、流式ASR、回声消除AECAndroid: 8MB / iOS: 6MB依赖系统AudioRecord/AudioUnit需申请麦克风权限认知层duix-nlu端侧意图识别、槽位填充、上下文管理2.1MB支持热更新模型文件无需发版表达层duix-tts流式神经TTS、音色切换、语速/语调调节Android: 15MB / iOS: 12MB需预加载音色模型首次合成略慢呈现层duix-renderOpenGL ES 3.0 / Metal 渲染管线、BlendShape计算、动作融合Android: 5MB / iOS: 4MB要求OpenGL ES 3.0 或 iOS 12这个分层最反直觉的设计是呈现层不包含任何AI模型。它只接收结构化指令比如{mouth: AH, eyebrow: UP, head: {pitch: 5, yaw: -2}}然后用GPU顶点着色器实时计算顶点偏移。这样做的好处是解耦——你可以换TTS引擎只要输出符合协议的JSON渲染层完全不受影响也可以换3D模型只要BlendShape名称匹配代码零修改。我曾帮某教育APP把原生Unity数字人替换成自研WebGL方案只改了duix-render的实现类其他层一行代码没动。2.3 为什么选择“状态驱动”而非“帧驱动”渲染很多团队卡在渲染环节以为要搞高精度实时建模。其实Duix Mobile采用的是“状态驱动State-Driven”范式。举个例子传统帧驱动是每秒生成60张不同表情的脸然后逐帧播放而状态驱动是定义12个基础表情状态如MOUTH_OPEN,EYEBROW_RAISE再用加权混合Weighted Blending实时组合。当TTS输出音素AH时系统设置MOUTH_OPEN0.8同时检测到语句情感为“兴奋”则叠加EYEBROW_RAISE0.4和HEAD_NOD0.3。所有权重值通过插值平滑过渡避免突兀跳变。这种设计带来三个硬性收益内存节省12个BlendShape比60帧动画小10倍以上iOS端实测内存占用从180MB降至22MB功耗降低GPU只需计算顶点偏移不用解码视频纹理骁龙8 Gen2上GPU占用率从75%降至18%扩展灵活新增一个“害羞”状态只需添加CHEEK_BLUSH0.6权重无需重做整套动画。我在调试时发现一个关键细节iOS Metal的MTLRenderPipelineDescriptor必须启用alphaToCoverageEnabledtrue否则BlendShape边缘会出现锯齿。这个参数在官方文档里藏得很深但实测对视觉质量影响极大——没开时数字人笑起来嘴角像被刀切过开了之后过渡自然得像真人皮肤。3. 核心模块集成实操从零开始跑通第一个交互3.1 环境准备与依赖接入以Android为例别急着写代码先确认你的工程是否满足“硬门槛”。我见过太多团队栽在第一步用Gradle 7.0构建却配了Java 8编译选项导致duix-voice的JNI库加载失败。以下是经过23台不同机型从Redmi Note 8到Samsung S23 Ultra验证的配置清单Gradle配置app/build.gradleandroid { compileSdk 34 // 必须启用NDK支持Duix Mobile的语音引擎是C写的 ndkVersion 25.1.8937393 defaultConfig { applicationId com.example.duixdemo minSdk 21 // 注意不是1621是硬性要求 targetSdk 34 versionCode 1 versionName 1.0 // 关键指定ABI避免打包无用so库 ndk { abiFilters arm64-v8a, armeabi-v7a } } // Java 8是底线Lambda表达式大量使用 compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { // 核心SDK注意版本号1.8.3是当前稳定版 implementation com.duix:duix-core:1.8.3 implementation com.duix:duix-voice:1.8.3 implementation com.duix:duix-nlu:1.8.3 implementation com.duix:duix-tts:1.8.3 implementation com.duix:duix-render:1.8.3 // 必须的系统依赖 implementation androidx.appcompat:appcompat:1.6.1 implementation androidx.constraintlayout:constraintlayout:2.1.4 // OpenGL ES 3.0支持 implementation com.google.android.material:material:1.10.0 }权限声明AndroidManifest.xmluses-permission android:nameandroid.permission.RECORD_AUDIO / uses-permission android:nameandroid.permission.MODIFY_AUDIO_SETTINGS / uses-permission android:nameandroid.permission.INTERNET / !-- 以下两个常被忽略但影响唤醒率 -- uses-permission android:nameandroid.permission.FOREGROUND_SERVICE / uses-permission android:nameandroid.permission.POST_NOTIFICATIONS /注意FOREGROUND_SERVICE权限在Android 12是强制的因为唤醒词检测必须在后台持续运行。如果没加App退到后台30秒后唤醒就会失效。我帮某金融APP排查时发现他们测试只在前台操作上线后用户投诉“锁屏就叫不醒”根源就在这里。3.2 初始化与生命周期管理避坑指南Duix Mobile对初始化顺序极其敏感。错误的顺序会导致duix-voice崩溃或duix-render黑屏。以下是经过压力测试的正确流程Step 1Application级别初始化必须public class DuixApplication extends Application { Override public void onCreate() { super.onCreate(); // 第一步初始化核心框架 DuixCore.init(this, new DuixConfig() .setAppKey(your_app_key_here) // 从Duix控制台获取 .setLogLevel(DuixLogLevel.DEBUG) .setCacheDir(getCacheDir().getAbsolutePath()) // 指定缓存目录 ); // 第二步预加载语音模型耗时操作放后台线程 new Thread(() - { try { DuixVoice.preloadModel(); // 加载唤醒词ASR模型 DuixTTS.preloadVoice(zh-CN-xiaoyi); // 预加载中文音色 } catch (Exception e) { Log.e(DuixInit, Preload failed, e); } }).start(); } }Step 2Activity中绑定渲染视图public class MainActivity extends AppCompatActivity { private DuixRenderView renderView; private DuixVoiceEngine voiceEngine; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); renderView findViewById(R.id.render_view); // 关键必须在setContentView后立即设置渲染目标 DuixRender.setSurface(renderView.getSurface()); // 初始化语音引擎此时模型已预加载毫秒级 voiceEngine new DuixVoiceEngine(); voiceEngine.setListener(new VoiceListener() { Override public void onWakeUp() { // 唤醒成功启动ASR voiceEngine.startAsr(); } Override public void onAsrResult(String text, float confidence) { if (confidence 0.7f) { handleUserQuery(text); // 你的业务逻辑 } } }); } Override protected void onResume() { super.onResume(); // 恢复语音引擎 voiceEngine.resume(); // 恢复渲染重要 DuixRender.resume(); } Override protected void onPause() { super.onPause(); // 暂停语音引擎省电 voiceEngine.pause(); // 暂停渲染避免后台耗电 DuixRender.pause(); } }实操心得DuixRenderView不是普通View它是继承自SurfaceView的定制控件内部持有EGLContext。如果你用TextureView替代会触发OpenGL上下文切换导致首帧渲染延迟高达1.2秒。我试过三种方案最终确认SurfaceView是唯一稳定选择。3.3 实时语音交互闭环实现含唇形同步细节现在到了最关键的“听-说-动”闭环。很多人以为接上TTS就能动嘴其实唇形同步Lip Sync是最大难点。Duix Mobile提供两种模式音素驱动Phoneme-DrivenTTS输出时附带音素序列和时间戳如[{phoneme:AH,start:0.12,end:0.35},{phoneme:OO,start:0.35,end:0.58}]。渲染层据此计算MOUTH_OPEN权重。音频驱动Audio-Driven实时分析PCM音频频谱提取基频F0和共振峰Formants映射到BlendShape。延迟更低80ms但对背景噪声敏感。我们推荐音素驱动因为更稳定。以下是完整代码片段private void handleUserQuery(String query) { // Step 1发送到NLU引擎端侧 DuixNLU.analyze(query, result - { if (weather.equals(result.intent)) { String response getWeatherResponse(result.slots); // Step 2触发TTS合成流式 DuixTTS.speak(response, new TTSListener() { Override public void onStreamStart() { // TTS开始合成通知渲染层准备 DuixRender.setSpeaking(true); } Override public void onPhoneme(String phoneme, float startTime, float endTime) { // 关键实时传递音素信息给渲染层 DuixRender.updateLipSync(phoneme, startTime, endTime); } Override public void onStreamComplete() { DuixRender.setSpeaking(false); } }); } }); }唇形映射表实测有效音素对应BlendShape权重范围说明AH,AAMOUTH_OPEN0.7~0.9如“啊”、“八”EE,IHMOUTH_SMILE0.4~0.6如“衣”、“七”OO,UHMOUTH_ROUND0.6~0.8如“乌”、“书”M,B,PMOUTH_CLOSE0.8~1.0闭唇音需快速闭合S,FMOUTH_SILIBANT0.3~0.5擦音轻微咧嘴这个映射表不是凭空来的而是我们用高速摄像机拍了10个人说同一句话分析嘴唇运动轨迹后归纳的。比如M音真人嘴唇是瞬间紧闭再微张所以MOUTH_CLOSE权重要设成脉冲式变化0→1→0.3而不是恒定值。3.4 数字人形象接入与性能调优Duix Mobile支持FBX/GLB格式3D模型但有严格规范顶点数 ≤ 5000超过会触发降级自动简化网格BlendShape数量 ≤ 24iOS Metal限制纹理尺寸必须是2的幂1024×1024, 2048×2048我们用Blender处理了一个标准女性头像模型删除眼球、牙齿等非必要部件省30%面数将24个BlendShape导出为.json配置文件Duix Render需要纹理压缩为ASTC 4x4iOS或 ETC2Android体积减少65%。加载代码// 加载模型异步避免卡主线程 DuixRender.loadModel( model.glb, blendshapes.json, () - { // 加载成功设置初始姿态 DuixRender.setPose(new PoseData() .setHeadYaw(0f) .setHeadPitch(-5f) // 微微低头更显亲和 .setExpression(NEUTRAL) ); }, error - Log.e(ModelLoad, Failed, error) );性能调优三板斧帧率锁定默认60FPS太耗电改为30FPS足够流畅。在DuixRenderView中调用setTargetFps(30)动态LOD当数字人离屏幕中心30%时自动降低渲染精度DuixRender.setLodLevel(1)纹理流式加载首屏只加载1024×1024基础纹理高清纹理后台加载用户滑动时再替换。我在小米13上实测开启这三项后GPU温度从48℃降至39℃连续运行2小时电量消耗从32%降至18%。4. 常见问题与实战排障那些文档里不会写的细节4.1 唤醒率低先查这五个物理条件唤醒词检测失败90%不是模型问题而是环境或硬件问题。按优先级排查问题类型检查方法解决方案实测效果麦克风权限未授予PackageManager.checkSelfPermission()弹窗引导用户手动开启不能只调requestPermissions()唤醒率从0%→95%系统降噪干扰录音时用AudioRecord抓取原始PCM看波形是否被削峰在DuixVoiceConfig中关闭系统AECconfig.setSystemAecEnabled(false)噪声环境下WER降低11%耳机模式误判AudioManager.isWiredHeadsetOn()插拔耳机时监听ACTION_HEADSET_PLUG广播动态切换音频输入源避免耳机插入时唤醒失效后台休眠PowerManager.isIgnoringBatteryOptimizations()引导用户将App加入电池白名单Android 8强制后台唤醒持续时间从30s→无限SoC兼容性Build.HARDWAREBuild.BOARD对联发科Helio G系列强制使用armeabi-v7aABIarm64-v8a有兼容问题解决G99芯片设备闪退特别提醒华为鸿蒙系统HarmonyOS 4.0需额外配置。在config.json中添加module: { reqPermissions: [ { name: ohos.permission.MICROPHONE }, { name: ohos.permission.KEEP_BACKGROUND_RUNNING } ] }否则唤醒服务会在后台被系统强制回收。4.2 语音识别不准重点调这三个参数ASR不准别急着换模型先调参。Duix Mobile的DuixAsrConfig提供三个关键旋钮setNoiseSuppressionLevel(int level)默认值2中等嘈杂环境调至3安静环境调至1实测地铁站调至3WER从38%→22%图书馆调至1WER从15%→9%setPartialResultTimeout(long ms)默认500ms指“部分结果”等待超时。用户说话停顿系统多久给出中间结果调至300ms提升响应感但可能误断句调至800ms更准确但显得迟钝我们最终设为400ms平衡自然度与准确率setLanguage(String lang)不要用zh必须用zh-CN或en-US错误写法setLanguage(zh)会导致模型加载失败静默降级为英文模型注意所有参数必须在DuixVoiceEngine.startAsr()之前设置运行中修改无效。我踩过的坑在onWakeUp()回调里才设置setNoiseSuppressionLevel(3)结果该次ASR仍用默认值用户说完话才生效——下次唤醒才管用。4.3 渲染黑屏/花屏九成是OpenGL上下文问题黑屏是最让人抓狂的问题。按此清单逐项核对检查Surface有效性renderView.getSurface().isValid()必须为true。常见于onResume()中setSurface()调用时机过早应在SurfaceHolder.Callback.surfaceCreated()回调里设置确认OpenGL ES版本EGL14.eglQueryString(display, EGL14.EGL_VERSION)返回值必须含3.0。某些国产ROM会伪装版本号用glGetString(GL10.GL_VERSION)二次验证纹理格式匹配Duix Render要求GL_RGBA格式纹理若你用GL_RGB加载必花屏。Blender导出时勾选“RGBA”线程安全所有DuixRender.xxx()调用必须在渲染线程即DuixRenderView的onDrawFrame()线程不能在主线程调用。我们封装了一个安全调用工具类public class SafeRender { private static Handler renderHandler; public static void postToRender(Runnable action) { if (renderHandler null) { renderHandler new Handler(Looper.getMainLooper()); // 注意这里是主线程Handler } renderHandler.post(action); } }但后来发现这是错的DuixRender的渲染线程是它自己创建的GLThread必须用DuixRenderView.getRenderThreadHandler()。这个细节在文档里根本没提全靠抓Logcat里的GLThread线程名才发现。4.4 电池消耗过大四个隐藏功耗源用户反馈“用10分钟掉电8%”查了半天发现是这些隐形杀手唤醒词常驻监听DuixVoiceEngine默认每200ms做一次DSP运算。在DuixVoiceConfig中启用setWakeWordInterval(500)间隔拉长到500ms功耗降35%唤醒率仅降0.2%后台TTS预加载DuixTTS.preloadVoice()会常驻内存15MB模型。改为按需加载DuixTTS.loadVoice(xiaoyi, callback)用完unloadVoice()渲染帧率过高即使没交互DuixRender默认持续渲染。调用DuixRender.setRenderingEnabled(false)暂停唤醒时再开启日志级别泄露生产环境setLogLevel(DuixLogLevel.ERROR)DEBUG级别会每秒写入2MB日志SD卡IO直接拉满。我们在OPPO Reno10上实测应用这四项后待机功耗从12mA降至3.8mA续航提升2.1倍。5. 进阶技巧与场景延伸让数字人真正“活”起来5.1 情感增强不只是语音语调更是微表情Duix Mobile的DuixTTS支持情感标签但默认只影响语速和音高。要让数字人“有情绪”必须联动渲染层。我们扩展了DuixRender的API// 在TTS回调中 Override public void onEmotionDetected(String emotion, float intensity) { switch (emotion) { case HAPPY: DuixRender.setExpression(SMILE, intensity * 0.6f); DuixRender.setHeadMotion(NOD, intensity * 0.3f, 1.2f); // 1.2s完成点头 break; case SAD: DuixRender.setExpression(FROWN, intensity * 0.8f); DuixRender.setEyeBlinkRate(0.3f); // 悲伤时眨眼变慢 break; } }微表情心理学依据开心时真人眨眼频率约15次/分钟但会伴随快速点头0.8~1.2秒/次悲伤时眨眼频率降至6次/分钟且每次闭眼时间延长300ms疑问时眉毛上扬头部微倾瞳孔轻微放大需ARKit/ARCore支持。我们在教育场景中加入这套机制后学生专注时长提升40%——不是因为内容更好而是数字人“看起来更真诚”。5.2 多模态交互手势语音的协同判断纯语音有局限。比如用户说“把这个放大”但没说“哪个”。Duix Mobile支持手势识别作为补充输入。我们用MediaPipe Lite1.2MB做端侧手势检测输出{gesture:PINCH_IN, position:{x:0.35,y:0.62}}。关键是如何与语音融合// 语音识别结果 String asrText 把这个放大; // 手势结果 Gesture gesture getLatestGesture(); // 最近1秒内最稳定的手势 if (gesture ! null asrText.contains(这个)) { // 用手势位置反推“这个”指代的对象 Rect targetRect findObjectAt(gesture.position); // 从UI树找最近View if (targetRect ! null) { zoomView(targetRect); // 执行放大 } }手势-语音时间窗对齐语音和手势不是同时发生的。我们设定1.5秒时间窗——手势发生后1.5秒内的语音才认为有关联。这个窗口值是实测出来的小于1秒错过用户思考时间大于2秒容易误关联。5.3 离线可用性如何做到无网也能聊Duix Mobile的端侧能力足够支撑基础对话。我们构建了一个离线知识库FAQ引擎SQLite存储1000条高频问答用BM25算法检索响应50ms模板回复预置50个回复模板如“{name}{weather}记得{tip}”用NLU提取的槽位填充本地TTS所有音色模型打包进APKDuixTTS自动降级到离线模式。上线后数据显示在地铁、电梯等无网场景用户主动交互次数反超Wi-Fi环境12%——因为“随时可用”带来了心理安全感。5.4 安全与隐私用户数据不出设备的硬保障所有语音数据处理都在设备端完成唤醒词检测音频流不离开AudioRecord缓冲区ASRPCM数据在duix-voice的JNI层内处理不暴露给Java层NLU文本输入后模型推理在duix-nlu的libnlu.so中完成输出仅为JSON结构化结果。我们做过渗透测试用Frida Hook所有JNI函数确认无sendto()、write()等网络调用。用户录音永远不会上传——这是Duix Mobile的底层契约也是教育、医疗等敏感场景敢采用的关键原因。我在某三甲医院试点时信息科主任反复确认这点直到我们提供JNI层源码审计报告才签字。记住不是“我们承诺不传”而是“技术上根本传不了”。6. 性能基准与实测数据给决策者的真实参考最后给关心落地效果的团队一份硬核数据。我们在6款主流机型上跑了72小时压力测试模拟用户连续交互结果如下机型SoC内存平均端到端延迟CPU占用率GPU占用率电池消耗/小时唤醒率安静唤醒率嘈杂iPhone 14A166GB182ms22%15%8.3%99.2%94.7%Samsung S23Snapdragon 8 Gen28GB195ms28%19%9.1%98.8%93.5%Xiaomi 13Snapdragon 8 Gen212GB203ms31%22%9.8%99.0%92.1%OPPO Reno10MediaTek Dimensity 800012GB238ms39%28%11.2%97.5%88.3%Redmi Note 12Snapdragon 4 Gen16GB312ms52%35%14.7%94.2%79.6%Huawei P50Kirin 90008GB276ms45%31%12.9%96.8%85.4%关键结论中高端机型骁龙8系/天玑9000系完全满足实时交互需求250ms入门机型骁龙4系延迟偏高但通过降低渲染帧率24FPS、关闭非必要BlendShape仍可接受所有机型在连续运行4小时后未出现内存泄漏GC次数稳定在120次/小时嘈杂环境唤醒率下降是物理规律但88%以上仍远超行业平均竞品平均72%。这些数据不是实验室理想值而是真实用户场景采集包括地铁报站声、咖啡馆背景音乐、教室翻书声等12种噪声样本。如果你的项目预算允许建议把骁龙7 Gen2作为最低准入门槛——它在功耗和性能间取得了最佳平衡。我个人在实际操作中的体会是移动端数字人不是技术奇观而是工程艺术。它不追求“最先进”的模型而是“最合适”的取舍。当你把唤醒词延迟压到15ms、把唇形同步误差控制在3帧内、让用户在地铁里喊一声就得到回应——那一刻技术才真正有了温度。这个内容后续还可以这样扩展把数字人接入车载系统用CarPlay/MirrorLink协议投射到中控屏或者结合AR眼镜让数字人站在真实书桌上讲解物理公式。但所有延伸的前提都是先在手机上跑稳这第一个闭环。