基于“机器学习”智能聊天机器人---python实现(2)

本博文上接上一篇博文“基于“机器学习”智能聊天机器人---python实现(1)”
博文链接:https://blog.csdn.net/DALEONE/article/details/118652833?spm=1001.2014.3001.5502


一、关键技术分析

1.网页自动化

(1)网页自动化技术简介:
利用python实现网页自动化操作是编程操作中的重要模块,包含自动化打开网页,自动登录,自动输入等等操作,在本项目中,主要利用python的selenium模块中的webdriver命令实现自动打开特定网页,便于用户检索和信息获取。
selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口。
selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web-app测试。
(2)网页自动化代码实现:
首先在python中引入selenium模块:from selenium import webdriver
然后调用webdriver命令打开firefox浏览器,并通过get命令打开特定网页

代码实现:
#网页自动化函数
def web_open(result):
    '''
    :param result: 搜索框输入内容 
    '''
    driver = webdriver.Firefox()
    driver.get(result)
在上篇博文中提到,项目机器人提供高校查询板块,高校查询板块实现的具体方式为用户输入通过一系列处理匹配至特定高校,数据库中提取出高校对应的网址,利用python的网页自动化操作,打开特定网页供用户浏览和查询。

6.语音处理

(1)语音处理技术简介:
pyaudio简介:
Pyaudio是python一个强大的第三方语音处理库,python的pyaudio可以进行录音,播放,生成wav文件等等操作,wave是录音时用的标准的windows文件格式,文件的扩展名为wav,数据本身的格式为pcm或压缩型,属于无损音乐格式的一种。在进行语音识别,自然语言处理的过程中,常常会使用到它,本实验中借助pyaudio调用电脑麦克风实现录音操作。

Pyttsx3简介:
Pyttsx3是python语音朗读的第三方库,可以通过简单初始化操作以及调用实现的字符串的朗读,在项目中利用pyttsx3实现返回结果的朗读。
engine = pyttsx3.init()实现初始化,同时调用engine的say功能实现字符串朗读。

百度语音简介:
百度短语音识别可以将60秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景。
接口类型:通过 REST API的方式提供的通用的HTTP接口。适用于任意操作系统,任意编程语言
接口限制:需要上传完整的录音文件,录音文件时长不超过60秒。浏览器由于无法跨域请求百度语音服务器的域名,因此无法直接调用API接口。
支持音频格式:pcm、wav、amr、m4a
音频编码要求:采样率 16000、8000,16 bit 位深,单声道(音频格式查看及转换)

调用流程:
(1)创建账号及应用:在 ai.baidu.com控制台中,创建应用,勾选开通“语音技术”短语音识别、短语音识别极速版。获取AppID、API Key、Secret Key,并通过请求鉴权接口换取token。
(2)创建识别请求:POST方式,音频可通过JSON和RAW两种方式提交。JSON方式音频数据由于 base64编码,数据会增大1/3。
(3)短语音识别请求地址:http://vop.baidu.com/server_api
(4)返回识别结果:识别结果会即刻返回,采用JSON格式封装,如果识别成功,识别结果放在 JSON的“result”字段中,统一采用 utf-8 方式编码。
(2)语音处理代码实现:
代码实现:
#声音录制设置
CHUNK = 1024
FORMAT = pyaudio.paInt16         # 16位深
CHANNELS = 1                     #1是单声道,2是双声道。
RATE = 16000                     # 采样率,调用API一般为800016000
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 get_audio(filepath,isstart):
    '''
    :param filepath:文件存储路径('test.wav':param isstart: 录音启动开关(0:关闭 1:开启)
    '''
    if isstart == 1:           # 录音启动开关为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:       # 录音启动开关为0,退出函数
        exit()

#获得录音文件内容
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

#百度语音识别编码
APP_ID = '********'
API_KEY = '************************'
SECRET_KEY = '********************************'  # 百度智能云官网申请,此处换为自己的API接口

#语音模块主体函数
def speech_record(isstart):
    '''
    :param isstart: 录音启动开关(0:关闭 1:开启)
    :return: sign:是否获取到声音信号(0:未获取 1:获取到) 
             result_out:返回识别的语义信息(none为未获取到语音信息)
    '''
    sign =1              # 初始化录音启动开关
    result_out = ""      # 初始化内容字符串
    filepath = 'test.wav'
    get_audio(filepath,isstart)
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    result = client.asr(get_file_content('test.wav'), 'wav',16000,{'dev_pid': 1537,})
    if 'result' not in result.keys():  # 返回字典中并无"result"的key值
        sign = 0
        result_out = None
    elif result['result'] == ['']:     # 返回字典中"result"的value值为空
        sign = 0
        result_out = None              # 上述两种模式均未获得任何内容,返回为空none
    else:
        result_out = "".join(result['result'])
    return [sign,result_out]


