Voice Assistant — 语音 + LLM + MCP 智能助手
一个端到端的语音交互助手,支持语音输入 → 意图识别 → MCP 工具调用 → 语音播报的完整链路。
功能特性
- 语音识别 (ASR):基于讯飞实时语音转写,支持中文普通话
- 意图识别:DeepSeek 大模型自动识别用户意图(天气、POI搜索、路线规划等)
- MCP 工具调用:通过高德地图 MCP 获取实时数据(天气查询、兴趣点搜索、路线规划、地理编码等)
- 语音合成 (TTS):讯飞语音合成,查询结果自动播报
- 流式交互:前端实时展示处理步骤(录音 → 识别 → 意图 → 调用 → 生成 → 播报)
技术架构
用户语音 → [前端录音] → PCM上传
→ [讯飞ASR] 语音转文字
→ [DeepSeek] 意图识别 + 参数提取
→ [高德MCP] 工具调用(天气/POI/路线/地理编码)
→ [DeepSeek] 结果整理生成自然语言回复
→ [讯飞TTS] 文字转语音
→ [前端播放] 语音播报技术栈
| 层级 | 技术 |
|---|---|
| 前端 | Vue 3 + Vite |
| 后端 | Python 3.11+ + FastAPI |
| 语音识别 | 讯飞实时语音转写 (WebSocket) |
| 语音合成 | 讯飞在线语音合成 v2 (WebSocket) |
| 大模型 | DeepSeek Chat (OpenAI SDK 兼容) |
| 工具调用 | 高德地图 MCP (Streamable HTTP) |
支持的意图类型
| 意图 | 示例 | 数据来源 |
|---|---|---|
| 天气查询 | "北京今天天气怎么样" | 高德天气 API |
| POI 搜索 | "附近有什么咖啡店" | 高德 POI 搜索 |
| 周边搜索 | "我附近3公里内的加油站" | 高德周边搜索 |
| 驾车路线 | "从北京到上海怎么开车" | 高德驾车规划 |
| 步行路线 | "走路去天安门怎么走" | 高德步行规划 |
| 骑行路线 | "骑车去最近的地铁站" | 高德骑行规划 |
| 公交路线 | "坐地铁从望京到国贸" | 高德公交规划 |
| 地理编码 | "北京市朝阳区的经纬度" | 高德地理编码 |
| 逆地理编码 | "经度116.4,纬度39.9是哪里" | 高德逆地理编码 |
| 距离计算 | "北京到天津多远" | 高德距离测量 |
快速启动
1. 克隆项目
git clone && cd project22. 配置 API 密钥
cp backend/config.yaml.example backend/config.yaml编辑 backend/config.yaml,填入以下 API 密钥:
- 讯飞:console.xfyun.cn → 创建应用 → 开通「实时语音转写」和「语音合成」
- DeepSeek:platform.deepseek.com → 创建 API Key
- 高德:console.amap.com → 创建应用 → 添加 Key(Web 服务)
3. 启动后端
cd backend
pip install -r requirements.txt
uvicorn app.main:app --reload后端运行在 http://localhost:8000
4. 启动前端
cd frontend
npm install
npm run dev前端运行在 http://localhost:5173
项目结构
├── frontend/ # Vue 3 前端
│ └── src/
│ ├── App.vue # 主界面(录音、步骤展示、音频播放)
│ └── main.js
├── backend/ # Python FastAPI 后端
│ ├── config.yaml.example # 配置模板(API 密钥占位符)
│ ├── requirements.txt
│ └── app/
│ ├── main.py # FastAPI 入口
│ ├── config.py # YAML 配置读取
│ ├── api/routes.py # API 路由(/api/voice-query, /api/asr, /api/tts)
│ └── services/
│ ├── pipeline.py # 主管线编排(ASR → 意图 → MCP → 生成 → TTS)
│ ├── asr.py # 讯飞语音识别
│ ├── tts.py # 讯飞语音合成
│ ├── amap_mcp.py # 高德 MCP 工具调用
│ ├── deepseek.py # DeepSeek 意图识别 + 回复生成(未找到则为内联)
│ └── audio_util.py # PCM ↔ WAV 转换
└── README.mdAPI 接口
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/voice-query | 完整语音管线(上传音频 → 返回回复文本 + 语音) |
| POST | /api/asr | 单独测试语音识别 |
| POST | /api/tts | 单独测试语音合成 |
