毕业设计也就那么回事吧...

六月毕业季,除了同窗四年不舍分别的基情友情爱情,还有毕业设计这个大BOSS在最后一关等着我们。

选题

一开始得知可以自拟题目,就决定自拟题目,当时在鼓捣树莓派语音相关的,就自拟了个“基于树莓派的智能家庭语音助理”。想着当时学校了解树莓派的老师或同学比较少,我一个软件工程专业的做硬件相关的设计一来不容易和其他同学内容雷同(学校给的题目中管理系统设计占比挺多的),二来也不容易被老师”为难”。

课题的内容如下:

1
本系统借助树莓派和python3语言,开发出一个智能的家庭语音助理,旨在让我们的生活更加便捷和丰富。通过该语音助理,可实现语音设置闹钟、提醒、听音乐、听笑话、故事、翻译、控制电器等功能,并且还可通过微信公众号实现远程检测控制,比如拍照,控制电器等。

准备

开题答辩意外的很容易就通过了,参与答辩的老师也没啥问题。于是就按照我的想法和开题答辩的内容开始准备了。主要是硬件准备:

  • 树莓派3B
  • USB麦克风
  • 扬声器
  • 树莓派摄像头
  • 摄像头舵机平台
  • 红外发射
  • 红外接收
  • 16位WS2812(做语音助手的状态指示灯), 8位WS2812(模拟智能灯)
  • DHT22温湿度传感器
  • ESP8266

硬件连线图:

  1. 树莓派主体:

  1. 温湿度传感器,DHT22和ESP8266

设计

在之前了解到有一个树莓派语音助手的开源项目叫做 叮当,想着要不借鉴一下,奈何总是看不进去别人的代码,就此作罢,从头设计。
我的毕业设计主要分为两个系统:语音助手和微信公众号

  1. 语音助手:
    是整个设计的主体, 通过语音交互实现各种功能。

  1. 微信公众号:

设计微信公众号的目的是可以随时随地在手机上通过微信查看家里的信息,控制家里的电器,微信报警等

功能模块

总的来说有以下若干子模块:

语音唤醒

采用了一个开源的语音唤醒引擎: snowboy, 选择了”小爱同学”这个唤醒词, 并不是因为要模仿小米的智能音箱, 而是这个唤醒词训练的人比较多,误唤醒概率相对低一些(但效果仍然远不及商业的唤醒词)。

语音录制

使用pyaudio来进行语音录制,webrtcvad来做VAD(语音端点活性检测), 简单的来说就是被唤醒后检测到说话才开始录音,说话结束也随即结束录音。webrtc的vad使用GMM(Gaussian Mixture Mode)对语音和噪音建模,通过相应的概率来判断语音和噪声,这种算法的优点是它是无监督的,不需要严格的训练。
语音录制的整个流程如下:

语音识别

使用的百度语音识别, 只需将上一步保存的录音文件通过API上传至百度的服务器,就可获取到识别之后的结果。

语义分析

获取到语音识别结果以后,需要分析该结果,以便做出相应的回复。首先将语句进行分词处理,以便进行下一步的分析。我使用的是结巴分词,再根据分词结果来解析出该语句的意图和部分重要信息,比如时间,人名,歌手,歌曲名等关键信息。具体流程图如下:

语音合成

当判断出说话者的意图之后,需要立即做出回复,包括语音回复、播放音乐、设置闹钟、调节音量、控制设备等回复。语音回复是需要借助语音合成的功能,把要回复的文字合成音频,然后播放出来。语音合成也使用了百度的语音合成。流程比较简单:

播放器

语音作为给用户最直接的反馈,其播放方式和方法直接影响到用户体验。我使用了gstreamer框架作为播放器后端,能够进行mp3、wav、ogg、网络流媒体等音频格式的播放,播放器子进程的方式运行在后台不断查询播放状态和播放任务,并根据播放任务和当前的状态进行“智能”的播放语音。语音播放的逻辑如下:

技能

作为智能音箱卖点之一,技能的丰富度决定了音箱的可玩性。在我的这个毕设中,实现了以下几个技能:

音乐播放

当识别到用户播放音乐的意图时,从用户的话中提取出歌曲名和歌手关键词, 根据关键词去网易云音乐爬取相应的歌曲链接, 从而在本地播放。如果只有歌手名没有歌曲名(比如: 我想听王力宏的歌)会在王力宏的歌单列表里随机选一首播放。

天气

识别到询问天气意图时会去百度搜索天气相关的信息,比如:今天天气怎么样? 会以关键词 “天气” 在百度搜索,明天成都的天气怎么样? 会以 “成都 天气” 为关键词在百度搜索, 并解析出对应日期的天气。

笑话

在本地有一个笑话列表, 会随机选一条笑话来回复

定时、闹钟、提醒

识别到用户想要设置提醒闹钟等意图时(比如: 倒计时五分钟, 明天下午六点半提醒我收衣服, 后天早上七点提醒我起床,三分钟后叫我关电脑等), 会解析出对话中的时间、事件, 写入数据库, 同时有一个子进程一直监测数据库中的定时任务, 当某个任务到达设定时间之后会播放语音和音乐来提醒用户。

翻译

解析出对话中要翻译的词语,

普通对话

普通对话使用的图灵机器人的API,图灵机器人本身就提供了很多技能,比如:笑话、故事歇后语、绕口令、顺口溜、天气、菜谱、快递、酒店、物价、邮编等。(上面自己写的笑话、天气是为了练练手,凑一下毕设内容,其实完全可以用图灵机器人的技能)

控制智能家居

控制智能家居我使用的是当匹配到自定义控制语句就执行相应的动作, 比如匹配到”打开卧室的灯”就执行开灯这个方法,语句和对应的方法完全可以自己定义的。作为演示,我用esp8266做了一个简单的能连接wifi的灯,通过mqtt来控制。

微信公众号