项目概述
基于 NVIDIA Jetson Orin Nano 的端侧车辆 AI 语音助手:说话→听懂→思考→执行→回答全链路在车端本地完成,不依赖云端。集成 ASR-TTS 语音交互、意图路由、RAG 车辆知识库、LLM/Tool 调用与 QT 数字座舱界面,实现车辆知识问答、车控工具调用与 GUI 展示。
各服务模块采用 ZeroMQ 轻量级通信框架,实现松耦合的分布式多服务架构。
系统架构
系统拆分为 ASR、Intent Router、RAG、LLM、Tool Bus、TTS、QT UI 七个模块,模块间通过 ZMQ 的 REQ/REP + PUB/SUB 组合,实现请求应答、状态广播、状态同步三种通信模式。
以一句「帮我把空调调到 24 度」为例的完整链路:
关键技术点
- AI 语音交互:ASR 使用 sherpa-onnx 部署 zipformer 模型,TTS 基于 SummerTTS;设计了 ASR 与 TTS 的同步机制,避免 TTS 播放期间语音回灌误识别;构建 VAD 与关键词唤醒
- 意图路由:语义分类 + 规则分类双通路融合的意图识别,编排 5 类服务调用,按意图选择 RAG 检索、LLM 调用、直接语音回复或 Tool 调用的组合
- RAG 车辆知识库:基于 sentence-transformers 将车辆手册向量化,余弦相似度 + Top-K 检索,端侧全离线完成知识问答
- LLM 部署与 Tool 调用:llama.cpp 部署 Qwen2.5-3B 的 GGUF Q4_K_M 量化模型;通过 prompt 强约束让模型只输出两类 JSON——
respond交给 TTS 播放,tool_call驱动车控工具执行 - QT 车载座舱 GUI:数字座舱界面,实时展示空调、车窗、天窗、摄像头与传感器等车辆状态
核心 API 与接口设计
服务端口与通信原语
| 服务 | 端口 | 协议 |
|---|---|---|
| Intent Router | :6666 | ZMQ REQ/REP |
| RAG Service | :6667 | ZMQ REQ/REP |
| LLM Service | :6668 | ZMQ REQ/REP |
| Tool Bus | :6669 | ZMQ REQ/REP |
| 状态广播 | :6670 / :6671 | ZMQ PUB/SUB |
| TTS Server | :7777 | 音频流 |
| llama-server(GGUF 推理后端) | :8080 | HTTP |
C++ 侧封装了 ZmqServer / ZmqClient(REQ/REP 请求应答)与 ZmqPub / ZmqSub(状态广播)两组通用组件,各服务只依赖消息契约、不依赖彼此实现。
意图路由:五分类多分支
Router 对每句输入做语义分类 + 规则分类双通路融合,输出五类意图并按类型路由到不同服务链:
| 意图 | 链路 | 典型时延 |
|---|---|---|
| EMERGENCY(紧急事项) | RAG → TTS | ~0.5s |
| FACTUAL(手册事实问答) | RAG → TTS | ~0.5s |
| EXPLICIT_CMD(明确车控指令) | Tool Bus → TTS | ~0.5s |
| COMPLEX(复杂查询) | RAG → LLM → TTS | 秒级 |
| CREATIVE(闲聊/生成) | LLM → TTS | 秒级 |
| LLM + Tool 闭环 | LLM ↔ Tool → LLM → TTS | 秒级 |
LLM 双模式 JSON 契约
通过 Prompt 强约束 LLM 只输出两类 JSON,这是「语音语义 → 车辆动作」的核心契约:
| |
respond→ 直接送 TTS 播报tool_call→ Tool Bus 侧做参数归一化与校验(例如从口语化文本中提取「24 度」的数值),执行后通过 PUB 通道把车辆状态同步给 QT 座舱,并把执行结果回灌 LLM 生成自然语言回复- 无法归一化的输出会降级为
respond兜底,保证任何情况下用户都能得到语音反馈
RAG 检索接口
车辆手册切片后经 sentence-transformers 编码为 768 维向量入库;查询时同模型编码 query → 余弦相似度 Top-K 检索 → 命中文档拼接进 LLM 上下文,全部在端侧离线完成。
项目状态
全链路已在 Jetson Orin Nano 上跑通,端侧离线完成语音到车控的闭环。