一、写在前面:

​ ~~~~~~~~ 经过几天的努力,基于python构建语音交互的智能机器人终于完成,今天这篇文章会完善阐述一下系统的总体架构,将前面的四篇文章串联起来,形成一个完善的系统。完整的项目代码已经上传至github,链接会在最后给出,需要的同学可自行下载参考。

​ ~~~~~~~~ 前序四篇功能实现的博文链接如下,可自行参考:

借助于网络爬虫构建天气查询系统

借助于浏览器自动化技术实现网页内容检索

借助于python实现qq,微信消息自动发送,音乐自动播放

借助于python实现邮件的自动化发送

二、系统简介:

​ ~~~~~~~~ 智能系统的主要功能实现在前面四篇博文中已成功完成,系统的总体框架图如下:

​ ~~~~~~~~ 上述的所有功能(除智能聊天功能外),其他所有的功能均在前四篇博文中分篇进行阐述,由于智能聊天功能较为简单,且核心为调用现有方法,因此不做详细展示。

​ ~~~~~~~~ 在完整的代码中,智能机器人的各个功能实现已经实现完美的封装(使用class类,函数),因此,调用起来也比较简单,故系统综合的阶段需要考虑如何将各部分功能实现的代码串联起来,实现完整使系统的构建。

​ ~~~~~~~~ 首先,由于是借助于语音实现系统交互,因此必须存在音频录制和音频识别的模块。音频录音的代码较为简单,网络资源也比较丰富,下面提供自己音频录制的代码,仅供参考。

#声音录制设置

CHUNK = 1024

FORMAT = pyaudio.paInt16 # 16位深

CHANNELS = 1 #1是单声道,2是双声道。

RATE = 16000 # 采样率,调用API一般为8000或16000

RECORD_SECONDS = 10 # 录制时间10s

#录音文件保存路径

def save_wave_file(pa, filepath, data):

wf = wave.open(filepath, 'wb')

wf.setnchannels(CHANNELS)

wf.setsampwidth(pa.get_sample_size(FORMAT))

wf.setframerate(RATE)

wf.writeframes(b"".join(data))

wf.close()

#录音主体文件

def write_audio(filepath,isstart):

'''

:param filepath:文件存储路径('test.wav')

:param isstart: 录音启动开关(0:关闭 1:开启)

'''

if isstart == 1:

pa = pyaudio.PyAudio()

stream = pa.open(format=FORMAT,

channels=CHANNELS,

rate=RATE,

input=True,

frames_per_buffer=CHUNK)

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):

data = stream.read(CHUNK) # 读取chunk个字节 保存到data中

frames.append(data) # 向列表frames中添加数据data

stream.stop_stream()

stream.close() # 停止数据流

pa.terminate() # 关闭PyAudio

#写入录音文件

save_wave_file(pa, filepath, frames)

elif isstart == 0:

exit()

小Tips:

上述代码实现录制10s的音频,并将音频另存为wav文件,录制的时间可在代码中RECORD_SECONDS变量处进行修改

​ ~~~~~~~~ OK,音频录制的功能实现,如果想利用语音实现智能交互,就必须让智能系统能够理解用户意图,可以借助于文字实现意图理解和判断,因此还必须另写语音转文字的模块。实验中借助于百度云的语音识别接口,其他公司同样提供类似接口(阿里云语音接口调用,参照另一篇博文:(6条消息) 简单记录阿里云语音识别API调用方法_隔壁李学长的博客-CSDN博客),下面提供百度云语音接口调用的代码示例:

# 获取录音文件内容并进行识别

def GetAudioContent(fileName):

'''

:param fileName:录音文件路径

:return: sign-是否获得结果,result_out-返回录音内容

'''

# 读取录音文件内容

with open(fileName,'rb') as f:

content = f.read()

# 调用Baidu-api实现语音识别

sign = 1

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

result = client.asr(content, 'wav', 16000, {'dev_pid': 1537, })

print(result)

if 'result' not in result.keys():

sign = 0

result_out = None

elif result['result'] == ['']:

sign = 0

result_out = None

else:

result_out = "".join(result['result'])

​ ~~~~~~~~ 另外,语音交互不仅仅希望用户使用语音进行控制,更希望智能系统返回的文字结果可以借助于语音的方式进行输出,所以接下来的任务就是构建语音输出模块。

​ ~~~~~~~~ 当然,文字合成语音可以借助于公司现有的API接口,同样可以借助于pyttsx3模块,该模块可以将字符串以语音的形式朗读出来,代码示例:

#语音播报函数

def speech_read(content):

'''

:param content:待播报的字符串

:return: None

'''

#模块初始化

engine = pyttsx3.init()

engine.say(content)

# 等待语音播报完毕

engine.runAndWait()

11

