Skip to content

Conversation

espressif2022
Copy link
Contributor

Add new face for EchoEar

企业微信截图_17540394971770

@78
Copy link
Owner

78 commented Aug 1, 2025

素材文件可以放在独立 component 加载?

@espressif2022
Copy link
Contributor Author

素材文件可以放在独立 component 加载?

可以的这样不占仓库空间,我调整下

@78
Copy link
Owner

78 commented Aug 1, 2025

main/boards/echoear/mmap_generate_emoji.h 这个自动生成的文件有必要提交上来吗?可以在 board 目录下写个 .gitignore 把它排除掉。

@espressif2022
Copy link
Contributor Author

main/boards/echoear/mmap_generate_emoji.h 这个自动生成的文件有必要提交上来吗?可以在 board 目录下写个 .gitignore 把它排除掉。

处理完了

@78 78 merged commit cd23e0f into 78:main Aug 1, 2025
1 check passed
@wenmou9
Copy link

wenmou9 commented Aug 11, 2025

你好 我请问下,我想自己制作表情,使用那个表情转换的脚本,会显示格式错误,我比对了一下,目前您提供的文件格式和我的有很大区别,能否提供下思路,非常急,谢谢了,如果需要付费指导,也可以接受

@espressif2022
Copy link
Contributor Author

你好 我请问下,我想自己制作表情,使用那个表情转换的脚本,会显示格式错误,我比对了一下,目前您提供的文件格式和我的有很大区别,能否提供下思路,非常急,谢谢了,如果需要付费指导,也可以接受

最新的转换脚本未释放,我们已经做了一个 PC 上位机工具,这几天会释放,到时及时通知你

@wenmou9
Copy link

wenmou9 commented Aug 13, 2025

OK 谢谢

@chrishan2025
Copy link

你好 我请问下,我想自己制作表情,使用那个表情转换的脚本,会显示格式错误,我比对了一下,目前您提供的文件格式和我的有很大区别,能否提供下思路,非常急,谢谢了,如果需要付费指导,也可以接受

最新的转换脚本未释放,我们已经做了一个 PC 上位机工具,这几天会释放,到时及时通知你

这个工具出来了吗

GreenYi pushed a commit to GreenYi/xiaozhi-esp32 that referenced this pull request Aug 19, 2025
* feat: add emote_gfx UI for EchoEar

* feat: delete local assets
@MIKEDOG369
Copy link

@espressif2022 pc那个gif转换的上位机在哪里下载

@SunJINM
Copy link

SunJINM commented Aug 22, 2025

@espressif2022 求格式转换的上位机

@wenmou9
Copy link

wenmou9 commented Aug 29, 2025

有偿求这个转换工具 看到留个联系谢谢

@chrishan2025
Copy link

@espressif2022 @78 这个工具或者脚本出来了?现在是要付费才提供吗,什么情况了

@espressif2022
Copy link
Contributor Author

@espressif2022 @78 这个工具或者脚本出来了?现在是要付费才提供吗,什么情况了

本周会释放,都已经准备好了。xiaozhi 这我会再更新一个 PR, 适配多个板子,到时同步上位机链接

@78
Copy link
Owner

78 commented Sep 4, 2025

@espressif2022 @78 这个工具或者脚本出来了?现在是要付费才提供吗,什么情况了

本周会释放,都已经准备好了。xiaozhi 这我会再更新一个 PR, 适配多个板子,到时同步上位机链接

@espressif2022 我这边也会合并 2.0 版本到 main 分支,因为 2.0 与之前版本的分区表不兼容,可否直接适配到新版本。

# Version 2 Partition Table 点击展开

This version introduces significant improvements over v1 by adding an assets partition to support network-loadable content and optimizing partition layouts for different flash sizes.

## Key Changes from v1

Major Improvements

  1. Added Assets Partition: New assets partition for network-loadable content
  2. Replaced Model Partition: The old model partition (960KB) is replaced with a larger assets partition
  3. Optimized App Partitions: Reduced application partition sizes to accommodate assets
  4. Enhanced Flexibility: Support for dynamic content updates without reflashing

Assets Partition Features

The assets partition stores:

  • Wake word models: Customizable wake word models that can be loaded from the network
  • Theme files: Complete theming system including:
    • Fonts (text and icon fonts)
    • Audio effects and sound files
    • Background images and UI elements
    • Custom emoji packs
    • Language configuration files
  • Dynamic Content: All content can be updated over-the-air via HTTP downloads

