夜雨聆风学习资料网

ARTICLE · 1280245

我把一个 AI 小硬件,改成了能听音乐、查天气、扫Wi-Fi和 Cindy 对话的随身小设备

我把一个 AI 小硬件,改成了能听音乐、查天气、扫Wi-Fi和 Cindy 对话的随身小设备

以下内容转载自:高花亭小学公众号。

最近esp32很火,我也在淘宝上花了99块买了一个小硬件,集成度很高。

最开始,我只是想让它开机自动播放一段《安静的音乐》。

后来,需求一点点加了上去:能不能换几首音乐?能不能记住办公室、家里和手机的 Wi-Fi?能不能显示安庆天气?再后来,我又想,既然有麦克风和扬声器,为什么不能直接和电脑上的 Cindy 说话?

就这样,一张 FoloToy AI Passport,慢慢变成了我想要的样子。

这篇文章,记录这次从“自动播放”到“跨网络语音对话”的改造。它不是一步到位的演示,而是在真实使用中,一边发现问题、一边修复的过程。

AI Passport 设备外观。图片来源:FoloToy 开源项目;为原版产品展示图。

01|先让它成为一个顺手的播放器

对我来说,第一件事很简单:打开设备,就能听到音乐,不必每次拿出手机。

现在的默认曲目是一首安静的音乐,开机自动播放,默认音量为 80%。进入“曲库”,还可以选择。

五首音频都放在设备本地。播放这些内置音乐,不需要网络,也不依赖电脑在线。可以暂停、继续,调节音量,也可以在单曲循环和顺序循环之间切换。

不过,“长版”是曲目的名称,不代表把几个小时的视频全部塞进了设备。目前收录的是约 4 分 50 秒的节选;《安静的音乐》也经过取舍,保留了 8 分 30 秒。

这背后有一个很实际的限制:设备的 Flash 只有 8 MB,固件、界面、字体和音乐都要共用这点空间。我们采用 11.025 kHz 单声道 IMA ADPCM,把五首曲目装进去。当前应用已经用了约 8.22 MB,距离应用分区上限只剩约 35 KB。

从“再加一首”到“还能放下多少”,我第一次这么直观地感受到,小设备的每一寸空间都要认真分配。

02|离开电脑,也要知道自己连到了哪里

下一步,是让它在日常环境里更好用。

主页顶部现在显示当前 Wi-Fi 名称和日期时间。进入网络页面,可以查看 IP、选择已经保存的网络,也能扫描附近的 Wi-Fi,看到网络名称、信号强度和信道。

设备最多保存六组常用网络,优先连接上次成功使用的那一个;连接失败后,再尝试其它已保存网络。已经连上时,它不会为了寻找另一个网络而主动断开。

临时到一个新地方,也可以用手机配网:在设备上打开配网功能,手机连接临时热点,打开配网页,填写目标网络的信息即可。为了方便,这个临时热点不设密码,只允许一部手机连接,并会自动关闭。日常使用时,需要配网再开启。

天气页面则固定显示安庆的温度、天气状况、湿度和观测时间。进入页面会刷新,成功后还会定时更新;如果网络暂时不可用,就保留上次结果,并提示刷新状态和数据是否过期。

它开始有了一点“随身信息小屏”的感觉。

03|按住说话,让这张小卡片接上 Cindy

最有意思的变化,是加上了语音对话。

现在,“Cindy 对话”已经放在主菜单第一项。进入后,按住确定键说话,松开提交,等待回复。设备会播放回答,同时在屏幕上显示回复文字。

这里需要说明:Cindy 并不是完整运行在这张小卡片上。

设备负责录音、显示和播放;MacMini 上的桥接服务负责语音识别、把问题交给 Cindy,再将回答转成语音和适合小屏显示的文字图像。

可以把它理解为:小卡片是话筒和扬声器,电脑上的 Cindy 负责处理问题。电脑和桥接服务需要保持在线,所用模型服务也需要可用。

最初,它只能在同一个局域网里使用。后来接入了带 HTTPS 的远程入口,设备在其它可联网的 Wi-Fi 环境里,也能连接回家里或办公室的桥接服务。跨网络对话已经完成实际测试,但它仍然取决于两端网络以及电脑的在线状态。

另一个小改动,也明显影响了体验:回答过程中,如果我想换一个问题,直接按住确定键,就会取消当前回复并开始新一轮提问,不必等上一段话慢慢讲完。

04|最难的部分,其实是“让它稳定地回答”

做出一次能响的演示,和每天都能顺手使用,是两件事。

这次改造中,最花时间的就是语音对话。远程回复曾经出现卡顿,也多次出现“对话失败”。有时候是上传出了问题,有时候上传成功了,却在等待回答的过程中断开;还有一次,原因并不在设备,而在 Cindy 任务权限与插件调用规则不匹配。

