# 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`:云端结果映射为 Socket `Command`(含已对齐的 **`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 级) ```bash cd /path/to/voicellmcloud python -m venv .venv # Windows: .venv\Scripts\activate source .venv/bin/activate pip install -r requirements.txt ``` 使用 **Piper** 时需额外安装语音推理库(若未记入 `requirements.txt`): ```bash 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 保活)**: ```bash # 在项目根目录执行 python scripts/run_server.py ``` `scripts/run_server.py` 使用 **`settings.WS_HOST` / `settings.WS_PORT`**,与 `.env` 对齐。 **标准 Uvicorn(可配合 systemd / Docker CMD)**: ```bash 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=...)` 的封装启动,或在前置代理上保持连接活跃。 **开发加載**: ```bash python -m uvicorn app.main:app --host 0.0.0.0 --port 8765 --reload ``` ### 2.4 健康检查与连通性 - **HTTP**:`GET http://:/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://:<口>/v1/voice/session`(路径以 `app/config.py` 中 `WS_PATH` 为准)。 防火墙与安全组需放行 **TCP 端口**(HTTP 与 WS 同端口)。 ### 2.5 生产部署要点 1. **进程管理**:systemd、supervisor 或 Kubernetes Deployment;崩溃自拉起;限制文件句柄与内存。 2. **TLS**:公网场景在入口使用 **WSS**(Nginx / Caddy / 云 LB 终结 TLS),后端仍可为 `ws://127.0.0.1:端口`。 3. **日志**:当前主用 **loguru** stderr;可接入集中日志;注意 **勿**在日志中打印完整 Token 或用户隐私。 4. **横向扩展**:有状态会话绑定单机 WebSocket 连接;多实例时需 **会话粘性** 或改为共享后端架构(超出本仓库默认范围)。 5. **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` 内协议描述对齐。