Partition Layout Comparison

v1 Layout (16MB)

  • nvs: 16KB (non-volatile storage)
  • otadata: 8KB (OTA data)
  • phy_init: 4KB (PHY initialization data)
  • model: 960KB (model storage - fixed content)
  • ota_0: 6MB (application partition 0)
  • ota_1: 6MB (application partition 1)

v2 Layout (16MB)

  • nvs: 16KB (non-volatile storage)
  • otadata: 8KB (OTA data)
  • phy_init: 4KB (PHY initialization data)
  • ota_0: 4MB (application partition 0)
  • ota_1: 4MB (application partition 1)
  • assets: 8MB (network-loadable assets)

Available Configurations

8MB Flash Devices (8m.csv)

  • nvs: 16KB
  • otadata: 8KB
  • phy_init: 4KB
  • ota_0: 3MB
  • ota_1: 3MB
  • assets: 2MB

16MB Flash Devices (16m.csv) - Standard

  • nvs: 16KB
  • otadata: 8KB
  • phy_init: 4KB
  • ota_0: 4MB
  • ota_1: 4MB
  • assets: 8MB

16MB Flash Devices (16m_c3.csv) - ESP32-C3 Optimized

  • nvs: 16KB
  • otadata: 8KB
  • phy_init: 4KB
  • ota_0: 4MB
  • ota_1: 4MB
  • assets: 4MB (4000K - limited by available mmap pages)

32MB Flash Devices (32m.csv)

  • nvsfactory: 200KB
  • nvs: 840KB
  • otadata: 8KB
  • phy_init: 4KB
  • ota_0: 4MB
  • ota_1: 4MB
  • assets: 16MB

Benefits

  1. Dynamic Content Management: Users can download and update wake word models, themes, and other assets without reflashing the device
  2. Reduced App Size: Application partitions are optimized, allowing more space for dynamic content
  3. Enhanced Customization: Support for custom themes, wake words, and language packs enhances user experience
  4. Network Flexibility: Assets can be updated independently of the main application firmware
  5. Better Resource Utilization: Efficient use of flash memory with configurable asset storage
  6. OTA Asset Updates: Assets can be updated over-the-air via HTTP downloads

Assets 分区读取程序
https://github.com/78/xiaozhi-esp32/blob/e2b4defc313848a991267e4e088eca8b42bfc4d8/main/assets.h

可以使用 scripts/spiffs_assets/build.py 脚本 打包生成 assets.bin

是否可以参考 LVGL 的 GIF decoder,写一个 AAF 的 decoder 与 LVGL 结合,使得之前的 UI 也可以使用 AAF 格式的动态表情。

会支持无需烧录固件来升级 assets 分区内容。

@espressif2022
Copy link
Contributor Author

可否直接适配到新版本

  • 这太好了,前两天准备新增几个 basic 字库,也发现新字体支持生成 bin 了。预计啥时候会释放?

AAF 的 decoder 与 LVGL 结合

  • 做一个 lvgl decoder 库, 可以的

@espressif2022
Copy link
Contributor Author

The convert tool is here.

@78
Copy link
Owner

78 commented Sep 4, 2025

可否直接适配到新版本

  • 这太好了,前两天准备新增几个 basic 字库,也发现新字体支持生成 bin 了。预计啥时候会释放?

AAF 的 decoder 与 LVGL 结合

  • 做一个 lvgl decoder 库, 可以的

已经把 v2 分支合并到 main,esp-hi和echoear还在使用旧的分区表。

目前 assets 分区,可以通过 esptool.py write_flash 0x800000 assets.bin 来写入。开机连接网络时,会检查 NVS 的 assets/download_url 如果存在,则从这里下载新的资源到 assets 分区然后应用。

xiaozhi.me 和开源版本的server后面会支持通过MCP调用(目前已支持对AI不可见的 UserOnly MCP Tool),配置这个 download_url 来给设备更新主题。

@wenmou9
Copy link

wenmou9 commented Sep 8, 2025

已经修改了源码 更换了自己的表情验证成功了,但是在构建时报字库错误,说要打开freetype宏定义,我在menuconfig里面打开了 但是仍然报错,不清楚是不是没该对地方,有一个lvglfreetype支持和emotefreetype支持 我修改的是后者,另外用这个LVGL字库的流程可以新增一个readme么?

@MIKEDOG369
Copy link

