月度存档: 4月 2025

小智 AI 通信协议补漏,通过OTA接口注册设备

上周整理了一下小智 AI 的 WebSocket 通信协议,《复刻小智AI第2步,2张核心流程图学习一下它的WebSocket协议》,后面在调试时发现了一个缺失的点,就是漏掉注册设备这一步。

一开始还对配置文件中的 "OTA_VERSION_URL": "https://api.tenclass.net/xiaozhi/ota/", 字段比较费解,好像整个通信过程中也没有用到的地方,而且在 py-xiaozhi 中也不存在固件的概念。

另外因为跑示例的时候,用的 Client-IdDevice-Id 都是从仓库中直接拿的,应该是已经在服务器已经注册过了,只需要额外添加设备即可,所以一直没发现这个问题。

后来在手动修改 Device-Id 的时候终于发现了,仔细研究了一下 xiaozhi-esp32py-xiaozhi,再自己操作了一下,总算搞明白了。

问题

如果在设备启动时,不经过设备注册过程,那么在开始对话之后,服务端会返回没找到设备版本信息的语音,而不是在后台添加设备。

2025-04-21 14:51:23,295 - WebSocketClient - INFO - 收到JSON消息: {"type":"tts","state":"sentence_start","text":"没有找到该设备的版本信息,请正确配置 OTA 地址,然后重新编译固件。","session_id":"14328015"}

这个时候,不管怎么对话,服务端都只会返回这一句。

py-xiaozhixiaozhi-esp32 项目中,都是会在启动阶段进行 OTA 固件版本检查,因此我们也需要在加载配置时,先进行 OTA 版本检查这一步,同时完成设备注册。

注册设备

注册设备也很简单,构建一个固件信息的 …

阅读全文 »

复刻小智AI第2步,2张核心流程图学习一下它的WebSocket协议

前言

继续尝试复刻小智 AI,但是是基于 Arduino 框架。

上周把 VSCode + PlatformIO + Arduino 进行 ESP32-S3 + ESP-SR + ESP-TTS 的开发环境折腾完了,主要的语音唤醒、命令识别、文本转语音功能都跑通了,后面可以开始对接小智 AI 服务端的 WebSocket 协议了。

不过原作者的 78/xiaozhi-esp32 项目稍微复杂一点,阅读起来不太方便,而且也不太想搞 IDF 编译环境,就想找看有没有其他平台的实现,然后还真找到了一个 huangjunsen0406/py-xiaozhi 项目,是 Python + PyTk 编写的带界面的桌面客户端,而且它支持手动对话以及自动对话模式切换,可以顺便学习一下 PC 上的轻量级语音识别。

通信过程

小智 AI 客户端与服务端,可以使用 WebSocket 或者 MQTT 协议,这里为了方便就直接用 WebSocket 协议来学习了。

协议概述

在小智 AI 的通信过程中,WebSocket 用于实现客户端和服务器之间的实时、双向通信。主要传输以下类型的数据:…

阅读全文 »

复刻小智AI,ESP32-S3搭建Arduino+ESP-SR+ESP-TTS开发环境踩坑记录

最近 B 站上赛博小狗和小智 AI 都很火,我也想复刻一个,最好能把两者结合一下,研究了一下,发现作者们的开源方案有些地方不太符合我的习惯,准备改造一番,然后就走上了踩坑之旅。

缘由

赛博小狗这个开源项目,作者使用了现成的语音识别模块和文本转语音模块,这两个模拟贵且不说,在使用上也不太灵活,而且主控也是使用的 STM32,这个如果要想改造结合小智 AI,开发起来也比较麻烦。

然后就想到了乐鑫 ESP32 是已经自带了语音唤醒、语音识别、文本转语音能力的,那干嘛不直接用一个 MCU 来实现外部模块的功能,成本就要低上很多了,而且小智 AI 本身也是基于 ESP32 去做的,结合起来就更方便了。

再研究了一下小智 AI 的开源硬件端项目,发现是基于 ESP-IDF 开发的,这就叫人头大了,虽然原厂的 ESP-IDF 相比 Arduino 框架更强大,配置更灵活,但是从开发便捷性上来说,我还是更喜欢使用 Arduino 框架。

为了把这一堆东西都改成自己喜欢的样子,就开始了踩坑之旅。

开发环境

虽然在玩 ESP32 时一直用的 Arduino 框架,但是我并没有使用 Arduino IDE,而是使用的 Visual Studio Code + PlatformIO 插件。Ardunio IDE 的编辑器太古老了,缺少很多有用的功能,像代码提示、自动补全、符号跳转等功能都是缺失的。

而 Visual Studio Code …

阅读全文 »