小智AI设备实现繁体中文显示
想象一下这样的场景:你买了一台小智AI设备,但是发现它只能显示简体中文。对于习惯使用繁体中文的用户来说,这就像买了一台只能显示英文的手机一样,使用起来很不方便。
具体问题:
- 设备收到LLM返回的简体中文消息,但用户希望看到繁体中文
- 用户的语音输入被显示为简体中文,但希望显示为繁体中文
- 系统提示信息都是简体中文,不符合用户习惯
为什么会有这个问题?
技术原因
- ESP32芯片限制:这是一个嵌入式设备,内存和存储空间都很有限
- 原始设计:开发时主要考虑简体中文用户,没有内置繁体支持
- 字体问题:即使有繁体字体,也需要解决文字转换的问题
用户需求
- 台湾、香港、澳门等地区的用户习惯繁体中文
- 海外华人社区普遍使用繁体中文
解决思路
在小智AI的屏幕上显示的文字可以分为三大类:
- 系统UI
- 用户语音输入经ASR(Automatic Speech Recognition,自动语音识别)转换得到的文字
- LLM(Large Language Model,大型语言模型)的响应文字
对于系统UI,只需要将系统语言通过 idf.py menuconfig 切换为繁体中文即可。
对于ASR和LLM输出的文字,有以下两种解决方案。
方案对比
方案1:云端转换
- 将LLM和ASR配置为以繁体中文输出
- 或者不修改LLM和ASR的配置,使其仍以简体中文输出,在服务器转换为繁体中文后返回给小智
- 优点:转换准确,支持多种语言
- 缺点:需要网络连接,有延迟,可能泄露隐私
方案2:本地转换
- 在设备内部直接转换,不需要网络
- 优点:速度快,无延迟,保护隐私
- 缺点:需要占用一些存储空间
我们选择了方案2,因为我们没有权限修改服务器,ESP32虽然资源有限,但存储空间还是够用的。
核心思路
简单来说:我们准备一本"简繁对照字典",设备收到简体中文时,就查这本字典,找到对应的繁体中文显示出来。
具体实现:
- 收集大量的简繁对照数据(比如"计算机"对应"計算機")
- 把这些数据转换成设备能快速查找的格式
- 在设备显示文字之前,先查字典转换
- 转换完成后,显示繁体中文
技术实现
第一步:准备"字典"
我们需要一个包含大量简繁对照的数据库。幸运的是,开源项目OpenCC已经帮我们整理好了这些数据,包括:
- 单字对照:如"发"对应"發"
- 短语对照:如"鼠标"对应"滑鼠"
第二步:制作"电子字典"
原始数据是文本格式,设备查找起来很慢。我们需要:
- 把文本数据转换成数组格式
- 按照查找效率优化数据结构
- 生成设备能直接使用的代码文件
关键优化:
- 按首字母建立索引,就像字典的字母索引一样
- 短语按长度排序,优先匹配长短语(比如"中华人民共和国"比"中国"优先级高)
- 使用二分查找,快速定位目标数据
第三步:编写"查字典"程序
设备需要知道如何查字典,我们实现了:
- UTF-8解码:把输入的中文字符转换成数字编码
- 短语查找:先尝试找最长的匹配短语
- 单字回退:如果找不到短语,就查单个字
- UTF-8编码:把转换结果重新编码成字符
查找策略:
- 优先尝试短语匹配,因为"计算机→計算機"比"计→計"+"算→算"+"机→機"的转换效率更高
- 如果短语匹配失败,再逐个字符转换
- 这样既保证了准确性,又提高了效率
第四步:解决字体问题
关键发现:即使文字转换成功了,还有一个重要问题需要解决——字体文件!
字体问题分析:
- 设备原本使用的字体文件
font_puhui_14_1.c只包含简体中文字符 - 很多繁体字在字体文件中是缺失的
- 即使转换成功,缺失的繁体字仍然无法正常显示,会显示为方框或空白
字体文件结构:
// font_puhui_14_1.c 文件包含:
// 1. 英文字符(ASCII 32-127)
// 2. 简体中文字符(常用汉字)
// 3. 标点符号和数字
// 4. 但缺少大部分繁体字符
字体解决方案:
- 字体文件分析:检查现有字体文件包含哪些字符
- 缺失字符统计:找出哪些繁体字在字体中缺失
- 字体补全:使用字体工具(如LVGL字体转换器)添加缺失的繁体字符
- 字体优化:确保字体文件大小在可接受范围内
具体操作:
使用LVGL字体转换器添加繁体字符,重新生成并替换原始的font_puhui_14_1.c 文件

浙公网安备 33010602011771号