除去自身逻辑模块,语音助手主要分为四个功能模块:
钉钉模块、爬虫模块、语音模块、唤醒模块。
各功能模块代码实现逻辑:
钉钉模块:
首先,钉钉的官方sdk分为旧版和新版,两者都有其不同的功能实现,dingtalk.api这个sdk作为源码覆盖至你的项目下,作为项目内部module来引用它。alibabacloud_dingtalk能够通过pip install 将sdk安装至python开发环境的全局module中来引用。两者在使用上的区别是,前者需要在发起请求是填入不同功能的url来实现不同的需求,但是总体代码结构很简单。
后者将所有功能接口的url封装在一个个方法类中,提供给使用者直接调用方法来实现不同的需求,但是总体代码结构较为复杂。
钉钉模块的实现逻辑如下图:
为每个功能实现定义方法,main函数作为机器人语音指令进入钉钉接管后的二级菜单,通过输入的语音指令匹配关键字来实现具体方法的运行,从而实现获取公告、发布公告等功能,除了退出钉钉接管,其他方法在运行完之后会进入整个循环体的下一次循环,退出钉钉接管后,会返回语音助手的一级菜单。
爬虫模块:
爬虫模块代码逻辑采用异步多线程方式,主要原理就是根据官网链接的分页参数对每一页的url存入page_list,而后通过多线程异步对page_list中的url发起批量化请求,获取响应数据后通过etree.HTML过滤掉html页面的其他参数,比如
语音模块:
语音模块主要包括 音频播放,文本转语音,语音转文本,音频录制等。音频播放,百度接口调用这类逻辑性不强没什么好说的,音频录制主要就是把command.wav作为语音助手程序的全局指令交换文件,任何一次的指令录入都会刷新这个文件的内容,这个是为了避免方法调用的时候总是需要指定一个新的文件名称,为开发提供方便,而且节约资源。语音唤醒,通过语音助手主行数while循环中每5秒录制一段音频并做转文本处理,最后判断文本中是否存在关键字,如存在则语音助手将被唤醒,实际上唤醒只是语音助手播放一段告诉你它的程序存活的语音而已,针对这种方法来实现语音唤醒,其实会消耗一定的请求资源,百度AI语音识别接口提供15万次的免费请求次数,通过计算假设你运行了语音助手一整天时间,你将会使用掉17280次请求次数,这个用量是相当大的,所以如果没有需要演示语音助手的话,需要传递退出指令给语音助手将进程结束掉。关于语音唤醒,市面上现在有另一种更为科学经济的方案,通过一个声音传感器,识别声道中是否有音波存在,如果存在再去执行语音录入以及语音识别的请求。
使用playsound播放音频文件时,由于playsound的默认编码的utf-16,这将导致音频播放结束后程序抛出异常,需要找到playsound源码将encode(’utf-16’)注释掉。
为了节省资源,项目中常用语音通过单词文本转语音的方式,保留mp3文件,调用时,只需playsound对应的mp3文件即可,无需再对文本内容进行转语音操作。
麦克风采样频率报错问题解决:
在使用pyaudio进行音频采集的时候出现
IOError: [Errno Invalid sample rate] -9997的错误
vim ~/.asoundrc 这个文件 粘贴一下内容。
pcm.!default {
type asym
playback.pcm {
type plug
slave.pcm "hw:0,0"
}
capture.pcm {
type plug
slave.pcm "hw:1,0"
}
}
ctl.!default {
type hw
card 1
}
[
](https://blog.csdn.net/u013860985/article/details/79326379)
操作手册
启动语音助手 执行命令 python rabot.py
一级菜单(语音指令包含关键字)
资料 爬虫程序
钉钉/接管 钉钉程序
没有 待机状态
“语音助手名称” 唤醒
再见 结束程序
二级菜单
钉钉
查公告 输出公告
发公告 发布公告
会议 发起会议
安排/日程 输出日程
退出钉钉 退出钉钉程序
所需硬件 麦克风 鼠标 键盘 hdmi线 音响 网线