自制Home Assistant语音助手

准备DIY一个Home Assistant的语音助手玩。预定采用ESPHome和ESP32。乐鑫官方还有个esp32-s3-box-3的套件,集成了触摸屏幕喇叭麦克风和巨多的扩展接口,ESPHome直接支持了可以一键刷机使用。但是价格真的贵炸了要三百大洋。而且买成品有什么意思,折腾本身就是娱乐,当然是要自制啦。

部件清单

  • 单片机:ESP32-S3-N16R8(20元
  • 喇叭:淘宝买的圆形4Ω3W的1.5寸,带腔体,屁股还带一个被动振膜(9元
  • 功放:MAX98357模块(3元
  • 麦克风:INMP441模块(9元

单片机得买大PSRAM内存的,音频应用十分吃资源。

组装

因为自信直接焊接导线而不是用杜邦线或者面包板,I²S信号线找到空的未占用的GPIO引脚,按方便的焊就行了。功放5v供电直接焊到5v转3.3v LDO芯片的输入上面。喇叭组件一次焊好没问题,这时候我就直接刷入ESPHome固件,配置了media_player测试,从HA里可以当个无线音箱使用。音质还意料外的不错,比手机好一些。

麦克风则是小翻车了,配好唤醒词之后发现怎么都不唤醒,刷了一个读取数据并打印的测试程序进去才发现没读到数值。原来是多股导线穿过PCB孔的时候,一股细铜丝散落出来搭到麦克风外壳上短路了。还好只是信号线短路,不是电源短路,没烧。

固件

把ESPHome用Docker部署,就可以用Web Serial直接烧录程序了(localhost访问大概不需要强制https)。配置好yaml文件就算做好固件了,不用写代码胜似写代码。

ESPHome刚需魔法上网不然依赖安装极大概率失败。虽然表面装出很自动化很简洁的样子,编译并直接安装会故意隐藏编译日志,再加上程序写的烂把后台实际返回了的日志丢掉了,导致出错(大概率事件)后想看日志居然要重新编译一遍,神奇的逻辑。

我的代码:https://github.com/krrr/esphome_va

只需要改一下GPIO引脚的位置就能直接用。唤醒词用的内置的okay nabu。唤醒之后会播放一个提示音,并利用开发板自带的rgb led灯显示状态。

大语言模型

模型直接白嫖谷歌Gemini Flash,套上魔法上网后在HA里面添加Google Generative API即可。取消使用推荐配置选项,手动选择Flash2.5 Lite模型,它生成速度最快,首字延迟最低,非常适合语音助手。等待真的很烦躁,宁愿智力低一点。

TTS和STT

Speech2Text使用本地部署sherpa-onnx,https://github.com/yaming116/sherpa-onnx-asr

Text2Speech本地部署的kokoro-fastapi勉强也还行,但是很不自然(对中文支持不好)。还是直接白嫖微软的edge-tts了,https://github.com/hasscc/hass-edge-tts

 

最终效果

唤醒词检测是基于神经网络的,还使用了ESP32 S3的硬件加速,很快很准非常不错。想要自定义得训练自己的模型。

唤醒后进入大模型之前,讲话结束检测有问题,有时候说话完毕还会一直等待15秒超时才开始识别。待研究

大模型接管之后,最简单的读温度计数值、开关电器之类的还行。有时候不太聪明,比如我有电脑联动插座开关和电脑插座功耗两个实体,问电脑插座功耗是多少却把联动插座给关了。去公开实体里去掉联动插座就能读出功耗了。

麦克风能识别到的范围也很近,不大声说话只有两米距离。待研究

暂无评论

发送评论 编辑评论


				
上一篇