LuatOS 内部是以32位存储秒级时间戳。这倒也没什么,可它是将1970年作为默认时间。考虑到32位数字容量,2036年就到期了。
当我还在担心之后怎么办时,它又在某次更新中,悄悄将默认时间改为1971年。一方面,这种级别的改动,有点随意了。且不说,1971和常用的1970比,还是随意了。
还是年轻,之前是和常量1970比较,判断系统是否初始化。还好及时发现这个变化,干脆改成和2000年比较了。
独立开发,自由职业
LuatOS 内部是以32位存储秒级时间戳。这倒也没什么,可它是将1970年作为默认时间。考虑到32位数字容量,2036年就到期了。
当我还在担心之后怎么办时,它又在某次更新中,悄悄将默认时间改为1971年。一方面,这种级别的改动,有点随意了。且不说,1971和常用的1970比,还是随意了。
还是年轻,之前是和常量1970比较,判断系统是否初始化。还好及时发现这个变化,干脆改成和2000年比较了。
使用树莓派 4B + wukong 模块 + OpenAI,做了个智能音箱,简单记录下关键节点。
智能音箱的大概流程是这样的:
上面是从技术的角度分析。从产品的角度,还要考虑很多事情
从实现的角度,各个模块都有对应的选择,每个模块取最优解,然后组合出产品,是可以的。只是,这会比较耗时。经过简单的比较,选择 wukong-robot
这一成套解决方案。
关于硬件的选型。先是用我手上吃灰的 Radxa 安装。不过,由于这个硬件比较老了,官方的 Ubuntu 系统很久远,在安装 wukong-robot
时,遇到一系列兼容性问题。花了很多时间后,决定放弃。
找朋友借来了树莓派 3B。果然,树莓派生态很好。就拿安装系统来说,官方出了多平台的工具,很容易安装指定系统。并且,树莓派的系统是安装在 SD 卡上的。这样,更换 SD 卡就可以更换系统,很方便。
安装 wukong-robot
后,又遇到问题:这块板的 USB 有故障,识别不了 USB 设备。这就难办了,因为麦克风、扬声器是需要 USB 接口的。没办法,又买了树莓派 4B。
在新的硬件上,基本跑通了默认系统后,还要有一系列的配置和优化。
关于后端引擎,最想用的自然是 ChatGPT/OpenAI。不过,这个东西在国内是无法访问的。试了在板子上搭建梯子,可遇到 SSL 的问题,花了很长时间没解决,并且也不是必现的,只是高概率。
后来想的办法,就使用 Azure 的 ChatGPT 接口。具体的,使用日本的节点,会相对快点。好处是不用梯子,但总的响应速度,还是不如梯子 + OpenAI 接口。先这样用段时间,再考虑优化速度吧。
关于语音识别,简单比较几个,感觉区别不是太大,最后选了腾讯语音。
关于语音全成,默认是 Edge 接口,合成的效果不错。不过,实际有时会慢,比如一句短语可能要 2s 以上,这就比较影响体验,最后选了腾讯语音。
关于麦克风和扬声器,考虑最后的外观,选择了一个 USB 一体的、方形的设备。这样,可以比较容易和树莓派一起放到一个壳子里。
说到壳子,自己设计了简单的外壳,正在 3D 打印,收到后再验证。多半,还会再做几版。
还有其它一些优化,比如:
wukong-robot
在识别出命令后,会先调用百度 Unit 进行第一遍处理,目的是识别出一些预定义的功能,比如「大点声」这类的。问题是,这个操作会增加 3s 的延时。显然,为了低频的预处理,给所有请求都加上延时,是不划算的,于是我去掉了。wukong-robot
内置的调音量,是硬编码设置默认设备的,这点改成了可以调节指定设备的。最终产品,主要是给娃用的,回答他的十万个为什么。从初步使用体验上看,还是满意的。最大的不足是唤醒不灵敏、可能误唤醒。这点之后考虑用麦克风阵列,取代现在的单麦克风。未来,还会根据实际使用来不断改进。
后记:其实这件事,我几个月前就想做了,拖拖拉拉做到现在。
最开始,我是想基于现有的智能音箱做二次开发。最后发现,我还是太年轻。但凡厂商,几乎没有真正开放的。如果很容易让别人二次开发,岂不是给别人嫁衣。
如果自己完整做一个,需要大块的时间,一直没这个勇气,直到最近才下决心。比如,看到人家稚晖君,半年时间就做出那么高级的机器人,自己半年组装不出一个音箱,真是太汗颜了。
凡是治愈,都是自愈。
被 Air101 & LuatOS 坑了:升级完固件要重启,而重启时,一定概率会死掉,不响应作何中断,除非断电重插。
最后发现,是芯片降频至 2MHz 时,就无法执行 reboot 命令、执行就死机。哎,虽然是底层固件的大 Bug,但好歹找到问题,就能规避或解决了。
小时候家里炖肉,邻居都闻到了;现在炖肉,你在厨房都闻不到。
再比如番茄。小时吃的番茄,和现在的番茄,简单是两种东西。