ESP32智能语音设备WebSocket通信协议详解
xiaozhi-esp32 Build your own AI friend 项目地址: https://gitcode.com/gh_mirrors/xia/xiaozhi-esp32
引言
在现代物联网和智能语音交互系统中,WebSocket协议因其全双工通信特性而成为实时数据传输的理想选择。本文将深入解析78/xiaozhi-esp32项目中使用的WebSocket通信协议,帮助开发者理解设备与服务器之间的交互机制。
协议概述
78/xiaozhi-esp32项目中的WebSocket协议主要用于实现以下功能:
- 语音数据的实时传输
- 设备状态同步
- 物联网指令控制
- 语音交互状态管理
通信流程详解
1. 连接建立阶段
设备端初始化流程:
- 硬件初始化(音频编解码器、显示屏、LED等)
- 网络连接建立
- WebSocket协议实例创建
- 主循环进入等待状态
连接建立关键步骤:
- 通过
OpenAudioChannel()
发起连接 - 设置必要的请求头信息:
- Authorization: Bearer令牌
- Protocol-Version: 协议版本
- Device-Id: 设备MAC地址
- Client-Id: 设备唯一标识
2. 握手协议
客户端发送的Hello消息示例:
{
"type": "hello",
"version": 1,
"transport": "websocket",
"audio_params": {
"format": "opus",
"sample_rate": 16000,
"channels": 1,
"frame_duration": 60
}
}
服务器响应要求:
- 必须包含"type":"hello"和"transport":"websocket"
- 可协商音频参数
- 超时时间为10秒
3. 消息类型解析
客户端到服务器消息
- Listen消息 - 控制录音状态
{
"session_id": "xxx",
"type": "listen",
"state": "start",
"mode": "manual"
}
- Abort消息 - 中断当前操作
{
"session_id": "xxx",
"type": "abort",
"reason": "wake_word_detected"
}
- IoT消息 - 设备状态上报
{
"session_id": "xxx",
"type": "iot",
"states": {
"temperature": 25.5,
"humidity": 60
}
}
服务器到客户端消息
- STT消息 - 语音识别结果
{
"type": "stt",
"text": "打开客厅的灯"
}
- TTS消息 - 语音合成控制
{
"type": "tts",
"state": "start"
}
- IoT指令 - 设备控制
{
"type": "iot",
"commands": [
{
"device": "living_room_light",
"action": "turn_on"
}
]
}
4. 音频数据传输
音频编解码规范:
- 编码格式:Opus
- 采样率:16000Hz
- 声道数:单声道
- 帧时长:60ms(可配置)
数据传输方式:
- 客户端录音数据:麦克风→Opus编码→WebSocket二进制帧
- 服务器TTS数据:WebSocket二进制帧→Opus解码→扬声器
状态机设计
设备主要状态及转换条件:
-
Idle状态
- 初始状态
- 可转换为Connecting状态(用户触发/唤醒)
-
Connecting状态
- 建立WebSocket连接
- 成功→Listening状态
- 失败→Idle状态(带错误提示)
-
Listening状态
- 持续发送录音数据
- 收到TTS开始→Speaking状态
- 用户取消→Idle状态
-
Speaking状态
- 播放接收到的音频
- TTS结束→Idle/Listening状态
- 异常中断→Idle状态
错误处理机制
-
连接错误
- 握手超时(10秒)
- 网络不可达
- 鉴权失败
-
通信错误
- WebSocket异常断开
- 消息解析失败
- 音频解码错误
-
恢复策略
- 自动重试机制
- 错误状态提示
- 安全回退到Idle状态
协议扩展建议
-
QoS保障
- 可考虑增加消息序列号
- 实现消息确认机制
-
性能优化
- 动态调整音频帧大小
- 带宽自适应编码
-
安全增强
- 定期更新Bearer令牌
- 敏感数据加密
实际应用示例
典型语音交互流程:
- 设备唤醒,建立WebSocket连接
- 发送Listen消息开始录音
- 传输语音数据(二进制帧)
- 接收STT消息(语音识别结果)
- 接收TTS消息和音频数据
- 播放语音响应
- 返回Idle状态
开发注意事项
-
资源管理
- WebSocket连接需要及时释放
- 音频编解码器资源竞争处理
-
时序控制
- 状态转换的线程安全
- 消息处理的顺序保证
-
兼容性考虑
- 协议版本协商
- 可选字段处理
总结
78/xiaozhi-esp32项目的WebSocket协议设计具有以下特点:
- 简洁的JSON消息格式
- 高效的二进制音频传输
- 明确的状态机设计
- 完善的错误处理机制
开发者可根据实际需求,在此协议基础上进行功能扩展和性能优化,构建更强大的智能语音交互系统。
xiaozhi-esp32 Build your own AI friend 项目地址: https://gitcode.com/gh_mirrors/xia/xiaozhi-esp32
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考