8.3 KiB
VoiceLLM Cloud — 项目总结与部署手册
本文档概括 voicellmcloud(云端语音与意图服务)的定位与端到端流程,并给出从开发试跑到生产部署的检查清单与排障要点。细节协议仍以 CLOUD_VOICE_PROTOCOL_v1_text_uplink.md、FLIGHT_INTENT_SCHEMA_v1.md 为准。
1. 项目总结
1.1 定位
基于 FastAPI + WebSocket 的 text_uplink 服务:机载或地面客户端上行 文本(来自设备 STT 或调试键盘),云端完成 大模型理解与分流、结构化飞控意图 与 TTS 音频下发。云端 不直接驱动 PX4;飞控执行由 伴飞客户端 / 翻译桥 / ROS 消费 dialog_result.flight_intent 或本地 Socket Command 完成。
1.2 核心能力
| 能力 | 说明 |
|---|---|
| 会话协议 | Cloud Voice Protocol v1.0,proto_version / transport_profile: "text_uplink" |
| LLM | 默认 阿里云 DashScope(如 qwen-plus),支持 流式输出(llm.text_delta) |
| 意图 | routing: flight_intent(严格 JSON,见 FLIGHT_INTENT_SCHEMA v1)或 chitchat |
| TTS | 本地推理:TTS_PROVIDER=kokoro(ONNX,默认模型目录见配置)或 piper(需另装 piper-tts 与语音包) |
| 多会话 | MAX_CONCURRENT_SESSIONS 限制并发会话数 |
| 长连接 | Uvicorn WebSocket Ping/Pong(如 scripts/run_server.py 中 interval/timeout),减轻 NAT/代理空闲断线 |
1.3 飞控意图(与客户端/桥协作)
- 合法
flight_intent仅含文档 §3.7 所列type与允许的args;时长用wait+seconds,不得在hover/hold中写duration。 - 可选
trace_id;takeoff可选relative_altitude_m。 - 客户端侧可参考
Client/voice_drone_assistant:云端结果映射为 SocketCommand(含已对齐的return_home)或由 桥 顺序消费整段actions。
1.4 仓库与模块(服务端)
app/main.py FastAPI 入口、/health、WebSocket 挂载
app/config.py 环境变量 / .env(Pydantic Settings)
app/websocket/ 会话、消息处理与流式 turn
app/services/ LLM/TTS 接口、意图解析与 TTS 分句
app/providers/ DashScope LLM、Kokoro / Piper TTS
app/protocols/models.py 协议消息体(含 FlightIntentPayload)
scripts/run_server.py 带 WS 保活的 Uvicorn 启动(host/port 读取 settings)
docs/ 协议、Schema、实施计划与本手册
1.5 文档索引
| 文档 | 用途 |
|---|---|
CLOUD_VOICE_PROTOCOL_v1_text_uplink.md |
WebSocket 消息类型与时序 |
FLIGHT_INTENT_SCHEMA_v1.md |
flight_intent 字段、校验分级、桥与 ROS 参考 |
FLIGHT_INTENT_IMPLEMENTATION_PLAN.md |
分阶段交付与验收 |
API_SPECIFICATION.md / PX4_CLIENT_CONTEXT.md |
对外 API 说明、PX4 上下文上报 |
CLOUD_VOICE_DIALOG_v1.md |
dialog_result v1:protocol、confirm、飞控门控 |
CLOUD_VOICE_FLIGHT_CONFIRM_v1.md |
历史备选(pending / turn.confirmation) |
QUICKSTART.md |
最短路径试跑 |
STRUCTURE.md |
目录与模块职责 |
2. 部署手册
2.1 环境与依赖
- Python:3.10+
- 网络:可访问 DashScope API(大陆外注意线路与合规)
- 磁盘:TTS 模型(Kokoro 一部署套约数百 MB;Piper 语音包约数十 MB 级)
cd /path/to/voicellmcloud
python -m venv .venv
# Windows: .venv\Scripts\activate
source .venv/bin/activate
pip install -r requirements.txt
使用 Piper 时需额外安装语音推理库(若未记入 requirements.txt):
pip install piper-tts
python -m piper.download_voice zh_CN-huayan-medium
使用 Kokoro 时:将 ONNX 与配置放到 TTS_MODEL_DIR 下约定子目录(参见 app/providers/kokoro_tts.py),并设置 TTS_VOICE_NAME 等与引擎一致。
2.2 配置(.env)
复制 docs 同级的 .env.example 为 .env,至少检查:
| 变量 | 说明 |
|---|---|
WS_HOST / WS_PORT |
HTTP/WebSocket 监听;客户端 URL 必须一致 |
BEARER_TOKEN |
与客户端 session.start.auth_token 一致 |
DASHSCOPE_API_KEY |
百炼 API Key;勿提交到版本库 |
LLM_MODEL / LLM_CONTEXT_TURNS |
模型名与历史轮数 |
TTS_PROVIDER |
kokoro 或 piper |
TTS_MODEL_DIR / TTS_VOICE_NAME |
模型路径与音色 |
MAX_CONCURRENT_SESSIONS |
并发会话上限 |
生产建议:通过密钥管理或部署平台注入环境变量,避免在镜像中硬编码 Key。
2.3 启动方式
推荐(与 .env 端口一致,且带 WS 保活):
# 在项目根目录执行
python scripts/run_server.py
scripts/run_server.py 使用 settings.WS_HOST / settings.WS_PORT,与 .env 对齐。
标准 Uvicorn(可配合 systemd / Docker CMD):
python -m uvicorn app.main:app --host 0.0.0.0 --port 8765
若需与 run_server.py 相同的 Ping/Pong,可在代码层已用 uvicorn.Config(ws_ping_interval=..., ws_ping_timeout=...) 的封装启动,或在前置代理上保持连接活跃。
开发加載:
python -m uvicorn app.main:app --host 0.0.0.0 --port 8765 --reload
2.4 健康检查与连通性
- HTTP:
GET http://<host>:<port>/health
期望 JSON 含"status":"ok"、llm_provider、tts_provider、active_sessions。 - 仅 TTS(机端播报):在既有 WebSocket 上发
tts.synthesize(见API_SPECIFICATION.md§3.3),下行tts_audio_chunk+turn.complete;与turn.text互斥排队。 - WebSocket:
ws://<host>:<口>/v1/voice/session(路径以app/config.py中WS_PATH为准)。
防火墙与安全组需放行 TCP 端口(HTTP 与 WS 同端口)。
2.5 生产部署要点
- 进程管理:systemd、supervisor 或 Kubernetes Deployment;崩溃自拉起;限制文件句柄与内存。
- TLS:公网场景在入口使用 WSS(Nginx / Caddy / 云 LB 终结 TLS),后端仍可为
ws://127.0.0.1:端口。 - 日志:当前主用 loguru stderr;可接入集中日志;注意 勿在日志中打印完整 Token 或用户隐私。
- 横向扩展:有状态会话绑定单机 WebSocket 连接;多实例时需 会话粘性 或改为共享后端架构(超出本仓库默认范围)。
- Windows 控制台:若出现日志编码问题,可设置
PYTHONUTF8=1或使用 UTF-8 终端。
2.6 客户端对接 checklist
session.start带齐session_id、client.device_id;可选client.px4(见PX4_CLIENT_CONTEXT.md)。auth_token与云端BEARER_TOKEN一致(若启用鉴权)。- 处理消息顺序:
dialog_result→llm.text_delta(可选)→tts_audio_chunk(JSON 帧 + binary PCM)→turn.complete。 - 飞控路径:
routing === "flight_intent"时解析flight_intent.actions,禁止仅用summary驱机。 - 伴飞桥扩展 Socket 时识别
return_home等与 Schema 一致的Command.command字面量。
2.7 常见问题
| 现象 | 排查 |
|---|---|
/health 不可用 |
端口错误、进程未起、防火墙拦截 |
| WebSocket 秒断 | NAT 空闲超时;启用服务端/代理 Ping-Pong;客户端勿过早 close |
| LLM 无响应或超时 | DASHSCOPE_API_KEY、网络、LLM_TIMEOUT |
| TTS 初始化失败 | TTS_PROVIDER 与模型路径、TTS_VOICE_NAME 是否匹配 |
flight_intent 总失败 |
模型输出非严格 JSON 或 hover 带非法 args;已加强 system prompt;服务端 L1–L3 会拒绝非法体 |
Windows 下打印/run_server 乱码 |
终端 UTF-8 或 PYTHONUTF8=1 |
2.8 自动化测试(可选)
仓库 test/ 下含 WebSocket 冒烟用例;运行前设置环境变量指向已启动的服务(如 VOICE_TEST_WS_URL),并安装 websockets、pytest 等依赖。具体见各测试文件头部说明。
3. 版本与维护
- 协议:Cloud Voice Protocol v1.0 (text_uplink);飞控意图 Schema version 1。
- 文档维护:协议或
flight_intent变更时,同步更新FLIGHT_INTENT_SCHEMA_v1.md、API_SPECIFICATION.md与本手册相关小节。
文档版本:2026-04-07;与当前仓库 app/ 实现及 docs 内协议描述对齐。