{"id":31465584,"url":"https://github.com/78/xiaozhi-assets-generator","last_synced_at":"2025-10-10T06:39:46.954Z","repository":{"id":314153595,"uuid":"1053978349","full_name":"78/xiaozhi-assets-generator","owner":"78","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-26T21:03:03.000Z","size":21863,"stargazers_count":6,"open_issues_count":0,"forks_count":8,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-04T06:36:32.932Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/78.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-10T07:40:25.000Z","updated_at":"2025-10-03T16:29:51.000Z","dependencies_parsed_at":null,"dependency_job_id":"0df85889-40e6-48bc-be16-919fd445284e","html_url":"https://github.com/78/xiaozhi-assets-generator","commit_stats":null,"previous_names":["78/xiaozhi-assets-generator"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/78/xiaozhi-assets-generator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fxiaozhi-assets-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fxiaozhi-assets-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fxiaozhi-assets-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fxiaozhi-assets-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/78","download_url":"https://codeload.github.com/78/xiaozhi-assets-generator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/78%2Fxiaozhi-assets-generator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002970,"owners_count":26083489,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-01T17:52:42.973Z","updated_at":"2025-10-10T06:39:46.935Z","avatar_url":"https://github.com/78.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 小智 AI 自定义 Assets 单页应用\n\n## 应用目的\n\n小智AI语音对话盒子的自定义主题（包括唤醒词模型、表情包、文本字体、聊天背景），在线生成和导出 assets.bin 文件。\n\n## 功能设计\n\n用户要自定义一个 assets.bin 文件，分为 3 个步骤。\n- Step 1：选择芯片型号，屏幕类型与分辨率\n- Step 2：主题设计（使用多个tab来分别完成不同项目的配置）\n- Step 3：待打包生成的内容清单以及生成按钮\n\n## 详细页面功能\n\n### 选择芯片型号，屏幕类型与分辨率\n\n给出一些常见的板子的快捷选择配置项，例如\n\n- 立创·实战派 ESP32-S3，配置为 esp32s3，LCD 320x240，RGB565\n- ESP-BOX-3，配置为 esp32s3，LCD 320x240，RGB565\n- 无名科技·星智 1.54 TFT，配置为 esp32s3，LCD 240x240，RGB565\n- Surfer C3 1.14 TFT，配置为 esp32c3，LCD 240x135，RGB565\n\n也可以自定义芯片（可以选择 esp32s3,esp32c3,esp32p4,esp32c6），自定义分辨率大小，颜色目前只支持 16位的RGB565\n\n### 主题设计\n\n#### Tab 1: 唤醒词配置\n\n对于 C3/C6 芯片，只支持 WakeNet9s 的唤醒词模型。\n对于 S3/P4 芯片，只支持 WakeNet9 的唤醒词模型。\n\n列表如下，第一列为唤醒词名称，其他列为值。\n\n|wake words       |             WakeNet9s           |  WakeNet9              | \n|:--------------- | :------------------------------:| :---------------------:| \n|Hi,乐鑫           |  wn9s_hilexin                   | wn9_hilexin            | \n|Hi,ESP           |  wn9s_hiesp                      | wn9_hiesp              | \n|你好小智          |  wn9s_nihaoxiaozhi              | wn9_nihaoxiaozhi_tts   |\n|Hi,Jason         |   wn9s_hijason_tts2              | wn9_hijason_tts2       |\n|你好喵伴          |                                 | wn9_nihaomiaoban_tts2   |\n|小爱同学          |                                 | wn9_xiaoaitongxue      | \n|Hi,M Five        |                                  | wn9_himfive            | \n|Alexa            |                                  | wn9_alexa              | \n|Jarvis           |                                  | wn9_jarvis_tts         | \n|Computer         |                                  | wn9_computer_tts       |\n|Hey,Willow       |                                  | wn9_heywillow_tts      | \n|Sophia           |                                  | wn9_sophia_tts         |\n|Mycroft          |                                  | wn9_mycroft_tts        |\n|Hey,Printer      |                                  | wn9_heyprinter_tts     |\n|Hi,Joy           |                                  | wn9_hijoy_tts          |\n|Hey,Wand         |                                  | wn9_heywanda_tts       |\n|Astrolabe        |                                  | wn9_astrolabe_tts      |\n|Hey,Ily          |                                  | wn9_heyily_tts2        |\n|Hi,Jolly         |                                  | wn9_hijolly_tts2        |\n|Hi,Fairy         |                                  | wn9_hifairy_tts2        |\n|Blue Chip        |                                  | wn9_bluechip_tts2        |\n|Hi,Andy          |                                  | wn9_hiandy_tts2        |\n|Hi,Wall E/Hi,瓦力|                                  | wn9_hiwalle_tts2       |\n|你好小鑫         |                                  | wn9_nihaoxiaoxin_tts   |\n|小美同学         |                                  | wn9_xiaomeitongxue_tts |\n|Hi,小星          |                                  | wn9_hixiaoxing_tts     |\n|小龙小龙         |                                  | wn9_xiaolongxiaolong_tts    |\n|喵喵同学         |                                  | wn9_miaomiaotongxue_tts|\n|Hi,喵喵          |                                  | wn9_himiaomiao_tts     |\n|Hi,Lily/Hi,莉莉  |                                  | wn9_hilili_tts         |\n|Hi,Telly/Hi,泰力 |                                  | wn9_hitelly_tts        |\n|小滨小滨/小冰小冰|                                  | wn9_xiaobinxiaobin_tts |\n|Hi,小巫          |                                  | wn9_haixiaowu_tts      |\n|小鸭小鸭         |                                  | wn9_xiaoyaxiaoya_tts2  |\n|璃奈板           |                                  | wn9_linaiban_tts2      |\n|小酥肉           |                                  | wn9_xiaosurou_tts2      |\n|小宇同学         |                                  | wn9_xiaoyutongxue_tts2  |\n|小明同学         |                                  | wn9_xiaomingtongxue_tts2|\n|小康同学         |                                  | wn9_xiaokangtongxue_tts2|\n|小箭小箭         |                                  | wn9_xiaojianxiaojian_tts2|\n|小特小特         |                                  | wn9_xiaotexiaote_tts2|\n|你好小益         |                                  | wn9_nihaoxiaoyi_tts2|\n|你好百应         |                                  | wn9_nihaobaiying_tts2|\n|小鹿小鹿         |                                  | wn9_xiaoluxiaolu_tts2|\n|你好东东         |                                  | wn9_nihaodongdong_tts2|\n|你好小安         |                                  | wn9_nihaoxiaoan_tts2|\n|你好小脉         |                                  | wn9_ni3hao3xiao3mai4_tts2|\n\n唤醒词参考 `spiffs_assets/pack_model.py` 把 `share/wakenet_model` 下对应的模型目录打包成 srmodels.bin\n\n#### Tab 2：字体配置\n\n用户可以选择预设字体（位于 `share/fonts` 目录），无需字体制作过程，常用字体有：\n- font_puhui_14_1：阿里巴巴普惠体，涵盖常用字7000个，字号14px，bpp1\n- font_puhui_16_4：阿里巴巴普惠体，涵盖常用字7000个，字号16px，bpp4\n- font_puhui_20_4：阿里巴巴普惠体，涵盖常用字7000个，字号20px，bpp4\n- font_puhui_30_4：阿里巴巴普惠体，涵盖常用字7000个，字号30px，bpp4\n\n用户也可以上传自定义字体：\n- 需要选择本地字体文件，目前支持TTF与WOFF格式。\n- 选择字号（范围限制在8-80之间，常用为14,16,20和30），选择bpp（范围为1，2，4）\n- 选择字符集（GB2312 7445个字符、DeepSeek R1 7405个字符），默认选择 DeepSeek R1\n\n自定义字体参考 `lv_font_conv/lib/convert.js` 转换成 cbin 格式，转换后的文件命名为 font_[字体名]_[字号]_[BPP].bin\n\n### Tab 3：表情集合\n\n一个常见的表情集合一共包含 21 张图片，其中一张为 neutral 默认表情，其余为表达不同情绪的表情。\n不同表情对应的 Emoji 如下：\n\n| 😶 | neutral      |\n| 🙂 | happy        |\n| 😆 | laughing     |\n| 😂 | funny        |\n| 😔 | sad          |\n| 😠 | angry        |\n| 😭 | crying       |\n| 😍 | loving       |\n| 😳 | embarrassed  |\n| 😯 | surprised    |\n| 😱 | shocked      |\n| 🤔 | thinking     |\n| 😉 | winking      |\n| 😎 | cool         |\n| 😌 | relaxed      |\n| 🤤 | delicious    |\n| 😘 | kissy        |\n| 😏 | confident    |\n| 😴 | sleepy       |\n| 😜 | silly        |\n| 🙄 | confused     |\n\n用户可以选择预设表情包，预设表情有：\n- Twemoji 32x32 PNG (位于 `share/twemoji32`)\n- Twemoji 64x64 PNG (位于 `share/twemoji64`)\n\n用户也可以自定义表情包：\n- 需要设置一个统一的图片大小 width x height，不能大于屏幕分辨率。\n- 选择动态图片（GIF）或静态透明背景图片（PNG）格式\n- 必须要提供一张默认图片作为 neutral 表情（大小会自动适配为 widght x height）\n- 其他表情为可选，如果用户不修改其他表情图片，则默认使用 neutral 表情来显示。\n\n### Tab 4：聊天背景\n\n背景分为浅色模式和深色模式两种配置，默认为颜色配置\n- 默认浅色模式为 #ffffff，深色模式为 #121212\n\n用户可以修改默认颜色，也可以加入静态图片作为背景。\n静态图片可以为两张不一样的图片，也可以配置为一张图。\n背景图片会自动适配屏幕分辨率的大小，格式通常为RGB565的位图，带64字节的header，内容为lv_image_dsc_t。\n\n### 生成 assets.bin\n\n用户在主题设计的过程中，可以随时点击右上角的生成按钮，通过弹窗的方式，显示要打包的资源清单。\n用户点击“确定”后，开始等待生成，如果用户自定义了字体文件，则制作字体需要的时间会比较长，制作结果可以缓存起来，重新生成的时候速度更快。\n\n现在已经实现了浏览器端本地生成 assets.bin 的功能，无需后端 API。\n\n## 技术实现\n\n### 浏览器端生成 assets.bin\n\n项目现在使用完全基于浏览器的本地生成方案：\n\n1. **WakenetModelPacker.js** - 模仿 `pack_model.py` 的功能，在浏览器端打包唤醒词模型为 srmodels.bin\n2. **SpiffsGenerator.js** - 模仿 `spiffs_assets_gen.py` 的功能，生成最终的 assets.bin 文件\n3. **AssetsBuilder.js** - 协调各个模块，模仿 `build.py` 的资源处理流程\n\n### 生成流程\n\n1. 加载用户配置\n2. 处理字体文件（预设字体或自定义字体转换）\n3. 从 `share/wakenet_model/` 加载并打包唤醒词模型\n4. 处理表情图片（预设或自定义）\n5. 处理背景图片并转换为RGB565格式\n6. 生成 index.json 索引文件\n7. 使用 SPIFFS 格式打包所有文件为 assets.bin\n\n### 资源文件结构\n\n生成的 assets.bin 包含索引文件 index.json，内容大概如下：\n\n例子1：\n```json\n{\n    \"version\": 1,\n    \"chip_model\": \"esp32s3\",\n    \"display_config\": {\n        \"width\": 320,\n        \"height\": 240,\n        \"monochrome\": false,\n        \"color\": \"RGB565\"\n    },\n    \"srmodels\": \"srmodels.bin\",\n    \"text_font\": \"font_puhui_common_30_4.bin\",\n    \"skin\": {\n        \"light\": {\n            \"text_color\": \"#000000\",\n            \"background_color\": \"#FFFFFF\",\n            \"background_image\": \"background_light.raw\"\n        },\n        \"dark\": {\n            \"text_color\": \"#FFFFFF\",\n            \"background_color\": \"#121212\",\n            \"background_image\": \"background_dark.raw\"\n        }\n    },\n    \"emoji_collection\": [\n        {\n            \"name\": \"sleepy\",\n            \"file\": \"sleepy.png\"\n        },\n        ...\n    ]\n}\n```\n\n例子2：\n```json\n{\n    \"version\": 1,\n    \"chip_model\": \"esp32c3\",\n    \"display_config\": {\n        \"width\": 240,\n        \"height\": 240,\n        \"monochrome\": false,\n        \"color\": \"RGB565\"\n    },\n    \"srmodels\": \"srmodels.bin\",\n    \"text_font\": \"font_puhui_common_16_4.bin\",\n    \"skin\": {\n        \"light\": {\n            \"text_color\": \"#000000\",\n            \"background_color\": \"#FFFFFF\",\n        },\n        \"dark\": {\n            \"text_color\": \"#FFFFFF\",\n            \"background_color\": \"#121212\"\n        }\n    },\n    \"emoji_collection\": [\n        {\n            \"name\": \"sleepy\",\n            \"file\": \"sleepy.png\"\n        },\n        ...\n    ]\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F78%2Fxiaozhi-assets-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F78%2Fxiaozhi-assets-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F78%2Fxiaozhi-assets-generator/lists"}