#语音播报函数
def speech_read(result):
    '''
    :param result:待朗读字符串 
    :return: 无返回None
    '''
    # 模块初始化
    engine = pyttsx3.init()
    # print('准备开始语音播报...')
    engine.say(result)
    # 等待语音播报完毕
    engine.runAndWait()

7.图形化用户交互界面

(1)图形化用户交互界面技术简介:
图形化用户交互界面简介:
GUI 是 Graphical User Interface 的简称,是指采用图形方式显示的计算机操作用户界面。 与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。图形化可以极 大方便用户在终端上进行操作,减少人机交互的复杂性。
在实验中,为以多种方式呈现实验结果,故在语音处理外添加另外的结果展示形式---GUI, python 中经常利用tinker 和pyqt 进行图形化用户交互界面设计,由于使用tinker 进行界面设计步 骤过于繁杂,故在本实验中采用pyqt 进行界面设计。

PYQT模块说明:
pyQt 是一个创建GUI 应用程序的工具包。它是Python 编程语言和Qt 库的成功融合,利用 pyqt 可以实现代码和界面的分离,同时可以通过“拖拽”等等方式实现界面设计,极大程度上简化 图形化用户交互界面的设计难度。
pyqt 主要利用pyqt designer 和pyuic 两个工具包,实现图形化用户交互界面设计: 设计者可以在pyqt designer 中通过“拖拽”等等方式实现界面设计,而后通过pyuic 工具实现界面 向代码的转换。
最终,仅需要在转换成功的代码中添加相应的命令即可完成程序和界面结合,完成图形化用户 交互界面设计。
(2)图形化用户交互界面代码实现:

代码实现:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'robot.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QtCore.QRect(140, 60, 501, 221))
        self.groupBox.setObjectName("groupBox")
        self.label = QtWidgets.QLabel(self.groupBox)
        self.label.setGeometry(QtCore.QRect(10, 30, 72, 15))
        self.label.setObjectName("label")
        self.textBrowser = QtWidgets.QTextBrowser(self.groupBox)
        self.textBrowser.setGeometry(QtCore.QRect(10, 60, 471, 31))
        self.textBrowser.setObjectName("textBrowser")
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        self.label_2.setGeometry(QtCore.QRect(410, 130, 72, 15))
        self.label_2.setObjectName("label_2")
        self.textBrowser_2 = QtWidgets.QTextBrowser(self.groupBox)
        self.textBrowser_2.setGeometry(QtCore.QRect(15, 170, 471, 31))
        self.textBrowser_2.setObjectName("textBrowser_2")
        self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_2.setGeometry(QtCore.QRect(140, 330, 501, 181))
        self.groupBox_2.setObjectName("groupBox_2")
        self.textEdit = QtWidgets.QTextEdit(self.groupBox_2)
        self.textEdit.setGeometry(QtCore.QRect(10, 30, 481, 87))
        self.textEdit.setObjectName("textEdit")
        self.pushButton = QtWidgets.QPushButton(self.groupBox_2)
        self.pushButton.setGeometry(QtCore.QRect(260, 140, 93, 28))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox_2)
        self.pushButton_2.setGeometry(QtCore.QRect(390, 140, 93, 28))
        self.pushButton_2.setObjectName("pushButton_2")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.groupBox.setTitle(_translate("MainWindow", "聊天界面"))
        self.label.setText(_translate("MainWindow", "机器人:"))
        self.label_2.setText(_translate("MainWindow", "交流者:"))
        self.groupBox_2.setTitle(_translate("MainWindow", "发送界面"))
        self.pushButton.setText(_translate("MainWindow", "发送"))
        self.pushButton_2.setText(_translate("MainWindow", "取消"))
利用python制作图形化用户交互界面主要有两种方式---(1)tinker(2)pyqt 由于pyqt实现图形化用户交互界面比tinker更加简洁高效,因此本项目中利用pyqt制作图形化用户交互界面。
利用pyqt,设计者可以在pyqt designer中通过“拖拽组件”的方式构建图形化用户交互界面,另外通过pyUIC直接生成用户交互界面代码,最终编写代码将界面与程序结合起来即可以完成图形化用户交互界面制作。

二、智能聊天机器人主程序

1.语音处理模式

代码展示:

