招商网站建设大概多少钱,网页游戏排行榜前十名知乎,门户网站建设评标办法,怎样网上销售自己的产品小智AI 从 v2.0.x 版本开始#xff0c;支持用户自定义唤醒词表情包背景图#xff1a; 实现效果如下#xff1a; 有朋友好奇#xff1a;如何实现的#xff1f;
本文#xff0c;将尝试拆解这部分的基本原理和实现思路。
1. 设备端
首先#xff0c;我们要了解 ESP32 芯片…小智AI 从v2.0.x版本开始支持用户自定义唤醒词表情包背景图实现效果如下有朋友好奇如何实现的本文将尝试拆解这部分的基本原理和实现思路。1. 设备端首先我们要了解 ESP32 芯片中的数据是如何存储的已了解的朋友可跳过。以常见的ESP32s3-N16R8为例这里的N16R8分别代表啥1.1 ESP32中的存储按照是否在芯片上存储分两种1. 片上存储器On-chip Memory内部ROM384KB存储启动代码和关键的系统函数内部SRAM512KB用于运行时变量、堆栈等访问速度快断电后数据丢失RTC存储器16KB8KB快速存储器8KB慢速存储器可以理解为计算机的内存。2. 片外存储器Off-chip MemoryFlash存储器容量通常为8MB或16MB用于存储程序代码、常量数据和文件系统PSRAM可选伪静态随机存储器用于扩展运行时内存通过SPI接口连接可以理解为计算机的硬盘、虚拟内存。N16R8就代表 16M 的 Flash 和 8M 的 PSRAM。硬盘空间有限为了充分利用有了分区的概念。1.2 Flash中的分区以ESP32s3的 16M 为例它的分区表如下# Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x4000, otadata, data, ota, 0xd000, 0x2000, phy_init, data, phy, 0xf000, 0x1000, ota_0, app, ota_0, 0x20000, 0x3f0000, ota_1, app, ota_1, , 0x3f0000, assets, data, spiffs, 0x800000, 8M上表中Offset代表分区的起点Size代表分区的大小。那为啥nvs是从0x9000开始呢因为0x1000-0x9000另有他用Bootloader0x1000-0x8000存储启动引导程序分区表0x8000-0x9000描述Flash中各分区的信息这些分区分别是干啥呢NVS分区0x9000开始16KB存储配置参数和键值对数据OTA数据分区0xd000开始8KB存储OTA更新相关的元数据PHY初始化数据0xf000开始4KB存储射频校准数据OTA固件分区两个约3.9MB存储主应用程序代码支持固件更新和回滚Assets分区8MB存储资源文件图片、音频、字体等上述分区有哪些优势充分利用 Flash 的所有空间ota_0 和 ota_1 交替使用当前分区处于活动状态另一分区接收新固件分区分工明确OTA固件分区和Assets分区独立更新互不干扰而用来自定义唤醒词表情包背景图的正是这里的Assets分区。问题来了Assets分区里放的啥设备端又如何接收更新呢下面来看服务端要做哪些工作。2. 服务端2.1 前端交互页面前端代码已开源https://github.com/78/xiaozhi-assets-generator首先服务端会读取的设备系统信息然后用户可以自定义的选项如下唤醒词内置 esp32 官方训好的唤醒词字体表情背景图最后前端否则把上述文件打包成assets.bin:这个assets.bin就是塞进Assets分区的文件。问题来了放在你浏览器中的assets.bin如何送到设备中去的2.2 后端处理逻辑先看流程图具体执行步骤如下:step 1前端和后端保持 websocket 长连接将assets.bin发送到后端服务器生成一个urlstep 2通过callMcpTool实现工具调用本质是给后端发 POST 请求。step 2.1调用self.assets.set_download_url把url送给设备端。云端调用该工具后设备端会将url保存到设置中。AddUserOnlyTool(self.assets.set_download_url, Set the download url for the assets, PropertyList({ Property(url, kPropertyTypeString) }), [](const PropertyList properties) - ReturnValue { auto url properties[url].valuestd::string(); Settings settings(assets, true); settings.SetString(download_url, url); return true; });step 2.2调用self.reboot设备重启。step 2.3设备重启后根据url下载assets.bin到Assets分区。自此设备端更新生效。问题来了上述工具调用不都是 MCPTool 吗而要实现tool/call底层还得通过MQTT所以前端给后端发了 POST 请求后后端是给MQTT broker的 topic 发了这条指令最终这条指令被设备端执行。写在最后本文分享了小智AI: 自定义唤醒词表情包背景图的基本原理和实现思路。篇幅有限关于MQTT MCP实现设备远程控制的原理我们下篇见。如果对你有帮助不妨点赞收藏备用。小智Pro下一版本更新也将支持设备远程控制有任何想法欢迎来聊https://ai.feishu.cn/wiki/IfTawES0mi0YTqk8GQ4cw4qOnD3