8.4 KiB
8.4 KiB
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 库。
实现思路:
- 下载 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。
- 在 UTS 中引入 AAR,调用
SherpaOnnx相关 API。 - 通过
AudioRecord读取麦克风音频流,实时喂给识别器。
// 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 是一个电商应用,支持“搜索商品”和“查看订单”。
// 发送给 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"]
}
}
}
]
交互流程:
- 用户说:“帮我找一下红色的连衣裙,按销量排序。”
- ASR 识别文本:“帮我找一下红色的连衣裙,按销量排序。”
- 请求 LLM API,带上上述
tools定义和用户文本。 - LLM 返回结构化数据(而不是普通文本):
{ "tool_calls": [ { "function": { "name": "search_product", "arguments": "{\"keyword\":\"红色连衣裙\", \"sort\":\"sales_desc\"}" } } ] } - App 解析 JSON,调用内部函数
doSearch("红色连衣裙", "sales_desc")。
3.3 业务执行与反馈
- 执行:根据 LLM 解析出的函数名和参数,在 uni-app-x 中执行路由跳转或数据查询。
- 反馈:
- 视觉反馈:弹窗提示“正在为您搜索...”。
- 语音反馈:将执行结果(如“已为您找到 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. 推荐接入的大模型服务
- OpenAI (GPT-4o): 综合能力最强,Function Calling 最精准,但国内访问需代理。
- 通义千问 (Qwen-Turbo/Max): 国内模型中 Function Calling 支持较好,价格便宜,速度快。
- DeepSeek (V3): 性价比极高,编码和逻辑能力强,适合处理复杂指令逻辑。
- 智谱 AI (GLM-4): 同样支持工具调用,国内生态整合较好。
6. 总结
在 uni-app-x 中实现大模型语音指令,核心在于利用 UTS 打通 Android 原生语音能力,并利用 LLM 的 Function Calling 能力实现自然语言到代码逻辑的映射。这种架构既保留了原生 App 的性能,又具备了生成式 AI 的灵活性。