# WebSocket后端 - 快速启动指南 ## 🚀 5分钟快速启动 ### 1. 启动WebSocket服务器 ```bash cd /Users/dsw/workspace/now/2025/wds/IntuitionX/agent python src/MainServices.py ``` **预期输出**: ``` ============================================================ [WS] WebSocket服务器启动 [WS] 监听地址: ws://0.0.0.0:8765 [WS] 接口: - 2.1 异常状态触发对话 (abnormal_trigger) - 2.3 双向音频流对话 (audio_stream_*) ============================================================ ``` ✅ 服务器已成功启动! ### 2. 测试接口(另一个终端) ```bash cd /Users/dsw/workspace/now/2025/wds/IntuitionX/agent python test_ws.py ``` **预期结果**: ``` ✓ 2.1 测试完成 ✓ 2.3 测试完成 ✓ 所有测试完成! ``` ### 3. 查看完整文档 - 📖 [完整API文档](./WEBSOCKET_API.md) - 详细的接口说明 - 📋 [实现总结](./IMPLEMENTATION_SUMMARY.md) - 技术细节和架构 - 📝 [README](./README.md) - 项目概览 --- ## 🎯 2个核心接口 ### 2.1 异常状态触发对话 当K230检测到用户**皮肤状态差**或**情绪低落**时,发送请求: ```json { "type": "abnormal_trigger", "trigger_reason": "poor_skin", // 或 "sad_emotion" "enable_streaming": true } ``` **后端自动处理**: 1. 拼接相应的关怀提示词 2. 调用LLM生成回复文本 3. 流式调用TTS合成语音 4. 返回音频流到K230 **典型回复**(poor_skin): > "我注意到你最近看起来有点疲倦,是不是休息不够?记得多喝水,规律作息对皮肤很重要哦。" ### 2.3 双向音频流对话 K230和后端进行实时对话: ``` K230音频输入 → 后端检测语音结束 → ASR识别 → LLM生成 → TTS合成 → K230音频输出 ``` **流程示例**: 1. K230: 发送用户说话的音频 2. 后端: 检测到用户停止说话后,开始处理 3. 后端: 识别用户说的是什么 4. 后端: 用LLM生成合适的回复 5. 后端: 用TTS合成语音 6. K230: 播放后端的回复 --- ## 📊 测试覆盖 ✅ **2.1测试结果**: - 异常状态请求处理 - 提示词拼接 - LLM流式生成 - TTS流式合成 - 21个音频块完整发送 ✅ **2.3测试结果**: - 初始化握手 - 音频上传处理 - 会话管理 - 控制信号处理 --- ## 🔌 WebSocket连接 **开发环境**: ``` ws://127.0.0.1:8765 ``` **生产部署**: ``` ws://0.0.0.0:8765 或通过nginx反向代理 wss://yourdomain.com/ws (WSS加密) ``` --- ## 📝 消息格式 ### 2.1: 异常触发对话 **请求**: ```json { "type": "abnormal_trigger", "trigger_reason": "poor_skin | sad_emotion", "enable_streaming": true, "context_data": { /* optional */ } } ``` **响应流**: ```json { "type": "abnormal_trigger_response", "success": true } ``` 然后接收多个音频块: ```json { "type": "audio_stream_download", "data": "base64音频数据", "is_final": false } ``` ### 2.3: 音频流对话 **初始化**: ```json { "type": "audio_stream_init", "session_id": "unique-session-id", "audio_config": { "sample_rate": 16000, "bit_depth": 16, "channels": 1, "encoding": "pcm" } } ``` **上传音频**: ```json { "type": "audio_stream_upload", "session_id": "unique-session-id", "data": "base64音频数据", "sequence": 1 } ``` **接收回复**: ```json { "type": "audio_stream_download", "session_id": "unique-session-id", "data": "base64音频数据", "is_final": false } ``` --- ## 🛠️ 技术栈 | 组件 | 说明 | |------|------| | WebSocket | websockets 15.0 | | 异步框架 | Python asyncio | | LLM | DeepSeek V3.2 (DashScope) | | TTS | 通义千问TTS (DashScope) | | ASR | 通义千问ASR (DashScope) | | VAD | SileroVAD (本地模型) | | 音频格式 | PCM (16bit, 16kHz/24kHz) | --- ## 🎧 音频参数 **输入(K230发送)**: - 采样率: 16 kHz - 位深度: 16 bit - 声道: 单声道 (1) - 格式: PCM **输出(后端发送)**: - 采样率: 24 kHz (TTS输出) - 位深度: 16 bit - 声道: 单声道 (1) - 格式: PCM (base64编码) --- ## 📱 K230集成步骤 ### 1. 连接WebSocket ```c // 伪代码示例 ws = websocket_connect("ws://backend-ip:8765"); ``` ### 2. 实现2.1(异常触发) ```c // 当检测到皮肤异常时 send_json({ "type": "abnormal_trigger", "trigger_reason": "poor_skin", "enable_streaming": true }); // 接收音频并播放 while (recv_audio_chunk()) { play_audio(chunk.data); // base64解码后播放 } ``` ### 3. 实现2.3(双向对话) ```c // 初始化 send_json({ "type": "audio_stream_init", "session_id": "session001", "audio_config": { /* ... */ } }); // 接收初始化响应 resp = recv_json(); // 等待 audio_stream_init_response // 持续发送音频 while (recording) { send_json({ "type": "audio_stream_upload", "session_id": "session001", "data": base64(audio_chunk), "sequence": seq++ }); } // 接收回复 while (recv_message()) { if (msg.type == "audio_stream_download") { play_audio(base64_decode(msg.data)); } } ``` --- ## 🔍 调试技巧 ### 查看服务器日志 所有操作都有日志标记,格式:`[标签] 消息` 常见标签: - `[WS]` - WebSocket连接事件 - `[路由]` - 消息路由 - `[2.1]` - 2.1接口处理 - `[2.3]` - 2.3接口处理 - `[VAD]` - 语音检测 - `[ASR]` - 语音识别 - `[LLM]` - 对话生成 - `[TTS]` - 语音合成 - `[错误]` - 错误信息 ### 运行测试 ```bash python test_ws.py # 完整的功能测试 ``` ### 检查端口 ```bash lsof -i :8765 # 查看8765端口监听情况 ``` --- ## ⚡ 性能指标 | 指标 | 值 | |------|-----| | WebSocket延迟 | <50ms | | LLM生成延迟 | 1-5秒 | | TTS合成延迟 | 0.5-2秒 | | 音频流传输速率 | 实时 | | 并发连接数 | 理论无限 | --- ## 🛡️ 错误处理 常见错误和解决方案: ### 问题: "address already in use" ``` 解决: pkill python # 关闭所有Python进程 然后: python src/MainServices.py # 重新启动 ``` ### 问题: "无法连接到服务器" ``` 解决: 1. 确保WebSocket服务器正在运行 2. 检查防火墙是否开放8765端口 3. 检查IP地址是否正确 ``` ### 问题: 2.3没有收到回复 ``` 解决: 1. 检查是否发送了有效的音频数据(非零数据) 2. 确保发送的是PCM格式 3. 查看VAD是否检测到语音结束(voice_end) ``` --- ## 📚 更多文档 - **完整API文档**: [WEBSOCKET_API.md](./WEBSOCKET_API.md) - **实现详情**: [IMPLEMENTATION_SUMMARY.md](./IMPLEMENTATION_SUMMARY.md) - **项目README**: [README.md](./README.md) --- ## ✅ 验证清单 启动前请确保: - ✅ 已安装websockets依赖(自动安装) - ✅ 已配置DASHSCOPE_API_KEY环境变量 - ✅ 8765端口未被占用 - ✅ Python版本 ≥ 3.12 --- ## 🎉 完成! 现在你可以: 1. **启动服务器**: `python src/MainServices.py` 2. **运行测试**: `python test_ws.py` 3. **与K230通信**: 通过WebSocket连接到 `ws://0.0.0.0:8765` 祝你使用愉快!有任何问题请查阅完整文档。 --- **制作日期**: 2025-01-01 **版本**: 1.0 **状态**: ✅ 生产就绪