我们把这些问题拆开检查:设备有没有录到声音?上传有没有被接收?桥接有没有生成任务?Cindy 是否正常回答?音频有没有完整下载和播放?

对应的修复也落到了不同层面。

一轮对话尽量复用同一条 HTTP 连接,减少反复建立 HTTPS 连接带来的开销;上传带上请求编号,允许有限重试,同时避免重复生成任务;回复音频先缓冲,再交给播放任务解码,减少边下载边播放时的停顿。

此外,失败或取消的任务需要正确清理,新的按键操作也不能被上一轮任务吞掉。界面上的失败提示,则尽量区分配对、忙碌、服务故障和超时。

修复之后,设备已经完成连续的公网语音对话,我也确认能听到正常回复。但这不等于所有弱网情况都已经解决,长期使用仍然需要继续观察。

对这样的小设备来说,体验往往就藏在这些看不见的细节里。

05|用 NFC Tools,把背部标签变成网址入口

我还想让手机靠近设备时,打开自己的网站。

最初用 iPhone 靠近没有反应,后来调整位置,用手机顶部靠近设备背部标签,就出现了通知。于是,主页上的提示也改成了这句更直接的话:

手机顶部靠近背部标签

但这里有个容易误解的地方:背面的 NFC 是供手机读取的被动标签,它不是固件里的一个菜单功能。通过 USB 更新设备固件,并不能顺便改写这个标签的网址。

目前确认能读到的仍是原来的网站。要把它改为 https://www.ghtxx.cn,需要用手机上的 NFC Tools 单独写入。设备背部使用的是 NTAG213 被动标签;是否能够改写,还要先检查标签是否可写。

背部的 NFC 标记帮助定位贴近区域。图片来源:FoloToy 开源项目产品图。

具体怎么写?在支持 NFC 的手机上安装 NFC Tools,打开应用后,依次选择“写入(Write)→ 添加记录(Add a record)→ URL / URI”。填写 https://ghtxx.cn 并确认;如果界面将协议和网址分成两栏,就在协议栏选择 https://,网址栏填写 ghtxx.cn,避免重复输入协议。

NFC Tools 官方教程:添加 URL / URI 记录,左为 Android、右为 iOS。图中网址为示例,请替换为自己的网址。

回到写入页,点击“写入 / Write”,将 iPhone 顶部靠近设备背部的 NFC 标签,保持片刻,等待应用提示写入完成。不同系统和版本的按钮名称可能略有差别,操作顺序相同。

写完之后,还要离开写入界面,再用手机重新靠近标签,点击出现的通知,检查是否真的打开了目标网站。应用提示写入成功和实际打开正确网址,是两步都要完成的验证。

如果 NFC Tools 提示标签只读,就先核对标签锁定状态;USB 更新固件不能解除 NFC 标签的永久只读锁定。目前这张设备标签还没有完成新网址写入后的实测,因此这里记录的是操作方法,不代表已经改写成功。

操作方法与界面示意来源:Wakdev / NFC Tools 官方教程《How to write a link (URL) on an NFC chip?》https://www.wakdev.com/en/knowledge-base/how-to-guides/how-to-write-a-link-url-on-an-nfc-chip.html

这件小事提醒我:改造设备,既要理解软件,也要分清硬件真正能做什么。

06|下一步:让知识问答先查资料,再开口

我希望 Cindy 回答需要事实依据的问题时,先去网上查,而不是只凭已有知识直接回答。

对应的桥接 1.6 源码已经准备好,并通过了主机测试:知识性问题优先检索公开网络信息;简单问候不强制搜索;查询失败时需要如实说明。

但这部分目前还没有安装到实际桥接服务,也没有完成设备上的端到端验收。因此,“先检索再回答”是已经写好的下一步能力,不能当成当前设备已经全面启用的功能。

把这条边界说清楚,比把功能列表写得漂亮更重要。

从一个小愿望,变成一个可以继续改造的项目

回头看,这次改造没有一个庞大的起点。

它只是从“开机播放大悲咒”开始,逐步加入曲库、网络管理、天气,再连接到 Cindy。每一个功能,都来自实际使用中一句很朴素的话:“这里能不能再方便一点?”

现在,它既可以独立播放佛音,也可以在联网时成为 Cindy 的语音入口。对我来说,这比一个功能很多、却很少拿起来用的设备更有意义。

项目基于 FoloToy AI Passport 开源工程改造,保留上游 MIT 许可证与署名。代码、配套桥接源码、测试和构建说明放在 GitHub,供有相同设备的朋友参考:

https://github.com/jarodlee/ai-passport-chant

源码中的设备配对和 Wi-Fi 配置需要自行准备,不能直接拿示例密钥部署。代码许可不代表音乐录音的授权,音频的使用和传播仍需遵守各自权利要求。

如果你手里也有一台这样的设备,会先把它改成什么?

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料