382 lines
7.0 KiB
Markdown
382 lines
7.0 KiB
Markdown
|
|
# 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
|
|||
|
|
**状态**: ✅ 生产就绪
|