1. 打包流程

这个项目使用 ESP32 的 memory-mapped assets 机制来打包资源文件。主要涉及以下脚本:

主要打包脚本:

  • scripts/spiffs_assets/build.py - 主打包脚本
  • scripts/spiffs_assets/spiffs_assets_gen.py - 底层打包工具
  • scripts/build_default_assets.py - 根据 sdkconfig 自动构建资源

打包步骤:

1. 收集资源文件到 build/assets/ 目录

2. 生成 index.json(描述资源清单)

3. 打包成 assets.bin

  1. Assets.bin 包含的内容

根据代码分析,assets.bin 可以包含以下资源:

a) 语音识别模型 (srmodels.bin)

  • 唤醒词模型 (wakenet_model) - 例如 “你好小智”
  • 多网络模型 (multinet_model) - 用于语音命令识别
  • 位置:从 managed_components/espressif__esp-sr/model/ 打包而来

b) 字体文件

  • 文本字体 (text_font) - .bin 格式
  • 例如:font_puhui_common_20_4.bin
  • 位置:从 managed_components/78__xiaozhi-fonts/cbin/ 目录

c) 表情/图标集合

  • emoji_collection - 表情动画文件(.eaf, .bin, .png 格式)
  • icon_collection - 图标文件
  • 位置:从配置的表情目录,例如 emote 动画文件

d) 布局配置

  • layout.json - 屏幕元素布局配置
  • 包含位置、对齐方式、尺寸等信息

e) 索引文件

  • index.json - 资源清单文件
    • 版本号
    • 各资源文件名映射
    • 配置信息
  1. Assets.bin 二进制格式

根据 assets.cc:44-101 和 spiffs_assets_gen.py,二进制格式如下:

[Header - 12 bytes]
+0x00: uint32_t - 文件数量
+0x04: uint32_t - 校验和 (16-bit checksum)
+0x08: uint32_t - 数据长度

[File Table]
每个文件条目 (44 bytes):
+0x00: char[32] - 文件名 (固定32字节)
+0x20: uint32_t - 文件大小
+0x24: uint32_t - 文件偏移
+0x28: uint16_t - 宽度 (如果是图片)
+0x2A: uint16_t - 高度 (如果是图片)

[File Data]
每个文件数据:
0x5A 0x5A (magic header)

  1. 运行时加载流程 (assets.cc)

  2. InitializePartition() - 查找 “assets” 分区

  3. esp_partition_mmap() - 内存映射整个分区

  4. 验证校验和

  5. 解析文件表,建立文件名到偏移的映射

  6. Apply() - 应用资源:

    • 加载语音模型
    • 设置字体
    • 加载表情集合
    • 应用布局配置
  7. 如何手动打包

以下是手动打包命令示例:

cd /data/moyo_2.0.3/scripts/spiffs_assets

方法1: 使用 build.py

python3 build.py
–wakenet_model …/…/managed_components/espressif__esp-sr/model/wakenet_model/wn9_nihaoxiaozhi
–text_font …/…/managed_components/78__xiaozhi-fonts/cbin/font_puhui_common_20_4.bin
–res_path <emote资源路径>
–target_board <板子配置路径>

方法2: 使用 build_default_assets.py (自动从sdkconfig读取)

python3 …/build_default_assets.py
–sdkconfig …/…/sdkconfig
–builtin_text_font font_puhui_basic_16_4
–emoji_collection emojis_64
–output build/assets.bin

生成的 assets.bin 将包含所有打包的资源,需要烧录到 ESP32 的 “assets” 分区。

  1. 当前项目包含的资源

根据选择(index.json line 106),这个项目的 assets.bin 至少包含:

  • index.json - 资源索引
  • 可能还有字体、表情、语音模型等(取决于构建配置)
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