如何打造一款智能音箱?
摘要:背景 前段时间买了个小米的空调伴侣,想用来查看空调的功率,以确认空调到底会用掉多少电。 买的时候发现空调伴侣也支持红外控制,这就得好好利用一下了。但是有个尴尬的问题,就是空调插座在很偏的地方,导致了无法控制空调,也没法控制投影仪。 当一个东
背景
前段时间买了个小米的空调伴侣,想用来查看空调的功率,以确认空调到底会用掉多少电。
买的时候发现空调伴侣也支持红外控制,这就得好好利用一下了。但是有个尴尬的问题,就是空调插座在很偏的地方,导致了无法控制空调,也没法控制投影仪。
当一个东西你拥有了以后又失去的时候,你会很难受,所以我就想着要再买它一个红外控制设备来做这个事,看了一圈发现,小米万能遥控没得买了,变成了理财产品,所以就找了一款替代产品。欧瑞博的一款万能遥控。买完之后才发现,虽然能控制空调和投影仪了,但是有两个很严重的问题:
是没法使用小爱来通过欧瑞博的万能遥控来控制投影仪,目前两边还没打通,所以该功能还没法支持。
是使用小爱通过欧瑞博控制空调的时候常常无响应,估计就是小爱调用欧瑞博的过程出问题了,因为直接使用欧瑞博的app是可以生效的。
决定自制红外控制设备
到此,我决定,要不自己做一个吧,貌似成本也挺便宜的,还能玩玩IoT,多有意义。
所以我就花了大量的时间来做这个事,先去调研了一下用什么单片机,后面了解到用ESP32还挺好的,集成了WIFI和蓝牙,之后还可以实现一些比较fancy的功能。
除了硬件,当然还需要给刷上固件了,所以,还需要快速自学一下程序该咋写,于是乎就快速过了一遍《Arduino从基础到实践》,通过控制LED灯来练了一下手。接下来就是开发红外功能了,淘宝上9块钱买了红外收发的模块,借助PlatformIO开发了第一版红外固件,成功地点亮了投影仪,但是同时还有两个大坑没填:
是红外发射模块太弱了,只能在差不多半米的距离来控制设备;
是死活控制不了空调。
后续通过另购了一款16元的大功率发射模块解决了问题1。
对于问题2,着实折磨了我好几天的时间,到处检查到底是哪里的代码写出问题了,因此还去研究了一下红外协议,按位对比了一下我发射出去的红外和空调遥控发射出去的红外到底有什么不同,后来发现,格力空调的红外有点特殊,但只需要修改一下配置,就能轻松解决。
终于搞定了控制问题,顺手再撸一个WebServer来接受请求。
到此,单片机端的部分就告一段落了。
决定自制智能音箱
我想的是接下来就是如何通过小爱音箱来控制我的单片机发射红外信号了,所以搜索了一下该怎么做,网上有人实现的做法是通过注册小爱开发者账号,通过类似"小爱同学" -> "让XXX打开空调"的方式来控制。具体就是在小米那边配置一类意图,只要是"让XXX干什么"这样的命令,都转发到我们自己的服务器上,然后在服务器端解析小米给你发送的意图和实体,自行实现逻辑来进行控制(在我们的场景下就是发送一个http请求)。所以,这还要求我们能有个公网地址,或者通过别的服务来做内网穿透。
然后我就去申请了小爱开发者平台,但是他们的服务效率真的是太低了,由于我是周4申请的,竟然两天都没申请下来,到了周末,我就又动了"自己整一个小爱音箱的想法"。
说干就干,要实现这功能,首先得找找思路,所以就在github上先找了一下这类智能音箱的开源代码。
对比了一圈,发现wukong-robot 是一款挺好的产品,支持中文,还可以自定义插件,所以就冲了一波。
然后就又碰到问题了,这个库使用了各种云服务来支持实现智能音箱的功能,所以,我又又需要申请这些云服务的账号来试用,这我就不乐意了,咋又要申请呢?
所以,最后我决定,所有用到的云服务有功能,通通本地搭建。
好处很明显:
延迟降低,本地调用微妙级别的延迟。
又又可以学到了。
所以就先将智能音箱涉及到的技术部分都先研究一下是些什么。
一款智能音箱会涉及到:
唤醒:通过一个关键词来唤醒音箱听取你的命令
ASR(automatic speech recognition)或STT(speech to text):也就是语音识别,将语音转换成文字
NLU(natural language understanding):也就是让机器理解这句话的意思。这本身是一个极其庞大的主题,但是在智能音箱领域,就简化了很多,我们只需要识别出来我们的命令想要做什么就行了。这里面就包含了两部分:
意图识别:也就是一句话是干什么的,比如【打开空调】就可以识别成【操纵设备】的意图。
NER(named entity recognition)命名实体识别:有的地方会称之为slot(槽),就是识别出你关心的对象,比如【打开空调】中,【打开】就属于【操作】实体,【空调】就属于【设备】实体。
处理意图和实体:通过识别的意图和实体来实现自己的控制逻辑,比如当出现【操纵设备】的意图时,去检查一下具体的操作和设备是什么实体,来达到控制设备的效果。
TTS(text to speech):也就是语音合成,将文字转成语音,一般用于回复用户的命令。