已经修改了源码 更换了自己的表情验证成功了,但是在构建时报字库错误,说要打开freetype宏定义,我在menuconfig里面打开了 但是仍然报错,不清楚是不是没该对地方,有一个lvglfreetype支持和emotefreetype支持我修改的是后者,另外用这个LVGL字库的流程可以新增一个readme么么?

哎呀要什么字库,电池喇叭等统统不要,你看字节的喵伴有吗,

@espressif2022
Copy link
Contributor Author

已经修改了源码 更换了自己的表情验证成功了,但是在构建时报字库错误,说要打开freetype宏定义,我在menuconfig里面打开了 但是仍然报错,不清楚是不是没该对地方,有一个lvglfreetype支持和emotefreetype支持 我修改的是后者,另外用这个LVGL字库的流程可以新增一个readme么?

OK,代码可以先参考这个 PR

@wenmou9
Copy link

wenmou9 commented Sep 8, 2025

OK,还有一个问题,如果用自定义图片的话要用多大尺寸的gif转换 我用自己的目前确实可以显示 但是会显示多个,看起来像是图片尺寸太小,那么给多少是合适的,或者在代码里面有可以调整的地方

@espressif2022
Copy link
Contributor Author

OK,还有一个问题,如果用自定义图片的话要用多大尺寸的gif转换 我用自己的目前确实可以显示 但是会显示多个,看起来像是图片尺寸太小,那么给多少是合适的,或者在代码里面有可以调整的地方

你是用了 lvgl 的 canvas ? 正常不会吧,有多大刷多大的

@wenmou9
Copy link

wenmou9 commented Sep 8, 2025

我的操作步骤为,用一张gif转为eaf,直接选择转换不做配置,转换完丢到包管理那个目录,名称改为Happy替换本来的Happy,烧录进去就是流畅但是不完整的内容,您这边也可以试一下

@MIKEDOG369
Copy link

我的作步骤为,用一张gif转为eaf,直接选择转换不做配置,转换完丢到包管理那个目录,名称改为Happy替换本来的Happy,烧录进去就是流畅但是不完整的内容,您这边也可以试一下

输出360x360 高度16 色深4,编码方式默认,输入的也是360x360像素的

@wenmou9
Copy link

wenmou9 commented Sep 8, 2025

我的作步骤为,用一张gif转为eaf,直接选择转换不做配置,转换完丢到包管理那个目录,名称改为Happy替换本来的Happy,烧录进去就是流畅但是不完整的内容,您这边也可以试一下

输出360x360 高度16 色深4,编码方式默认,输入的也是360x360像素的

按照这个设置好了一点 中心有个白色虚线,绝大部分显示正常

@wenmou9
Copy link

wenmou9 commented Sep 8, 2025

又发现一个问题,现在我给了360×360的图片 ,我的gif是嘴巴在中间,感觉会镜像,眼睛部分都很正常,嘴巴双倍大小

@espressif2022
Copy link
Contributor Author

又发现一个问题,现在我给了360×360的图片 ,我的gif是嘴巴在中间,感觉会镜像,眼睛部分都很正常,嘴巴双倍大小

gfx_anim_set_mirror(anim_obj, false, 0); 关闭一下

@wenmou9
Copy link

wenmou9 commented Sep 8, 2025

又发现一个问题,现在我给了360×360的图片 ,我的gif是嘴巴在中间,感觉会镜像,眼睛部分都很正常,嘴巴双倍大小

gfx_anim_set_mirror(anim_obj, false, 0); 关闭一下

非常感谢 可以了

@MIKEDOG369
Copy link

@espressif2022 为什么我播放到最后一帧会卡住,然后我是360x360设计好的表情是居中,设备上表情偏右上一点,我的gif是273k,高度16 色深4 转换后变成736k

@MIKEDOG369
Copy link

@espressif2022 居中的问题我知道修改了,但是为什么播放会卡住,还有就是之前转换后的文件为什么这么大

@espressif2022
Copy link
Contributor Author

@espressif2022 居中的问题我知道修改了,但是为什么播放会卡住,还有就是之前转换后的文件为什么这么大

gfx_anim_set_segment, 最后一个参数是是否要循环,true 会循环播放,false 播到最后一帧就停了

@espressif2022
Copy link
Contributor Author

@espressif2022 居中的问题我知道修改了,但是为什么播放会卡住,还有就是之前转换后的文件为什么这么大

