
MNN-TaoAvatar Android 端侧数字人全栈实践LLM / ASR / TTS / A2BS / NNR 五大模型离线协同架构解析【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNNMNN-TaoAvatar 是阿里 MNN 团队基于 TaoAvatar 研究成果arXiv:2503.17032v1打造的本地智能数字人 Android 应用它将大语言模型LLM、语音识别ASR、语音合成TTS、声音到动作合成A2BS与神经渲染NNR五类模型全部部署在手机端实现 100% 离线、多模态交互的数字人体验。本文以 apps/Android/MnnTaoAvatar/README_CN.md 为骨架结合仓库内 Android 工程源码Kotlin 编排层与 C 推理层深入讲解其工作原理、硬件要求、安装运行方式、五大模块的实现细节与可调配置帮助你理解并复现一个端侧多模型协同的完整工程。什么是 MNN-TaoAvatarMNN-TaoAvatar 是一个完全本地运行、无需联网的智能数字人 App你可以对着手机说话数字人会听懂你的话、思考并组织语言回答同时以自然的表情和动作实时呈现在屏幕上。整个交互链路中没有任何云端调用——语音识别、对话生成、语音合成、动作合成和图像渲染全部在设备端完成隐私数据不出手机。它是阿里最新研究成果的落地应用TaoAvatar 论文已在 arXiv 公开发布将以下五类模型统一集成到手机端模块全称作用LLMLarge Language Model本地聊天大脑负责理解用户输入并生成回复ASRAutomatic Speech Recognition语音转文字即说即转TTSText-to-Speech文字转语音让数字人发声自然真实A2BSAudio-to-BlendShape声音驱动表情动作通过音频生成面部表情与动作参数NNRNeural Rendering实时神经渲染让数字人表情细腻逼真仓库中的 README.md 与 README_TW.md 分别提供英文与繁体中文版本本文面向简体中文读者深入解读中文版文档背后的完整工程实现。工作原理从一句语音到一张生动的数字人脸README_CN.md 用一张流程图概括了整个应用的运行闭环下图同样位于仓库 assets/tao_avatar_process_zh.jpg完整的数据流可以拆解为两条并行链路对话链路用户语音 → ASR 识别为文本如你好你是谁→ LLM 生成回答文本如你好我是小淘→ TTS 合成语音播放形象链路TTS 输出的语音音频→ A2BS 生成 BlendShape 动作参数 → 与默认姿态数据一起送入 NNR → 渲染出数字人图像并保证与音频输出同步。两条链路在MainActivity中被协调起来ASR 的识别结果回调触发 LLM 生成LLM 的逐字输出streaming同时驱动文字面板更新与语音播放AudioBlendShapePlayer负责把音频片段同步送入 A2BS 和渲染管线。从源码结构看这正是语音交互 → 对话 → 语音反馈 → 姿态同步 → 图像渲染的端侧闭环。硬件要求由于五类模型需要同时常驻并运行在手机上对芯片算力与内存的要求远高于普通 App。README 给出的最低配置如下旗舰芯片级性能高通骁龙 8 Gen 3 或联发科天玑 9200 及以上级别内存至少 8GB存储空间至少 5GB用于存放模型文件ARM64 架构。⚠️ 性能不足的设备可能会遇到卡顿、声音断续或功能受限等情况。从工程代码看这个门槛是真实且必要的MainActivity.setupServices()会并发初始化五个服务A2BS、TTS、NNR、LLM、ASR五套模型同时驻留内存同时应用还内置了 MemoryMonitor.java 持续监控内存水位并在调试信息中展示各模型体积见 strings.xml 中的debug_model_size可见内存是该项目最紧张的资源。安装与体验步骤1. 克隆项目代码git clone https://gitcode.com/GitHub_Trending/mn/MNN.git cd apps/Android/MnnTaoAvatar2. 构建并部署连接你的安卓手机打开 Android Studio 点击 Run或直接在apps/Android/MnnTaoAvatar目录下执行 Gradle 命令./gradlew installDebug首次运行时App 会引导下载各模型资源LLM / TTS / A2BS / ASR / NNR 五套模型下载完成后即可开始与数字人对话。工程采用标准的 Gradle 布局settings.gradle、app/src/main/CMakeLists.txtJNI 层负责 Kotlin 与 C 推理代码之间的桥接。源码级拆解五大模块如何协同模型目录与多语言适配MHConfig所有模型路径统一收敛在 MHConfig.kt 中BASE_DIR指向 App 私有目录下的模型根目录由DownloadModule决定各模型子目录如下配置项模型目录用途NNR_MODEL_DIRTaoAvatar-NNR-MNN/神经渲染模型TTS_MODEL_DIRbert-vits2-MNN/中文 TTS 模型TTS_MODEL_DIR_ENsupertonic-tts-mnn/英文 TTS 模型A2BS_MODEL_DIRUniTalker-MNN/声音到 BlendShape 模型LLM_MODEL_DIRQwen2.5-1.5B-Instruct-MNN对话大模型ASR_MODEL_DIRsherpa-mnn-streaming-zipformer-bilingual-zh-en-2023-02-20/或sherpa-mnn-streaming-zipformer-en-2023-02-21语音识别模型其中 ASR 目录会根据设备语言自动切换中英文双语流式模型用于中文环境英文流式模型用于非中文环境见 DeviceUtils.kt 的isChinese判断通过系统 Locale 的 language 与 country 组合判定。LLM本地聊天大脑LLM 推理封装在 LlmService.kt其底层通过com.alibaba.mnnllm.android.ChatService创建ChatSession初始化时以模型目录下的config.json创建会话并load()通过chatSession.generate(text, listener)以streaming 方式逐字回调生成结果回调中通过channelFlow将进度推送给 UIrequestStop()支持用户随时打断回复对应 App 中的点击停止按钮。LlmPresenter负责把流式文本实时渲染到聊天界面系统提示词System Prompt可在设置页修改默认值为Your name is Tao, you are a helpful assistant.见 strings.xml 的llm_prompt_default每次开始新会话时通过MainSettings.getLlmPrompt()重新加载。ASR语音识别ASR 服务封装在 RecognizeService.kt基于 sherpa-mnn 的OnlineRecognizer流式识别采集参数固定为16kHz 采样率、单声道、PCM 16bit使用OnlineRecognizerConfig配置特征提取、CTC 解码器OnlineCtcFstDecoderConfigbeam 3000、端点检测endpoint等解码方式为greedy_search贪心搜索并统计 accept/decode 耗时与实时率RTF用于调试。识别结果通过onRecognizeText回调送回MainActivity进入 LLM 对话流程。TTS语音合成TtsService.kt 支持两套引擎默认的bert-vits2-MNN中文/supertonic-tts-mnn英文以及调试开关TTS_USE_SHERPA对应的 sherpa TTS。初始化时根据AppUtils.isChinese()选择中文或英文模型目录通过 JSON 参数覆盖机制向 C 层nativeLoadResourcesFromFile传入配置当前支持英文模式的speaker_id覆盖注册SharedPreferences监听器运行期切换音色speaker无需重启。MainSettings中还预留了 TTS 语速配置tts_speed范围 0.5–2.0存储时放大 10 倍为整数 5–20与音色配置tts_speaker_id默认F1设置页提供男女声各两档方便后续扩展。A2BS声音驱动表情动作A2BSService.kt 将音频帧实时转换为 BlendShape 参数nativeLoadA2bsResources(modelDir, tempDir)从UniTalker-MNN模型目录加载资源process(index, audioData, sampleRate)接收ShortArray音频数据返回AudioToBlendShapeData底层的音频到 3DGS / FLAME BlendShape 转换实现位于 C 层 a2bs/audio_to_3dgs_blend_shape.cpp、audio_to_flame_blend_shape.cpp等支持 3DGS 与 FLAME 两套表情参数体系。AudioBlendShapePlayer负责把 TTS 输出的音频按片段句子切分同步驱动语音播放与 A2BS 参数生成保证听得到的声音与看得到的口型对齐。NNR实时神经渲染NnrAvatarRender.kt 负责数字人最终画面的渲染基于AvatarTextureViewGLSurfaceView 子类承载渲染表面监听 surface 创建/销毁生命周期通过 JNI 调用 C 侧 nnr_avatar_render.cpp使用 NNR 运行时模型库见 libs/NNR/加载TaoAvatar-NNR-MNN模型渲染输入 A2BS 输出的姿态参数 默认姿态数据输出为数字人图像支持手势旋转视角rotate_hintSlide to Rotate the avatar并提供 debug 模式下的逐帧 BlendShape 落盘DebugWriteBlendShape用于排查问题。编排层MainActivity 与并发初始化MainActivity.kt 是整个应用的指挥中心其setupServices()使用 Kotlin 协程的async/awaitAll并发初始化五个服务并对每个服务单独计时日志形如Task TTS completed in xxx ms随后进入通话状态后播放欢迎语Hello, I am Tao.并驱动数字人开口ASR 识别文本到达 →processAsrText()把用户文本送入 LLMLLM 流式输出逐字驱动 UI 与 A2BS语音播放结束时自动恢复录音形成你说 → 它答 → 你再说的自然对话循环支持随时打断stopAnswer()停止 LLM、清空渲染与播放。聊天状态机STATUS_IDLE / STATUS_INITIALIZING / STATUS_CALLING控制整个会话生命周期WakeLockManager在通话期间保持屏幕常亮。模型资源与版本发布模型获取五类模型均可从 TaoAvatar 官方模型合集中获取仓库 README_CN.md 中列出了完整资源清单模型合集托管于 ModelScopeLLM 模型Qwen2.5-1.5B 的 MNN 转换版对应LLM_MODEL_DIRTTS 模型bert-vits2-MNN中文与 Supertonic TTS英文自 v0.0.2 起支持声音动作模型UniTalker-MNN对应A2BS_MODEL_DIR神经渲染模型TaoAvatar-NNR-MNN对应NNR_MODEL_DIRASR 模型Sherpa 双语流式识别模型对应ASR_MODEL_DIR。下载完成后放置到 App 模型目录即可被MHConfig识别加载。Release 版本Version 0.0.2新增对 TaoAvatar 的 Supertonic TTS 支持英文音色可通过设置页切换对应TTS_MODEL_DIR_EN与tts_speaker_id配置。Version 0.0.1首次公开发布版本可在应用内通过 ASR 与 TTS 与 3D 数字人进行语音聊天。如遇到问题可通过 GitHub Issue 提交反馈。 官方公告iOS 版稍后上线。关键要点与限制完全离线所有推理均在端侧完成无需联网隐私数据不出设备性能门槛高五模型并发驻留建议骁龙 8 Gen 3 / 天玑 9200 以上、8GB 内存、5GB 存储的设备运行低配设备可能出现卡顿或功能受限双语言适配App 会根据系统语言自动选择中英文 ASR 与 TTS 模型DeviceUtils.isChinese判断可配置项LLM 系统提示词、TTS 音色英文模式与语速预留均可在设置页调整配置读写集中在 MainSettings.kt可扩展结构Kotlin 服务层 C 推理层cpp/职责清晰若要替换或新增模型只需改动MHConfig中的模型目录与对应 Service 的加载逻辑。【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考