​ ~~~~~~~~ OK,语音交互的模块已完成,但是要实现智能的交互,还有比较重要的模块:语义理解。语义理解首先必须明确用户询问的问题属于哪个类别,以决定后续程序进入哪个function或者class进行执行,这部分是借助于模糊匹配进行实现:

# 模糊匹配函数

def FuzzComparsion(text,shift = 0):

'''

:param text:待匹配的文本

:param shift:取值1或0-待匹配的模板不同

:return: 相似程度列表

'''

similarityLst = []

stencilTextLst1 = ['给李其炎发消息,邮件告诉他我明天有事找他','今天的天气状况怎么样','播放一首炸雷','帮我查一下现在的俄乌局势'] # 匹配的模板文本

stencilTextLst2 = ['QQ', '微信', '邮件']

if shift == 0:

stencilTextLst = stencilTextLst1

if shift == 1:

stencilTextLst = stencilTextLst2

for item in stencilTextLst:

similarity = fuzz.ratio(item,text)

similarityLst.append(similarity)

return similarityLst

小Tips:

​ 代码中构建四个模板,借助于模糊匹配技术,判断用户输入与各个模板的匹配程度,以决定用户询问问题的类别,以进入不同的模块执行不同的命令。

​ ~~~~~~~~ 用户询问问题类别已经确定,而后的任务是提取语句中的主体对象,如问句给文件传输助手发微信告诉他我想它啦!我们需要提取出语句中发送对象文件传输助手,发送方式微信,发送内容我想她啦!,只有具有上述内容之后,我们才能执行后续的操作,邮件的发送也是类似的处理方法。处理的方法我目前还未想到较好的解决办法,只能根据关键词进行识别,比较死板,局限性也比较大。

def MsgDivision(content,key):

'''模板:给***发消息告诉他***

:param content:待处理的文本

:return: friendName发送对象和Msg发送内容

'''

if key == 'w':

friendName = content.split('发微信')[0].strip('给')

if key == 'z':

friendName = content.split('发QQ')[0].strip('给')

Msg = content.split('告诉他')[-1]

return friendName,Msg

​ ~~~~~~~~ 最后,构建代码主逻辑之前,提一下智能聊天的功能实现,本质上就是调用网络上的接口,借助于别人已经实现完成的模块,调用的方式:

#调用机器人

def robot(text = " "):

'''

:param text: 问询的文本

:return: 机器人返回的内容

'''

url = 'http://api.qingyunke.com/api.php?key=free&appid=0&msg='+str(text)

response = requests.get(url)

responseText = response.text.split('"')[-2]

return responseText

​ ~~~~~~~~ OK,代码中涉及语音交互的部分,语句处理的部分基本完成,接下来的任务就比较纯粹,写一个主函数完成代码主体逻辑的构建,该部分写的不太完善,读者可自行修改。

def Mainloop(text):

'''

:param text:待问询的文本

:return: None或者返回的内容

'''

similarityLst = FuzzComparsion(text)

print(similarityLst)

if max(similarityLst) < 30:

# 调用free robot

response = robot(text)

print(response)

else:

max_index = similarityLst.index(max(similarityLst))

if max_index == 0:

# 调用wechat,QQ,Mail模块(模板:给**发**告诉他****)

similarityLst = FuzzComparsion(text,1)

index = similarityLst.index(max(similarityLst))

if index == 0:

# 调用QQ模块

friendName , Msg = MsgDivision(text,'z')

AutoMessage(Msg,friendName,'z')

if index == 1:

# 调用微信模块

friendName, Msg = MsgDivision(text,'w')

AutoMessage(Msg, friendName, 'w')

if index == 2:

# 调用邮件模块

friendName,subject,Mailcontent = MailMsgDivision(text)

AutoSendEmail(friendName,subject,Mailcontent)

pass

if max_index == 1:

# 调用查询天气模块(模板:以城市名称开头,如成都今天天气怎么样?)

content , _ = TextDealing(text)

cityName = content.split(' ')[0]

P = Pinyin()

cityName_pinyin = P.get_pinyin(cityName,'')

Weather = GetWeatherInfo(cityName_pinyin)

print(Weather)

if max_index == 2:

# 调用音乐播放模块(模板:播放**)

MusicName = text.strip('播放')

AutoPlayMusic(MusicName)

if max_index == 3:

# 调用浏览器检索板块

_ , SearchContent = TextDealing(text)

SearchInternet(SearchContent)

三、总结反思:

​ ~~~~~~~~ 系统总体上实现的功能较多,能力不够,数量来凑,其中涉及的知识和技术也比较多,作为一个学习和借鉴的参考还是不错的。

​ ~~~~~~~~ 项目具有的问题和可以改进的地方:

语句处理:语义理解,内容实体提取,尤其是在语音识别识别精度不高,噪声影响大时的处理和解决办法

