借助于python构建语音交互的智能机器人(自动发消息、发邮件、播放音乐、人机对话、网页检索功能,含完整代码)

您所在的位置:网站首页 python交互设计 借助于python构建语音交互的智能机器人(自动发消息、发邮件、播放音乐、人机对话、网页检索功能,含完整代码)

借助于python构建语音交互的智能机器人(自动发消息、发邮件、播放音乐、人机对话、网页检索功能,含完整代码)

2024-07-16 22:30| 来源: 网络整理| 查看: 265

Author:qyan.li

Date:2022.6.7

Topic:借助于python构建语音交互的智能机器人

一、写在前面:

​          ~~~~~~~~         经过几天的努力,基于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']) return [sign, result_out]

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

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

#语音播报函数 def speech_read(content): ''' :param content:待播报的字符串 :return: None ''' #模块初始化 engine = pyttsx3.init() engine.say(content) # 等待语音播报完毕 engine.runAndWait()

​          ~~~~~~~~         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)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3