大家好, 我是james, 一名hacker. 平时喜欢研究一些可编程的小东西.
1 板卡介绍
第十二期funpack活动的板卡是来自seeed的wio terminal. 该板卡搭载的MCU是AT-SAM-D51P19.核心是120MHz的arm cortex-m4f处理器, sram为192KB, flash为512KB, 板载了4MB外部flash.
2 实现功能
在本期的活动中, 我使用了最简单的方法实现了口型动画. 对着wio terminal说话, 它会捕捉发音中的元音, 然后讲元音对应的口型显示在屏幕上, 这样就好像屏幕上的动画形象在说话一样, 是一个有趣玩儿的对口型游戏(Lip Sync).
3 设计思路
wio terminal是seeed主推的一块arduino兼容板卡, 可以使用arduino框架进行编程, 网上有很多资源可以使用, 可以方便快速的进行原型开发.
为了实现对口型游戏, 我挑选了一些深度学习框架, 其中tensorflow-lite和edge-impulse都是可以在tinyml场景下使用的框架, 由于edge-impulse更易用一些, 为了快速制作原型, 我使用edge-impulse. 另外, 由于seeed推荐了他们自己的开发环境, codecraft, 我使用了codecraft作为edge-impulse的前端, 这样就更方便了.
经过数据采集, 选择模型, 训练学习, 测试部署等步骤, 完成了模型执行代码的生成, 然后利用TFT_eSPI库实现了将口型图片显示在屏幕上, 最后制作出了一个基于深度学习的对口型游戏.
4 环境搭建
首先, 训练模型并生成执行代码的步骤直接通过codecraft进行, 不需要搭建任何环境. 其次, 我使用了pio来代替arduino来加速编译过程, 提高灵活性.
其中搭建pio环境主要步骤是:
mkdir my-project
cd my-project
pio project init -b seeed_wio_terminal
由于seeed_wio_terminal的支持包内置了TFT_eSPI, 就不用单独下载安装, 直接用即可.
codecraft使用方法可以参考下面的链接:
https://www.yuque.com/tinkergen-help-en/codecraft?language=en-us
5 软件实现
5.1 使用gimp制作xbm图形
由于我没有使用sd卡, 所以图形必须用c数组的方式编译到程序中, 为了节省空间, 我使用gimp制作了单色图片, 用include的方法直接引入到程序中.
#include "face.xbm"
#include "a.xbm"
#include "i.xbm"
#include "u.xbm"
#include "e.xbm"
#include "o.xbm"
#include "close.xbm"
5.2 推断最大可信度并根据最大可信度显示口型
runClassifier();
if (maxValue < 0.6) {
fa[5]();
} else if (strcmp(maxConfidenceLabel, "a") == 0) {
fa[0]();
} else if (strcmp(maxConfidenceLabel, "i") == 0) {
fa[1]();
} else if (strcmp(maxConfidenceLabel, "u") == 0) {
fa[2]();
} else if (strcmp(maxConfidenceLabel, "e") == 0) {
fa[3]();
} else if (strcmp(maxConfidenceLabel, "o") == 0) {
fa[4]();
} else {
fa[5]();
}
6 硬件实现
本期没有硬件变动.
7 心得体会
- 图片必须单独生成单个xbm, 本来想把位图都放到一个xbm文件中, 试了下setAddrWindow函数不起作用, 具体原因还需要后续排查.
- 最开始的时候想把图片放到4m flash中, 用mpy和thonny来管理4m flash中的文件. 需要管理的时候将ardupy的uf2烧录到板子上, 后来发现, 虽然mpy和seeed_fs建立的都是fat文件系统, 以为可以兼容, 发现不行, 可能两者用的文件系统还是有差别, 用mpy存入, 无法用seeed_fs打开, 反之亦然.
- arduino生态和python优点类似, 就是参考代码或者别人制作好的库, 虽然不成熟, 虽然可能有很多坑, 但是数量还是挺多的, 用来快速实现原型非常方便, 但是如果要制作出性能和质量都很好的作品, 还需要花不少时间认真打磨优化.
8 常见问题
- codecraft生成的模型执行库存放位置为$HOME/CodecraftAssistant/libraries/ei_project_<编号>, 要将它软连接或者复制到项目文件夹里面的lib子文件夹内.
- pio提示头文件定义重复如果出现此类问题, 建议排查pio可能会存放library的所有文件夹. pio通过检查#include来确定依赖关系, 有时候推断并不准确或者重复, 需要手动梳理一下, 去掉没有的库.
9 其他说明
图片资源来源:
https://www.youtube.com/c/devonkong
感谢分享.
感谢硬禾学堂和得捷电子,让我接触到了wio terminal开发板,让我能在业余时间参与更多有趣项目的学习,也感谢群的小伙伴提供很多种实现题目功能的思路,感谢各大佬的代码铺垫, 要不然没法快速完成这个小任务, 感谢大家一路的折腾与陪伴,谢谢!