Files
akmon/doc_news/android大模型语音指令.md
2026-01-20 08:04:15 +08:00

158 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 的灵活性。