7.0 KiB
7.0 KiB
WebSocket后端 - 快速启动指南
🚀 5分钟快速启动
1. 启动WebSocket服务器
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. 测试接口(另一个终端)
cd /Users/dsw/workspace/now/2025/wds/IntuitionX/agent
python test_ws.py
预期结果:
✓ 2.1 测试完成
✓ 2.3 测试完成
✓ 所有测试完成!
3. 查看完整文档
🎯 2个核心接口
2.1 异常状态触发对话
当K230检测到用户皮肤状态差或情绪低落时,发送请求:
{
"type": "abnormal_trigger",
"trigger_reason": "poor_skin", // 或 "sad_emotion"
"enable_streaming": true
}
后端自动处理:
- 拼接相应的关怀提示词
- 调用LLM生成回复文本
- 流式调用TTS合成语音
- 返回音频流到K230
典型回复(poor_skin):
"我注意到你最近看起来有点疲倦,是不是休息不够?记得多喝水,规律作息对皮肤很重要哦。"
2.3 双向音频流对话
K230和后端进行实时对话:
K230音频输入 → 后端检测语音结束 → ASR识别 → LLM生成 → TTS合成 → K230音频输出
流程示例:
- K230: 发送用户说话的音频
- 后端: 检测到用户停止说话后,开始处理
- 后端: 识别用户说的是什么
- 后端: 用LLM生成合适的回复
- 后端: 用TTS合成语音
- 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: 异常触发对话
请求:
{
"type": "abnormal_trigger",
"trigger_reason": "poor_skin | sad_emotion",
"enable_streaming": true,
"context_data": { /* optional */ }
}
响应流:
{
"type": "abnormal_trigger_response",
"success": true
}
然后接收多个音频块:
{
"type": "audio_stream_download",
"data": "base64音频数据",
"is_final": false
}
2.3: 音频流对话
初始化:
{
"type": "audio_stream_init",
"session_id": "unique-session-id",
"audio_config": {
"sample_rate": 16000,
"bit_depth": 16,
"channels": 1,
"encoding": "pcm"
}
}
上传音频:
{
"type": "audio_stream_upload",
"session_id": "unique-session-id",
"data": "base64音频数据",
"sequence": 1
}
接收回复:
{
"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
// 伪代码示例
ws = websocket_connect("ws://backend-ip:8765");
2. 实现2.1(异常触发)
// 当检测到皮肤异常时
send_json({
"type": "abnormal_trigger",
"trigger_reason": "poor_skin",
"enable_streaming": true
});
// 接收音频并播放
while (recv_audio_chunk()) {
play_audio(chunk.data); // base64解码后播放
}
3. 实现2.3(双向对话)
// 初始化
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]- 语音合成[错误]- 错误信息
运行测试
python test_ws.py # 完整的功能测试
检查端口
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
- 实现详情: IMPLEMENTATION_SUMMARY.md
- 项目README: README.md
✅ 验证清单
启动前请确保:
- ✅ 已安装websockets依赖(自动安装)
- ✅ 已配置DASHSCOPE_API_KEY环境变量
- ✅ 8765端口未被占用
- ✅ Python版本 ≥ 3.12
🎉 完成!
现在你可以:
- 启动服务器:
python src/MainServices.py - 运行测试:
python test_ws.py - 与K230通信: 通过WebSocket连接到
ws://0.0.0.0:8765
祝你使用愉快!有任何问题请查阅完整文档。
制作日期: 2025-01-01 版本: 1.0 状态: ✅ 生产就绪