# uni-app-x Android 大模型语音指令系统设计方案 ## 1. 系统概述 本方案旨在利用 uni-app-x (UTS) 的原生能力,结合最新的大语言模型(LLM)技术,构建一个能够理解自然语言并控制 App 行为的语音指令系统。 与传统关键词匹配不同,基于 LLM 的系统可以理解复杂的意图、参数提取以及上下文关联。 ## 2. 技术架构 系统数据流向如下: `用户语音 -> [录音/VAD] -> [ASR 语音转文字] -> [LLM 大模型意图识别] -> [Function Calling] -> [App 业务逻辑执行] -> [TTS 语音反馈]` ### 核心组件选型 | 组件 | 推荐方案 | 备选方案 | 说明 | | :--- | :--- | :--- | :--- | | **开发框架** | **uni-app-x (UTS)** | - | 利用 UTS 直接调用 Android 原生 API,零损耗。 | | **语音识别 (ASR)** | **Sherpa-onnx (离线/流式)** | Android 原生 / OpenAI Whisper | Sherpa-onnx (新一代 Kaldi) 端侧离线识别率极高,支持中英混合,远超传统原生 API。 | | **大模型 (LLM)** | **云端 API (GPT-4o / DeepSeek / Qwen)** | 端侧模型 (Gemini Nano / Llama 3) | 云端模型推理能力强,支持 Function Calling;端侧模型隐私好但集成复杂度高。 | | **意图映射** | **LLM Function Calling (工具调用)** | Prompt Engineering + JSON 提取 | Function Calling 是目前最稳定的指令结构化输出方式。 | | **语音合成 (TTS)** | **Sherpa-onnx (离线 VITS)** | Edge TTS / Azure TTS | Sherpa-onnx 支持 VITS 模型,端侧离线生成真人级语音;Edge TTS 效果极佳但需联网。 | > **注:为什么推荐 Sherpa-onnx?** > Sherpa-onnx 是基于 Next-gen Kaldi 的开源语音框架,专为端侧设计。 > * **中文识别能力极强**:支持阿里达摩院的 **Paraformer**(非流式准确率天花板)和 **Zipformer**(流式低延迟)。在 WenetSpeech 等万小时级数据集上训练的模型,中文识别率可媲美商业云 API,且支持**中英混合**说。 > * **端侧高性能**:支持流式识别(说话同时出文字),响应速度快。 > * **语音合成**:集成了 VITS/Matcha-TTS 等高表现力的语音合成模型,告别机械音。 > * **多平台支持**:Android (AAR)、iOS、Web (WASM)、Linux 等。**WASM vs AAR 区别**: > - **WASM (WebAssembly)**:用于浏览器/WebView,跨平台(Web、移动Web),无需编译,易集成到 uni-app-x 的 Web 版本或 H5 页面。但性能较低(受浏览器JS限制),模型大小受限,适合轻量场景。 > - **AAR (Android Archive)**:原生Android库,性能最高,适合 uni-app-x Android 端,零损耗调用。但需编译集成,模型可更大更复杂。 > - **推荐**:Android 端用 AAR;如果需跨Web/小程序,用 WASM。 > * **集成便利**:在 Android 上通过 UTS (JNI/AAR) 集成后,可以实现完全离线、低延迟且效果接近云端大厂的语音交互体验。 ## 3. 详细设计与实现 ### 3.1 语音采集与识别 (基于 Sherpa-onnx) 在 uni-app-x 中,通过 UTS 集成 Sherpa-onnx 的 Android AAR 库。 **实现思路:** 1. 下载 Sherpa-onnx 的 Android AAR 及预训练模型(推荐 `zipformer-bilingual` 中英双语流式模型)。 - **AAR 库下载**:https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.10.22/sherpa-onnx-1.10.22-android.tar.bz2 - **模型下载**:https://github.com/k2-fsa/sherpa-onnx/releases/download/v1.10.22/sherpa-onnx-streaming-zipformer-bilingual-zh-en-2023-02-20.tar.bz2 - **注意**:下载后解压,将 `.aar` 文件放入 uni-app-x 项目的 `nativeplugins/android/libs` 目录,模型文件放入 `assets`。 2. 在 UTS 中引入 AAR,调用 `SherpaOnnx` 相关 API。 3. 通过 `AudioRecord` 读取麦克风音频流,实时喂给识别器。 ```typescript // UTS 伪代码示例 (集成 Sherpa-onnx) // 需先在 config.json 中配置原生依赖或引入 jar/aar import { OnlineRecognizer, OnlineRecognizerConfig } from 'com.k2fsa.sherpa.onnx'; // 1. 配置模型路径 (需将模型文件放入 assets 并拷贝到私有目录) let config = new OnlineRecognizerConfig(); config.modelConfig.tokens = assetPath + "/tokens.txt"; config.modelConfig.transducer.encoder = assetPath + "/encoder.onnx"; config.modelConfig.transducer.decoder = assetPath + "/decoder.onnx"; config.modelConfig.transducer.joiner = assetPath + "/joiner.onnx"; // 2. 初始化识别器 let recognizer = new OnlineRecognizer(config); // 3. 开启录音 (伪代码) // AudioRecord 读取 byte[] buffer // recognizer.acceptWaveform(sampleRate, buffer); // let text = recognizer.getResult().text; ``` ### 3.2 大模型意图识别 (核心) 这是系统的“大脑”。我们需要将用户的自然语言转换为 App 可执行的函数。 **关键技术:Function Calling (工具调用)** 最新的大模型(如 GPT-4o, Qwen-Turbo, DeepSeek-V3)都支持 Function Calling。你需要预定义 App 支持的功能列表。 **Prompt/Schema 设计示例:** 假设 App 是一个电商应用,支持“搜索商品”和“查看订单”。 ```json // 发送给 LLM 的 tools 定义 [ { "type": "function", "function": { "name": "search_product", "description": "搜索商品", "parameters": { "type": "object", "properties": { "keyword": { "type": "string", "description": "商品关键词" }, "sort": { "type": "string", "enum": ["price_asc", "sales_desc"], "description": "排序方式" } }, "required": ["keyword"] } } }, { "type": "function", "function": { "name": "navigate_to_page", "description": "跳转到指定页面", "parameters": { "type": "object", "properties": { "page_name": { "type": "string", "enum": ["cart", "profile", "orders"] } }, "required": ["page_name"] } } } ] ``` **交互流程:** 1. 用户说:“帮我找一下红色的连衣裙,按销量排序。” 2. ASR 识别文本:“帮我找一下红色的连衣裙,按销量排序。” 3. 请求 LLM API,带上上述 `tools` 定义和用户文本。 4. LLM 返回结构化数据(而不是普通文本): ```json { "tool_calls": [ { "function": { "name": "search_product", "arguments": "{\"keyword\":\"红色连衣裙\", \"sort\":\"sales_desc\"}" } } ] } ``` 5. App 解析 JSON,调用内部函数 `doSearch("红色连衣裙", "sales_desc")`。 ### 3.3 业务执行与反馈 1. **执行**:根据 LLM 解析出的函数名和参数,在 uni-app-x 中执行路由跳转或数据查询。 2. **反馈**: * **视觉反馈**:弹窗提示“正在为您搜索...”。 * **语音反馈**:将执行结果(如“已为您找到 5 款红色连衣裙”)通过 Android `TextToSpeech` 朗读出来。 ## 4. 进阶优化策略 ### 4.1 降低延迟 (Latency) * **流式传输 (Streaming)**:如果 LLM 用于生成回复内容(不仅仅是指令),务必使用 Stream 模式,通过 SSE (Server-Sent Events) 实时接收并播放语音。 * **预测性执行**:对于高频指令,可以在本地进行简单的正则匹配作为一级拦截,命中则不走 LLM,直接执行。 ### 4.2 上下文管理 * 维护一个 `messages` 数组,存储最近 5-10 轮对话。 * 这样用户可以说:“刚才那个太贵了,看个便宜点的”,LLM 能结合上一轮“搜索连衣裙”的上下文,生成新的搜索指令(价格排序)。 ### 4.3 隐私与安全 * **敏感操作二次确认**:涉及支付、删除等操作,LLM 解析出指令后,App 应弹出确认框,不能直接执行。 * **数据脱敏**:上传给 LLM 的数据中尽量去除用户隐私信息。 ## 5. 推荐接入的大模型服务 1. **OpenAI (GPT-4o)**: 综合能力最强,Function Calling 最精准,但国内访问需代理。 2. **通义千问 (Qwen-Turbo/Max)**: 国内模型中 Function Calling 支持较好,价格便宜,速度快。 3. **DeepSeek (V3)**: 性价比极高,编码和逻辑能力强,适合处理复杂指令逻辑。 4. **智谱 AI (GLM-4)**: 同样支持工具调用,国内生态整合较好。 ## 6. 总结 在 uni-app-x 中实现大模型语音指令,核心在于**利用 UTS 打通 Android 原生语音能力**,并**利用 LLM 的 Function Calling 能力实现自然语言到代码逻辑的映射**。这种架构既保留了原生 App 的性能,又具备了生成式 AI 的灵活性。