转眼又是两个月,嗯…回忆一下,6月1号,我们去了南昌,拍了很多照片,吃了好几顿大餐,这是我们的毕业旅行。6月10号,我以优秀毕业生的身份顺利毕业。6月20号,在两位四年好友的目送下,带着他们的祝福,我走进了火车站台。终于到了离别的时候,毕业季,离别季。
还有一件小事,在跳蚤市场卖东西的时候,我的不粘锅被人顺走了,强烈谴责,真的栓Q。
中间有几天住在朋友家里,我睡床,他睡地板,白天他出去家教,我在家里躺着,逗猫,晚上回来聊聊天,生活真好,他也好。
接下来就来到了中山,到现在已经一个月了,蛮舒服,但是我这个人,总喜欢给自己安排一大堆任务,闲不下来,也是蛮累的。记得我以前说的语音助手“大作业”吗,自从拿到树莓派,就开始了,已经写了一个月代码了。
所以,这一个月,我不是在创造BUG,就是在修复BUG,痛啊,太痛苦了,但是看到“晓晓”一步一步变得越来越智能,有用,完善,我也发自内心的高兴,只是有时会想这一个月的时间,值不值…。所以下面总结一下智能助手已经实现,待实现的功能和逻辑吧。
硬件是树莓派4B,系统环境是Raspberry PI OS 64位(lite),第一次用树莓派还是遇到挺多坑的,所幸社区完善,再加上一点点的肝,问题都解决了。比如,烧录系统时,初始设定的用户名不能为root,因为Debian默认禁用root登录。还有在给apt换源时要注意树莓派的系统版本以及64位,换源url要匹配,因为网上的教程大多数都是针对32位操作系统的。
语音助手,肯定是要有音频输入和输出的,输入采用的是一个USB迷你麦克风,输出则是外接蓝牙音箱,可以通过alasmixer命令调节麦克风和输出的音量。注意蓝牙连接时需要安装pulseaudio 和pulseaudio-module-bluetooth包。(这也是个坑)
首先要解决语音唤醒问题,提前已经做好功课了,采用snowboy进行关键词唤醒,那么针对64位系统,也要修改对应的makefile文件,进行编译才能够正常使用。
语音唤醒完成后,按照程序执行,此时应该开始录制音频,一个关键的问题就是判断语音的终结点,即语音端点检测(VAD)。这里采用speech_recognition包,首先测量环境音确定噪声阈值,再开始录制,随后确定终结点。
在获取到音频文件后,下一步就要将语音转换成文字(speech-to-text),比较腾讯云和Microsoft Azure ,果断选择Azure认知服务。(腾讯云只送几个月,真的扣,而Azure每个月都送额度,效果也很不错)
获取到相应的文字后,关键一步来了!根据文字内容,程序会做出不同的反应,比如音乐的播放控制,声音控制,音乐的搜索。比如家具的控制,程序的退出等。如果并非这些控制指令,则接入GPT。发送请求到gpt-3.5,当前的模型时gpt-3.5-0613-16k,等待返回消息。这一步实际上是很花时间的,因为需要针对不同的语音指令做适配,每一个功能都需要新建一个模块进行单独处理。这一处理过程由大量的if语句堆砌而成,是一个既简单又粗暴的解决方式,实际上并不优雅。(可能会问为什么不把所有的请求都过一遍GPT,依靠它的语义理解进行控制呢,这里考虑的是用户的速度体验,而且这种做法会导致token的急剧消耗。)
值得一提的是,针对GPT的接口,我也做了一些优化处理,使其能够联网搜索,在token超限时总结对话,获取时间,地点,也能够有记忆能力。(程序重启能够记住前文)
在完成上一步任务后,指令被分流到各个处理模块,在模块处理完成后,一切都要“说”出来,即文字转语音(text-to-speech),毫无悬念,用的是微软的晓晓tts,这也是语音助手的名字,没办法,声音太好听了,可以说微软的tts萌生了我做这个项目的想法,也是动力。当然这个Azure的注册还是有门槛的,需要visa信用卡。
此时,程序已经基本完成了一次运行,还要根据条件判断是否接续对话(不用再次唤醒,直接说话就好),是否中断对话,开启新对话(也就是说可以中途打断它,然后继续问它问题),还有各种异常捕获处理等等,不一而足。
重点还是挺多的吧,不过对于我一个月的工作量,这还不够,“晓晓”具有消息通知功能,整点报时?小case。它能够实现手机消息的实时获取(配合手机软件MacroDroid),可以实现的功能包括但不限于手机低电量,满电量提醒,微信、QQ,任意社交软件以及应用的消息通知(可以指定灭屏时提醒,可以指定消息的内容和播报格式),并提供回家场景,离家场景的一系列联动,可以说限制你的只有想象力。
“晓晓”具有音乐播放功能,能够获取你的音乐日推(这里适配的音乐软件是QQ音乐),按照你的音乐喜好播放音乐,并具备音频闪避(当有消息通知时,或者正在与“晓晓”进行对话时,自动降低音量,结束时自动调整回音量。)播放,暂停,下一首,音量设置,音乐搜索,一切都不成问题。其实实现这一效果还是费了很多力气的…
“晓晓”具有遥控控制的功能,在环境声音嘈杂时,语音唤醒频繁误触发,调低阈值则会出现“耳背”的情况,同时语音端点监测也会有失效的可能。为此设计控制器,采用esp-12f芯片,udp协议。当控制器连接到“晓晓”时,晓晓将自动关闭语音唤醒,当按下控制器的按键时开始录制,松开时停止录制,并将声音交由“晓晓”处理,完成既定的内容,控制器也支持语音唤醒的开关,使“晓晓”能够胜任嘈杂的环境。其实第一版方案是将录音集成在控制器上,但是失败了,还没查清楚原因(IIS音频相关),只能退而求其次,发送指令,让“晓晓”录音,后续有条件会继续实现该功能,如此才是最佳的解决方案
好了,这差不多就是我这一个月在做的事情,接下来实际上还有相当多的工作要做。待实现的功能有:
家具控制,这一方面其实已经有控制方法了,但是采用WIFI协议,功耗降不下来,电池供电力不从心,考虑采用zigbee模块,还在学习。接着我会探索HomeAssist相关,以实现未来家庭的自动化控制。
日程提醒,维护一个日程表,可以语音添加相关的提醒项目,等到相应的事件就会提醒你,类似小爱同学语音设置闹钟。
离线在线双模式,一些基本的功能可以脱离互联网,语音识别,语音合成也可以在本地完成(只不过效果不如在线),之前已经做了一些相关的工作。(vosk)
机器学习,这一部分主要是提升逼格,正在学习,不做过多解释。
手机APP控制,仅仅是在设想中,可做可不做,做了会更方便。
SMB文件管理中心,有了这个就可以局域网传文件,方便,快速。
附加屏幕,考虑增加一块屏幕,显示一些信息,提升体验(不过屏幕控制还要学习)
小爱开放平台接入,看看能不能实现小爱直接说话控制。
上面很多只是讲解了功能,因为要是涉及原理,那要说的就太多了,要倒的苦水就太多了呜呜呜,“晓晓”基本的功能就是这样,以后就缓慢更新迭代了,会研究一些其他的东西。(上一次这么肝还是毕设…)
写了几个小时,写累了,下次再说吧。还有一个月就要开学了,加油多学点东西,屏幕控制、机器学习。当然最重要的是身体呀。早点睡觉,早点睡觉,早点睡觉。(碎碎念…)