主循环的编辑,主循环的部分自己没有进行深度的编码和润色,就是简单的调用各个函数,可以以此为抓手改进Mainloop的编码逻辑。

四、完整代码:

​ 许诺大家五篇博文的完整代码:

python构建语音交互的智能机器人相关推荐

  1. Python构建您自己的交互式语音助手 Voice Assistant with Python – Alexa Clone

    构建您自己的交互式语音助手 你会学到: 构建虚拟助理 使用API 根据个人需求修改语音助手 Python编程 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语 ...

  2. python能和c语音交互吗_Python与C交互概述

    1.Python与C交互概述 Python与C/C++交互的三种方式Python扩展:在Python程序中调用C/C++编写的库 Python嵌入:在C/C++程序中调用Python程序 Python ...

  3. python构建智能机器人系列博文---借助于python实现QQ,微信消息的自动发送,音乐的自动播放

    目录 一.写在前面: 二.系统实现: 三.总结反思: Author:qyan.li Date:2022.6.3 Topic:借助于python自动化技术实现指定音乐的播放和QQ,微信消息发送 一.写在 ...

  4. 爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能语音交互

    基于HaaS云端一体框架,用Python打造HaaS EDU K1智能语音助手的过程中需要用到云端能力.本篇文章介绍如何开通阿里云智能语音交互,并创建配置语音识别及语音合成项目,获取Appkey.请参 ...

  5. 声智科技完成2亿元B轮融资,将持续拓展语音交互产品的规模化落地

    整理 | 一一 出品 | AI科技大本营 寒冬之下,不少创业公司依然得到了资本青睐. AI科技大本营消息,12 月 29 日消息,声智科技(SoundAI)已于近期完成 2 亿人民币 B 轮融资,本轮 ...

  6. 美团语音交互部招聘NLP/知识图谱/语音识别等算法职位(可实习)

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 语音交互部负责美团语音和智能交互技术及产品研发,面向美团业务和生态伙 ...

  7. 岗位内推 | 美团语音交互部招聘NLP/知识图谱/语音识别等算法职位(可实习)...

    PaperWeekly 致力于推荐最棒的工作机会,精准地为其找到最佳求职者,做连接优质企业和优质人才的桥梁.如果你需要我们帮助你发布实习或全职岗位,请添加微信号「pwbot02」. 语音交互部负责美团 ...

  8. 【美团语音交互部】 NLP/知识图谱/语音识别等算法职位开放招聘!

    致力于连接最靠谱的算法岗与最强的求职者 招聘贴投放请联系微信xixiaoyao-1 部门介绍: 语音交互部负责美团语音和智能交互技术及产品研发,面向美团业务和生态伙伴,提供对语音和口语数据的大规模处理 ...

  9. 硬核干货,老曹解密“语音交互”背后的黑科技!

    点击▲关注 "中生代技术"   给公众号标星置顶 更多精彩技术内容 第一时间直达 第 6 期出席<大咖来了>直播栏目的嘉宾是百度 DuerOS 首席布道师曹洪伟,进行了 ...

最新文章

  1. python 列表推导式
  2. CAN'T TAKE MY EYES OF YOU
  3. angular之表单
  4. 分享MYSQL中的各种高可用技术(源自姜承尧大牛)
  5. 数据结构之查找算法:分块查找
  6. 深度解读SSH免密登录
  7. mysql笛卡尔积效率_SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积
  8. vim globle
  9. 【高速PCB电路设计】8.DDR模块设计实战
  10. 英语不规则动词变化表
  11. Python 实现王者荣耀自动刷金币
  12. 骨骼动画驱动理解, blender 驱动骨骼
  13. android备忘录的开发总结报告,android备忘录
  14. iMac重装系统的问题:无法与恢复服务器取得联系/将安装器信息下载到目标卷宗失败
  15. java LPT1,java 打印机打印跟开钱箱
  16. MTCNN论文翻译 人脸检测
  17. bde oracle 商友的流程_BDE动态连接Oracle数据库
  18. 如何把FLAC音频转换成MP3格式
  19. MacOS深色模式下微信文章页面背景变为黑色问题的解决
  20. VC++操作Excel生成饼状图!

热门文章

  1. CentOS + Asterisk + FreePBX ——支持蓝牙,AMR-NB audio codec
  2. zookeeper 可视化工具 --- zktools
  3. 关于c语言程序设计的想法,关于《C语言程序设计》学习的几点思考
  4. 电信 PK 网通 【 用户成为棋子 】
  5. 总结几种常见的网络攻击,及解决方案
  6. ❤️整理2万字带你走进C语言(详细讲解+代码演示+图解)❤️(强烈建议收藏!!!)
  7. java 502 bad gateway_502 Bad Gateway的可能原因,及解决方法
  8. 复制ABB机器人系统
  9. Task list not built during sync
  10. 5-13 九宫格输入法 (15分)