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

Author:qyan.li
Date:2022.6.7
Topic:借助于python构建语音交互的智能机器人

一、写在前面:

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

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

二、系统简介:

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

借助于python构建语音交互的智能机器人(自动发消息、发邮件、播放音乐、人机对话、网页检索功能,含完整代码)
​ ~~~~~~~~上述的所有功能(除智能聊天功能外),其他所有的功能均在前四篇博文中分篇进行阐述,由于智能聊天功能较为简单,且核心为调用现有方法,因此不做详细展示。

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

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


CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 16000
RECORD_SECONDS = 10

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)
            frames.append(data)

        stream.stop_stream()
        stream.close()
        pa.terminate()

        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()

    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) < 30:

        response = robot(text)
        print(response)
    else:
        max_index = similarityLst.index(max(similarityLst))
        if max_index == 0:

            similarityLst = FuzzComparsion(text,1)
            index = similarityLst.index(max(similarityLst))
            if index == 0:

                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)

三、总结反思:

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

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

  • 句子处理:语义理解、内容实体提取,特别是在语音识别准确率不高、噪声影响大的情况下。
    [En]

    sentence processing: semantic understanding, content entity extraction, especially when the accuracy of speech recognition is not high and the influence of noise is large.*

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

四、完整代码:

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

Github链接:booue/Intelligent-Robot-Using-Python (github.com)

Original: https://blog.csdn.net/DALEONE/article/details/125197279
Author: 隔壁李学长
Title: 借助于python构建语音交互的智能机器人(自动发消息、发邮件、播放音乐、人机对话、网页检索功能,含完整代码)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/512556/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球