gfx_anim_set_segment, 最后一个参数是是否要循环,true 会循环播放,false 播到最后一帧就停了。
大小还是看实际资源,有的压缩率会比较低,可以其他几个模式,haffman, jpg 都试试

@MIKEDOG369
Copy link

gfx_anim_set_segment(obj_anim_eye, 0, 0xFFFF, 20, true);是true,还是卡,我换了一个表情,899k大小,播放会卡,不定时的卡,我换了解压试试

@espressif2022
Copy link
Contributor Author

gfx_anim_set_segment(obj_anim_eye, 0, 0xFFFF, 20, true);是true,还是卡,我换了一个表情,899k大小,播放会卡,不定时的卡,我换了解压试试

是解码慢,还是程序卡死了?

@MIKEDOG369
Copy link

gfx_anim_set_segment(obj_anim_eye, 0, 0xFFFF, 20, true);是true,还是卡,我换了一个表情,899k大小,播放会卡,不定时的卡,我换了解压试试

是解码慢,还是程序卡死了?
还是间歇性的播放会卡,应该是程序卡,我已经修改原gif帧数,压缩完是414k,播放几次当中会有一次卡住不动,
还有一个273k大小动画的播放没见卡过

@Eternal-wsj
Copy link

@espressif2022 请问下,我这边使用自己生成的bin图标文件无法正常显示,有没有适配的脚本转换工具呢?

@MIKEDOG369
Copy link

@espressif2022 解决了,是我改的播放流程出来问题

@espressif2022
Copy link
Contributor Author

espressif2022 commented Sep 9, 2025

@espressif2022 请问下,我这边使用自己生成的bin图标文件无法正常显示,有没有适配的脚本转换工具呢?
png_to_rgb565a8.py

python png_to_rgb565a8.py ./face_new_small/output/icon_mic.png --bin

@MIKEDOG369
Copy link

@espressif2022 您好我想问一下声源定位板子的采集率设置多少

@PL-FE
Copy link

PL-FE commented Sep 15, 2025

新手请问,电量功能怎么实现,目前好像是假电量

@espressif2022
Copy link
Contributor Author

@espressif2022 您好我想问一下声源定位板子的采集率设置多少

一般 16K

@PL-FE
Copy link

PL-FE commented Sep 15, 2025 via email

@espressif2022
Copy link
Contributor Author

新手请问,电量功能怎么实现,目前好像是假电量

echoear 这边我没实现电量计功能,可以显示不同百分比的图片?

@MIKEDOG369
Copy link

@espressif2022 您好我想问一下声源定位板子的采集率设置多少

一般 16K
16k不是用TODA算法吧,能不能给个思路

@shootao
Copy link

shootao commented Sep 15, 2025

@MIKEDOG369 声源定位直接参考 esp-doa

@MIKEDOG369
Copy link

@78 ReadAudioData里面的独立通道和参考通道的音频数据,分别对应echoear板子上的两个麦克风吗

@78
Copy link
Owner

78 commented Sep 16, 2025

@78 ReadAudioData里面的独立通道和参考通道的音频数据,分别对应echoear板子上的两个麦克风吗

不是,目前对话的时候,只有一个物理mic工作。参考通道是在电路上实现的回环。

@MIKEDOG369
Copy link

@78 esp_codec_dev_read是读取混合(mic1 0 mic2 0 mic3 0 mic4 0)这样的格式吗,我想读出两个麦克风的数据用什么方法

@78
Copy link
Owner

78 commented Sep 16, 2025

@78 esp_codec_dev_read是读取混合(mic1 0 mic2 0 mic3 0 mic4 0)这样的格式吗,我想读出两个麦克风的数据用什么方法

应该是可以修改读取的channels数和mask。

@MIKEDOG369
Copy link

@78 esp_codec_dev_read是读取混合(mic1 0 mic2 0 mic3 0 mic4 0)这样的格式吗,我想读出两个麦克风的数据用什么方法

应该是可以修改读取的channels数和mask。

我不知道我理解对不对, .channel_mask = ESP_CODEC_DEV_MAKE_CHANNEL_MASK(0)对应的es7210的mic1,ESP_CODEC_DEV_MAKE_CHANNEL_MASK(1)对应的mic2,如果开启双通道,esp_codec_dev_read数据(mic1 0 mic2 0)这样是什么,但是我把通道对调,发现呼叫afe唤醒词有反应,但是对话没反应,

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

9 participants