一、前言
这学期闲来无事,于是搞了个简单的家庭语音助手,其主要实现的功能有:
- 语音唤醒;
- 控制家电;
- 询问时间和日期;
- 询问天气情况;
- 查询垃圾分类;
- 播报新闻;
- 微信小程序远程控制
以下是为实现上述功能所需的底层基础:
语音合成、语音识别、多机通信、微机控制、python编程
二、底层基础实现
1)语音合成
如需了解,请移步我的另一篇博客:
《百度AI 开放平台 >>> 语音合成》
2)语音识别
如需了解,请移步我的另一篇博客:
《百度AI 开放平台 >>> 智能语音识别》
3)多机通信
可以选择使用单片机和树莓派各自的串口进行通信。
4)微机控制
就是一些单片机方面的控制,包括电平控制和输出脉冲控制,可以参照我之前的有关stm32 单片机的使用的博客:
https://blog.csdn.net/weixin_40973138/category_9282952.html
5)python编程
用树莓派最好还是使用python,比较方便,支持度也比较高。
三、主要功能实现
1)语音唤醒
所采用方案请参见我的另一篇博客 👉 《如何为DIY的智能音箱赋予语音唤醒能力》
实现方案:让单片机控制声音传感器,等待周围声音的触发。当检测到周围有达到一定分贝的声音时,便认为可能有用户正在对语音助手进行呼唤,于是通过串口发送指令给树莓派,树莓派接收到指令后便开始录音,当检测到音频中有关键词信息时,则可以确认是用户的呼叫,这样就实现了语音唤醒功能。
不过这个方案也有着一定的不足之处:在声音传感器检测声音信号到树莓派开始录音这一段时间不算太短,所以我们可能在喊关键词之前要先激活树莓派,等树莓派开始录音之后再喊关键词。
2)控制家电:
实现方案:树莓派检测到音频中有控制家电的关键词信息(例如开灯、关窗等),则通过串口发送指令给单片机,随即单片机通过控制电平或其他通讯方式控制家电。
3)询问时间和日期
实现方案:树莓派检测到音频中有询问时间或日期的关键词信息,调用python的datetime库的
datetime.now()
和time库的time.localtime(time.time())
获得当前时间和日期,然后再通过语音合成将时间日期播报出来。
4)询问天气情况
可使用:和风天气API,只需要注册一个开发者账户,然后按照其开发文档的要求格式进行数据请求:
# 深圳
https://free-api.heweather.net/s6/weather/now?location=shenzhen&key=2e3adxxxxxxxxxxxxxxxxxxa704c2
然后把数据中的天气信息拿出来即可。
实现方案:树莓派检测到音频中有询问天气情况的关键词信息,通过调用和风天气API 获得某地天气信息,然后再通过语音合成将某地天气情况播报出来。
5)查询垃圾分类
可使用:https://www.mxnzp.com/api/rubbish/type?name=,只需要在这个url后面添加想要查询的垃圾名称即可,例如香蕉皮:
https://www.mxnzp.com/api/rubbish/type?name=香蕉皮
返回结果:
然后把其中的垃圾类别拿出来即可。
实现方案:树莓派检测到音频中有查询垃圾分类的关键词信息,通过调用查询垃圾分类API 获得垃圾类别信息,然后再通过语音合成将该垃圾所属类别播报出来。
6)播报新闻
可使用:https://github.com/public-apis/public-apis,其中包括查询新闻的API
实现方案:树莓派检测到音频中有询问新闻的关键词信息,通过调用查询新闻API 获得某类新闻信息,然后再通过语音合成将新闻播报出来。
有时说不定还要汉字转拼音什么的,可以用天行数据API
7)微信小程序远程控制
我们知道,当树莓派连接家庭WiFi 时,其并不具备公网IP,所以为了让微信小程序能够远程控制树莓派,从而控制家电的目的,我们需要对树莓派进行内网穿透,该过程可以参考我之前写到博客:
《树莓派 >>> 端口映射到公网》
如此一来,在我们的小程序端向该公网端口发送数据,我们的服务器就能够将数据转发至树莓派,从而实现控制局域网树莓派的功能。
四、额外功能拓展
为语音助手赋予视觉能力,担当家庭守门人工作 👇
《如何用树莓派制作一个可语音交互的家庭智能监控》