#程序运行主函数
if __name__ == '__main__':

    #贝叶斯分类器训练
    train_data_apply = jieba_text(train_data)[1]
    train_label_apply = jieba_text(train_label)[0]
    train_array = tf_idf(train_data_apply,['你好'])[0]
    model_apply = bayes_model(train_array,train_label_apply)

    #起始播报
    greeting1 = '你好,我是智能机器人zz,我可以陪你聊天,也可以帮助您查询院校信息'
    greeting2 = '让我们开始聊天吧'
    speech_read(greeting1)
    speech_read(greeting2)

    #主循环
    while True:
        a = speech_record(1)
        print(a)
        if a[0] == 0:
            sph = '你还在吗?我走啦'
            speech_read(sph)
            speech_record(0)
            break
        elif a[0] == 1:
            similarity = fuzz.ratio(a[1], "拜拜")
            if similarity > 50:
                reply = '今天和你聊的很开心,再见啦,拜拜'
                speech_read(reply)
                speech_record(0)
                break
            else:
                input_list = jieba_text(a[1])[1]
                input_apply = tf_idf(train_data_apply,input_list)[1]
                value = model_apply.predict(input_apply)

                if value == [' A ']:
                    reply = get_greeting(a[1],question_greeting,answer_greeting)
                    if reply == None:
                        reply_none = 'zz才疏学浅,对主人的问题无能为力'
                        speech_read(reply_none)
                    else:
                        speech_read(str(reply))
                if value == [' B ']:
                    reply = get_greeting(a[1],question_dataset,answer_dataset)
                    if reply == None:
                        reply_none = 'zz才疏学浅,对主人的问题无能为力'
                        speech_read(reply_none)
                    else:
                        speech_read('我为你找到以下内容,你可以在本网页上查询院校信息')
                        web_open(str(reply))
                        break
在语音交互模式中,项目机器人最大程度模仿人与人之间对话交流的场景,用户通过语音与智能机器人完成交互。
同时,为最大程度模仿人类交流,项目设计类人模块,如长时间未检测至用户语音输入,模仿人与人对话交流中长时间未对话,程序会语音提醒,并自动退出程序。另外,机器人可较为完美的完成预先设置的两种功能:(1)娱乐聊天(2)高校查询,在高校查询功能中,程序除去语音提醒,同时会自动打开与用户输入相匹配的高校网页,供用户浏览和查看。

2.图形化用户交互界面模式

代码展示:

#贝叶斯分类器训练
train_data_apply = jieba_text(train_data)[1]
train_label_apply = jieba_text(train_label)[0]
train_array = tf_idf(train_data_apply,['你好'])[0]
model_apply = bayes_model(train_array,train_label_apply)

def on_click(self):
    text_1 = ui.textEdit.toPlainText()  # 用户输入
    ui.textBrowser_2.setText(text_1)
    input_list = jieba_text(text_1)[1]
    input_apply = tf_idf(train_data_apply, input_list)[1]
    value = model_apply.predict(input_apply)

    if value == [' A ']:
        reply = get_greeting(text_1, question_greeting, answer_greeting)
        if reply == None:
            reply_none = 'zz才疏学浅,对主人的问题无能为力'
            ui.textBrowser.setText(reply_none)
        else:
            ui.textBrowser.setText(str(reply))
    if value == [' B ']:
        reply = get_greeting(text_1, question_dataset, answer_dataset)
        if reply == None:
            reply_none = 'zz才疏学浅,对主人的问题无能为力'
            ui.textBrowser.setText(reply_none)
        else:
            ui.textBrowser.setText('我为你找到以下内容,你可以在本网页上查询院校信息')
            web_open(str(reply))

def off_click(self):
    ui.textEdit.clear()#清除聊天框内容的操作

app = QtWidgets.QApplication([])
window = QtWidgets.QMainWindow()
ui = robot.Ui_MainWindow()
ui.setupUi(window)  # 启动运行
ui.pushButton.clicked.connect(on_click)
ui.pushButton_2.clicked.connect(off_click)
window.show()  # 显示窗口
app.exec()
图形化用户交互界面与语音交互实现模式类似,仅仅将语音模式中的语音输入输出转换为文字输入输出。

三、结果展示:

1.语音处理模式

由于语音交互模块不方便以图片形式展示,所以在此不做展示,大家可以转置github项目中自行测试。结尾附github地址。

2.图形化用户交互界面模式

(1)娱乐聊天板块

在这里插入图片描述

(2)高校查询板块

在这里插入图片描述
在这里插入图片描述

总结

做一下简单的总结,本博文依托于人工智能技术,借助于python语言编程实现最简单的智能聊天机器人。项目依托与自己的课程设计,如有偏驳,敬请指正,共同进步!!!
项目完整代码即附件已上传至GitHub;
GitHub项目地址:https://github.com/booue/chatting-robot-python
  • 4
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值