精华内容
下载资源
问答
  • Python3从零开始搭建一个语音对话机器人

    万次阅读 多人点赞 2019-07-19 17:00:20
    从零开始搭建一个语音对话机器人 目录 01-初心缘由 02-准备工作 03-语音机器人的搭建思路 04-语音生成音频文件 05-音频文件转文字STT 06-与图灵机器人对话 07-文字转语音 08-语音对话机器人的完整代码 09-...

    从零开始搭建一个语音对话机器人

    目录

    01-初心缘由

    02-准备工作

    03-语音机器人的搭建思路

    04-语音生成音频文件

    05-音频文件转文字STT

    06-与图灵机器人对话

    07-文字转语音

    08-语音对话机器人的完整代码

    09-结束语

    10-有问必答


    01-初心缘由

            最近在研究语音识别方向,看了很多的语音识别的资料和文章,了解了一下语音识别的前世今生,其中包含了很多算法的演变,目前来说最流行的语音识别算法主要是依赖于深度学习的神经网络算法,其中RNN扮演了非常重要的作用,深度学习的应用真正让语音识别达到了商用级别。然后我想动手自己做一个语音识别系统,从GitHub上下载了两个流行的开源项目MASR和ASRT来进行复现,发现语音识别的效果没有写的那么好,其中如果要从零来训练自己的语言模型势必会非常耗时。

            因此,就有了一个新的想法,借助一些开源的语音识别SDK来实现语音识别,来看看他们语音识别的效果如何。于是想到了百度和科大讯飞,然后就百度了一下,百度搜索举贤不避亲的给我推荐了百度AI开放平台!然后查看了百度语音识别的技术文档,发现对python的支持非常友好,而科大讯飞好像没有提供对python的接口支持,因而选定了百度。

            虽然百度目前槽点很多,但是不得不说百度在AI方面的投入和开放是值得点赞的!百度的AI开放平台确实为开发者们带来很多的便利性,开放了非常多的AI服务,大家自行去注册使用,百度大脑AI开放平台地址:http://ai.baidu.com/   (PS:我确实没收广告费!)

            经过体验发现百度的语音识别准确率高的吓人,完爆了GitHub上的开源项目N条街,然后在CSDN浏览各位博主的博客时发现,用百度语音识别的API和图灵机器人的API可以做一个实时语音对话的机器人,感觉特别兴奋,从而决定搭建一个自己的语音对话机器人。目前,我已经实现了我的语音对话机器人,因此特意来分享一下整个的实现过程和遇到的坑,让大家可以快速的构建你们的语音对话机器人。好啦,我们开始吧!

    02-准备工作

    • (1)准备python开发环境

      需要准备的python包包括:speech_recognition(语音识别包)、pyaudio(录音接口)、wave(打开录音文件并设置音频参数)、pyttsx3(文本转语音)、json(解析json串)、requests(get/post)、baid_aip(百度语音识别的aip)。

    • (2)准备百度API

    登录百度AI开放平台语音识别:https://ai.baidu.com/tech/speech/asr  ,如果没有账号自己注册即可,免费试用哦。

    点击技术文档:阅读语音识别的技术文档,重点查看API文档和Python SDK,了解如何在python中调用API接口。

    点击立即使用:进入到服务界面,创建应用。记住最重要的App ID、API Key、Secret Key,后面调用时需要用到。

    • (3)准备图灵机器人:

    图灵机器人大脑具备强大的中文语义分析能力,可准确理解中文含义并作出回应,是最擅长聊中文的机器人大脑,赋予软硬件产品自然流畅的人机对话能力。图灵机器人是中文语境下智能度最高的“机器人大脑”,是全球较为先进的机器人中文语言认知与计算平台,图灵机器人对中文语义理解准确率已达90%,可为智能化软硬件产品提供中文语义分析、自然语言对话、深度问答等人工智能技术服务。——源于百科(好吧,又和百度扯上点关系了。)

    总之,就是需要你去图灵机器人官网http://www.turingapi.com/注册成功后,构建一个属于你的图灵机器人,用于后续将翻译后的文本内容对图灵机器人提问获取回答,然后我们通过TTS处理就可以获取语音输出了。

    注册后创建自己的机器人,然后在机器人设置的终端设置中查看自己的apikey(这个key非常重要),另外一定要把密钥开关关闭,不然后面在调用api时会报3001错误,无法调用图灵机器人(此处有坑,已填)!

    图灵机器人未进行身份认证时,是不能够进行调用的,如果调用会出现“请求次数超限制”的问题,通过个人身份认证后,每天能够调用100次,这是免费版。100次当然是不够用的,如果你想要更多的服务,就只能购买会员了,99和299每月的套餐,具体看下图。如果是自己玩,那就免费版,如果是开发,可以考虑99的,如果是做一个产品,那就得企业采购了,咱们没那么土豪!

    03-语音机器人的搭建思路

    1、首先明确我们要实现的目标,是要实现纯语音对话聊天,不需要输入文字交流。我们实时说,机器人实时回复,真正实现语音交互对话。

    2、整个过程的实现流程是这样的,我们说一句话,通过录音保存为语音文件,然后调用百度API实现语音转文本STT,再然后调用图灵机器人API将文本输入得到图灵机器人的回复,最后将回复的文本转成语音输出TTS,就这样我们就实现了和机器人的语音对话了!是不是有点绕,来个流程图吧!

    3、语音对话机器人的构建具体流程图,就是各种掉API,千万不要觉得头晕哦,思路清晰才能走下去。

    04-语音生成音频文件

            语音生产文件就需要进行录音,将我们说的话保存下来,至于保存的格式我一般都是保存为wav,其他格式支持pcm,不太建议mp3,因为需要多次转换。【百度服务端会将非pcm格式,转为pcm格式,因此使用wav会有额外的转换耗时,但是windows自带播放器识别不了pcm格式的,所以我还是喜欢用wav格式】

    第一种录音方式:使用speech_recognition包进行录音,这个录音出来的效果比较好,而且代码量非常少。

    import speech_recognition as sr
    
    # Use SpeechRecognition to record 使用语音识别包录制音频
    def my_record(rate=16000):
        r = sr.Recognizer()
        with sr.Microphone(sample_rate=rate) as source:
            print("please say something")
            audio = r.listen(source)
    
        with open("voices/myvoices.wav", "wb") as f:
            f.write(audio.get_wav_data())
        print("录音完成!")
    
    my_record()

    第二种录音方式:使用wave和pyaudio包进行录音,在python中直接使用pip install即可。

    import wave
    from pyaudio import PyAudio, paInt16
    
    framerate = 16000  # 采样率
    num_samples = 2000  # 采样点
    channels = 1  # 声道
    sampwidth = 2  # 采样宽度2bytes
    FILEPATH = 'voices/myvoices.wav'
    
    
    def save_wave_file(filepath, data):
        wf = wave.open(filepath, 'wb')
        wf.setnchannels(channels)
        wf.setsampwidth(sampwidth)
        wf.setframerate(framerate)
        wf.writeframes(b''.join(data))
        wf.close()
    
    
    #录音
    def my_record():
        pa = PyAudio()
        #打开一个新的音频stream
        stream = pa.open(format=paInt16, channels=channels,
                         rate=framerate, input=True, frames_per_buffer=num_samples)
        my_buf = [] #存放录音数据
    
        t = time.time()
        print('正在录音...')
     
        while time.time() < t + 10:  # 设置录音时间(秒)
        	#循环read,每次read 2000frames
            string_audio_data = stream.read(num_samples)
            my_buf.append(string_audio_data)
        print('录音结束.')
        save_wave_file(FILEPATH, my_buf)
        stream.close()
    
    

    05-音频文件转文字STT

           我们已经在上面获取到了音频文件,那要怎么把音频文件转化为文字呢?在这里,我们就需要调用百度的语音识别API接口,同时我们需要安装这个接口包,导入模块:pip install baidu_aip。导入我们需要的模块名,然后将音频文件发送给出去,返回文字。

    # 音频文件转文字:采用百度的语音识别python-SDK
    # 百度语音识别API配置参数
    from aip import AipSpeech
    
    APP_ID = 'your app_id'
    API_KEY = 'your api_key'
    SECRET_KEY = 'your secret_key'
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    path = 'voices/myvoices.wav'
    
    
    # 将语音转文本STT
    def listen():
        # 读取录音文件
        with open(path, 'rb') as fp:
            voices = fp.read()
        try:
            # 参数dev_pid:1536普通话(支持简单的英文识别)、1537普通话(纯中文识别)、1737英语、1637粤语、1837四川话、1936普通话远场
            result = client.asr(voices, 'wav', 16000, {'dev_pid': 1537, })
            # result = CLIENT.asr(get_file_content(path), 'wav', 16000, {'lan': 'zh', })
            # print(result)
            # print(result['result'][0])
            # print(result)
            result_text = result["result"][0]
            print("you said: " + result_text)
            return result_text
        except KeyError:
            print("KeyError")

    06-与图灵机器人对话

           上一步我们已经成功将我们的声音转化为文字了,然后我们再调用图灵机器人的API接口,做自动应答。图灵机器人对中文的识别准确率高达90%,是目前中文语境下智能度最高的机器人。有很多在Python中使用图灵机器人API的博客,但都是1.0版本,本博客介绍的是在Python中使用图灵机器人API v2.0的方法,1.0版本的调用方式已失效。

    代码如下(这里需要导入requests、json模块):

    # 与机器人对话:调用的是图灵机器人
    import requests
    import json
    
    # 图灵机器人的API_KEY、API_URL
    turing_api_key = "your turing_api_key"
    api_url = "http://openapi.tuling123.com/openapi/api/v2"  # 图灵机器人api网址
    headers = {'Content-Type': 'application/json;charset=UTF-8'}
    
    
    # 图灵机器人回复
    def Turing(text_words=""):
        req = {
            "reqType": 0,
            "perception": {
                "inputText": {
                    "text": text_words
                },
    
                "selfInfo": {
                    "location": {
                        "city": "北京",
                        "province": "北京",
                        "street": "车公庄西大街"
                    }
                }
            },
            "userInfo": {
                "apiKey": turing_api_key,  # 你的图灵机器人apiKey
                "userId": "Nieson"  # 用户唯一标识(随便填, 非密钥)
            }
        }
    
        req["perception"]["inputText"]["text"] = text_words
        response = requests.request("post", api_url, json=req, headers=headers)
        response_dict = json.loads(response.text)
    
        result = response_dict["results"][0]["values"]["text"]
        print("AI Robot said: " + result)
        return result
    

    07-文字转语音

          我们得到了图灵机器人的回复之后,就需要把结果转化为语音输出,从而实现语音交互。在python中我们如何将文字转为语音并输出呢?这里就需要用到另一个模块pyttsx3,它会将文字转为语音。

    import pyttsx3
    
    # 初始化语音
    engine = pyttsx3.init()  # 初始化语音库
    # 设置语速
    rate = engine.getProperty('rate')
    engine.setProperty('rate', rate-50)
    # 输出语音
    engine.say("你好,很高兴认识你!")  # 合成语音
    engine.runAndWait()

    使用python进行编程就是有很多好处,比如音频的输出我们就可以采用多种方式,下面提供一种更加简便的音频输出方式:

    import win32com.client
    
    speaker = win32com.client.Dispatch("SAPI.SpVoice")
    speaker.Speak("我是语音助手,小灵!")

    好了,至此,我们语音机器人的所有元素都已经准备妥当,接下来进行组装!

    08-语音对话机器人的完整代码

    经过我的努力,已经将代码优化到了100行左右哦,按照我的步骤来,你就可以快速复现构建你的语音机器人了!

    # -*- coding: utf-8 -*-#
    # -------------------------------
    # Name:SpeechRobot
    # Author:Nieson
    # Date:2019/7/19 16:31
    # 用python3实现自己的语音对话机器人
    # -------------------------------
    
    from aip import AipSpeech
    import requests
    import json
    import speech_recognition as sr
    import win32com.client
    
    # 初始化语音
    speaker = win32com.client.Dispatch("SAPI.SpVoice")
    
    
    # 1、语音生成音频文件,录音并以当前时间戳保存到voices文件中
    # Use SpeechRecognition to record 使用语音识别录制
    def my_record(rate=16000):
        r = sr.Recognizer()
        with sr.Microphone(sample_rate=rate) as source:
            print("please say something")
            audio = r.listen(source)
    
        with open("voices/myvoices.wav", "wb") as f:
            f.write(audio.get_wav_data())
    
    
    # 2、音频文件转文字:采用百度的语音识别python-SDK
    # 导入我们需要的模块名,然后将音频文件发送给出去,返回文字。
    # 百度语音识别API配置参数
    APP_ID = 'your app_id'
    API_KEY = 'your api_key'
    SECRET_KEY = 'your secret_key'
    client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
    path = 'voices/myvoices.wav'
    
    
    # 将语音转文本STT
    def listen():
        # 读取录音文件
        with open(path, 'rb') as fp:
            voices = fp.read()
        try:
            # 参数dev_pid:1536普通话(支持简单的英文识别)、1537普通话(纯中文识别)、1737英语、1637粤语、1837四川话、1936普通话远场
            result = client.asr(voices, 'wav', 16000, {'dev_pid': 1537, })
            # result = CLIENT.asr(get_file_content(path), 'wav', 16000, {'lan': 'zh', })
            # print(result)
            # print(result['result'][0])
            # print(result)
            result_text = result["result"][0]
            print("you said: " + result_text)
            return result_text
        except KeyError:
            print("KeyError")
            speaker.Speak("我没有听清楚,请再说一遍...")
    
    
    # 3、与机器人对话:调用的是图灵机器人
    # 图灵机器人的API_KEY、API_URL
    turing_api_key = "your turing_api_key"
    api_url = "http://openapi.tuling123.com/openapi/api/v2"  # 图灵机器人api网址
    headers = {'Content-Type': 'application/json;charset=UTF-8'}
    
    
    # 图灵机器人回复
    def Turing(text_words=""):
        req = {
            "reqType": 0,
            "perception": {
                "inputText": {
                    "text": text_words
                },
    
                "selfInfo": {
                    "location": {
                        "city": "北京",
                        "province": "北京",
                        "street": "车公庄"
                    }
                }
            },
            "userInfo": {
                "apiKey": turing_api_key,  # 你的图灵机器人apiKey
                "userId": "Nieson"  # 用户唯一标识(随便填, 非密钥)
            }
        }
    
        req["perception"]["inputText"]["text"] = text_words
        response = requests.request("post", api_url, json=req, headers=headers)
        response_dict = json.loads(response.text)
    
        result = response_dict["results"][0]["values"]["text"]
        print("AI Robot said: " + result)
        return result
    
    
    # 语音合成,输出机器人的回答
    while True:
        my_record()
        request = listen()
        response = Turing(request)
        speaker.Speak(response)
    
    

    09-结束语

    至此,我们就构建了一个完整的语音对话机器人,它可以在你无聊、寂寞、有压力、想开心的时候出现在你身边,哄你开心哟!这个机器人太聪明了,你可千万不要被她调戏了!

    对了,你可以在图灵机器人官网里面进行人物设置,设置她的姓名、年龄和星座,我的机器人叫做小橘子,她具有十八般武艺,它能够闲聊、做数字计算、中英互译、讲故事、笑话、脑筋急转弯、歇后语、绕口令、顺口溜、玩成语接龙游戏,天气和日期查询,功能还是比较强大的!如果开通付费版本就会拥有更多功能哦,可以训练自己的语料库,目前免费版只支持每天100次的调用,真真是不够用呀!

    附带一下我和小橘子的聊天视频吧,有心的小伙伴可以做个前端页面哦!

    优酷视频:https://v.youku.com/v_show/id_XNDI3OTYyMTgwNA==.html?spm=a2h3j.8428770.3416059.1 

    10-有问必答

    博客一经发出,两天多的时间,阅读量就已经突破5000了,得到了众多博友的关注点赞和评论,说明大家对于语音对话机器人的热情和兴趣度都非常高,大家都在积极的搭建自己的语音对话机器人了!相信百度和图灵机器人最近的API调用量会蹭蹭的上涨,我在考虑要不要收点推广费了(哈哈,开个玩笑)!百度AI开放平台你注册调用他们的API后,过两天百度就会有客服给你打电话问题的体验感,大家看到一个北京号码标记为诈骗电话的那个就是了哈哈!图灵机器人公司则是通过会员收费模式来赚大家的钱,就看你能否攥紧自己的口袋了!

    第10个模块有问必答是为了来解答一下大家在复现语音对话机器人过程中可能会遇到的问题,根据大家的提问,我有针对性的把一些常见问题在此给各位进行一下解答,也非常欢迎博友们之间积极回复,毕竟博主的精力也是有限的,还要投入到无限的AI能力研究中去(可能也是因为懒吧)。刚好,十个模块凑齐了十全十美,处女座看起来也舒心一些!闲话少叙,进入正题:

    • (1)问:我直接执行你全部代码的时候为什么跑不通呢?

    答:首先强调一点,各位在复现代码的时候,一定要把百度和图灵机器人的相关api_id, api_key等替换成自己的!另外图灵机器人记得要身份验证,通过后才能调用图灵机器人!

    • (2)问:我在运行之后输出please say something,然后我说了话,之后隔一段时间才输出KeyError,AI Robot said: 请求次数超限制!这是什么原因?   

    答:因为在05-音频文件转文字STT中,为了避免有时候录音文件出现问题,特别是在不带耳机直接对着笔记本说话时,如果周围环境嘈杂,会导致录音质量不佳,或者是长时间不说话,这些情况就会报Key Error的问题;另外最重要的一个,那就是图灵机器人如果你注册后未进行身份认证,或者身份认证未通过,那么你能调用API的次数为0次,也就是说图灵机器人不会给你回复,就会出现“请求次数超限制”。通过认证后,目前能够每天调用100次,也就是聊天100次也会出现“请求次数超限制”了。

    • (3)问:Mac电脑上没有win32com怎么办啊?

    答:如果win32com不行,那你就用可以尝试安装一下pyttsx3包,用前文中提到的第一种语音输出方式。我为了代码整洁,所以没有把第一种方式写到完整代码中(其实也写了,写博客的时候删了而已,别问我为啥,为了整洁好看,lol!)。

    • (4)问:为什么我的with open那里说文件找不到?

    答:那是因为我所有的录音文件(如myvoices.wav)都在voices目录下,所以要记得创建一下自己的文件夹目录voices。

    • (5)问:不会python,有没有Java版本?

    答:大家看完python版本,可以尝试用Java来复现一下,毕竟你都会Java了,百度API也支持Java调用哦,看官网哈!

    • (6)问:安装包出现问题,主要是from aip import AipSpeech、import speech_recognition as sr中的aip、speech_recognition包为啥安装不成功?

    答:这两个包比较特殊,在import的时候是aip和speech_recognition,但在install安装的时候分别是baidu-aip和SpeechRecognition,这样就能安装成功啦!

    展开全文
  • 对话机器人综述

    万次阅读 2019-12-17 22:47:54
    从应用的角度来说,对话机器人可以分为三个类别,分别是闲聊机器人,qa机器人以及任务型机器人。本系列主要介绍闲聊机器人。由于本文的内容主要是对对话机器人做一个简单的介绍,所以都是一些简单的介绍,详细的内容...

    综述

    从应用的角度来说,对话机器人可以分为三个类别,分别是闲聊机器人,qa机器人以及任务型机器人。本系列主要介绍闲聊机器人。由于本文的内容主要是对对话机器人做一个简单的介绍,所以都是一些简单的介绍,详细的内容后面后有介绍。

    目录

    检索式对话模型

    1. 检索式对话模型(1)

    • 主要介绍bm25,LCLR,DSSM模型,deepMatch模型以及cnn-cnt模型。

    2. 检索式对话模型(2)

    • 主要介绍ARC-I,ARC-II,CDNN模型,BLSTM模型以及CNTN模型。

    3. 检索式对话模型(3)

    • 主要介绍QA-LSTM以及变种,CLSM模型,Dual Encoder模型,AP-CNN,AP-biLSTM,以及HD-LSTM

    4. 检索式对话模型(4)

    • 主要介绍HD-LSTM模型,HyperQA模型,BiMPM模型,Compare-aggregate Model,IWAN模型以及MCAN模型。

    生成式对话模型及相关技术

    1. transformer模型

    • 主要介绍了transformer模型的Input,encoder,decoder,位置编码以及attention机制

    2. 解码策略介绍

    • 主要介绍了greedy,beam search,top-k,top-p以及非自回归解码策略(mask predict等)

    预训练模型介绍

    一 QA机器人

    问答机器人主要功能是在知识库找到用户提问的问题的答案。主要用于智能客服等。一般来说问答机器人是不涉及多轮,主要是针对某一个领域的问答。构建一个问答机器人,第一步是要构架一个高质量的FAQ 语料集,语料集中应该包括大量高质量的Q-A对。第二步,就是做语义匹配的工作,主要有针对用户query与Q的匹配,用户query与A的匹配,或者是融合二者,针对用户query与Q的匹配的同时,也注重用户query与A的匹配。

    二 任务型机器人

    任务型机器人是针对某类特定任务开发的机器人,主要功能是解决某类问题,比如说订机票,订餐等。
    任务型对话主要可以分为五个模块。主要有ASR,NLU,对话管理,NLG,TTS这五个模块,如下图所示:
    在这里插入图片描述

    • ASR主要是将人的语音转化为文本的形式。
    • NLU主要是理解用户query的含义。NLU主要分为两个部分,一个是用户的意图或者query的domain区分,另一个是slot filling。
    • 对话管理主要包含了两个部分,分别是DST(dialogue state tracking)和policy learning。DST主要作用是跟踪对话的状态,而policy learning作用是根据对话的状态来采取对应的策略。
    • NLG主要是回复的生成。可以是模型生成的回复,也可以是固定的回复,或者是根据槽位填充的回复。
    • TTS是将文本形式的回复转变为语音的形式。

    三 闲聊机器人

    3.1 简介

    闲聊机器人是在开放域中回答用户没有目的的问题。它的主要功能是同用户进行闲聊对话,一定程度的排解用户的情感需求。因为闲聊本身的属性,所以针对闲聊机器人的回复一般没有明确的评价标准。不过,从整体上看,闲聊对话主要的两个标准是拟人化以及对话参与度[1]。

    3.2 方法

    闲聊机器人的实现主要有三种方法,分别是基于检索式的方法,基于生成式的方法以及基于检索以及生成的方法。目前来说,基于检索式的方法比较成熟,而基于生成式的方法效果并不是特别好。

    3.2.1 基于检索式的方法

    基于检索式的闲聊机器人包括了多轮和单轮这两个方向。这里主要介绍单轮的检索式模型,针对单轮的检索式对话机器人,从本质上来说,这是个query和reply的语义匹配问题。所以实现的时候,多数的方法也是从这个角度出发的。
    1.方法
    基于检索式的对话机器人,顾名思义,是首先通过用户的query在语料库中检索,这里的语料库存储的是<post, response>形式的pair。因此,当用户的query过来后,会利用query检索语料库中的post,然后得到多个<post, response>对。然后利用rank模型(语义匹配模型)对query和response打分。最后利用打分的结果得到相应的回复。
    2.语义匹配模型
    首先,语义匹配是一个很有挑战性的问题,它不仅仅涉及到word的维度,更是涉及到term,sentence的维度,不仅如此,由于语言的复杂性,语义匹配的复杂度不言而喻。因此目前大部分的语义匹配都是基于特征的维度,不管是character,word,tokens或者sentences的特征。或者是多个特征的融合。所以特征提取器的使用直接影响了语义匹配的效果。目前主流的特征提取器包括了CNN,LSTM以及self-attention。
    然后,从模型的角度来说,目前主要的模型有两种,一种是representation learning,一种是match function learning。

    • 1) representation learning方法
      这类方法的主要思想是首先学习到query和reply的语义表示,然后利用一些度量方法计算二者的相似度,比如说cosine similarity,点乘,NTN,EUCCOS[2]等。
      在这里插入图片描述
    • 2) match function learning方法
      这类方法主要是首先融合low level的特征,然后将融合后的特征通过各种match pattern。与representation learning方法的主要区别就是,match function的方法主要是先做特征的组合,然后进行相应的特征提取等操作。
      在这里插入图片描述
      3.优缺点
      1)优点:效果好与生成式的方法,基本能够找到好的reply。回复质量比较依赖语料,只要语料质量高,一般都能得到不错的回复。
      2)缺点:对话机器人给出的回复只能是语料里面能检索到的回复。整个系统比较复杂,有许多其它的工作,并不是端到端的系统。

    3.2.2 基于生成式的方法

    1.介绍
    基于生成式的对话模型,主要的含义是用户给出一个query,然后通过端到端的方式,让模型生成一个reply。目前这类方法使用的模型基本都是基于seq2seq架构[3]。seq2seq模型输入是一个序列,输出也是一个序列。它的输入和输出的长度是可变的。
    2.方法结构
    seq2seq模型主要包含了两部分,分别为Encoder和Decoder。其中Encoder的作用主要是将query编码成句向量,而Decoder的作用是根据query编码后的向量,生成reply。除此之外,在seq2seq经常使用的模块还有attention和beam-search等。主要结构如下图所示:
    在这里插入图片描述

    1. Encoder:将一个可变程度的序列变为一个固定长度的向量。观察上图的左半部分,Encoder 的输入是各个分割好的token,然后通过LSTM或者self-attention这个结构对各个step的输入进行编码,
    2. Decoder:将固定长度的向量转变为一个可变长度的序列。同样观察上图,Decoder的输入是 w x y z, 训练的时候输出是w x y z ,在infer的时候主要是使用beam-search得到输出。

    3.优缺点
    1)优点:生成式的模型能够生成语料里面没有的回复,而且整体的结构比较简单,只要训练好模型后,就能直接得到相应的回复。
    2)缺点:生成式模型生成的回复比较偏通用回复,并且生成的回复会有跟query不想关的情况。

    3.2.3 基于检索式和生成式的方法

    除了上面介绍的两种方法外,最近也有一些工作是将检索式和生成式两种方法融合起来。比如说AliMe chatbot[4],利用seq2seq模型生成回复,检索回来的回复会使用rerank模型进行打分,如果打分低于设定的阈值,就会使用seq2seq生成的回复作为给用户的回复,否则使用检索回来的回复作为用户的回复。

    专栏系列介绍

    专栏后面的内容主要会围绕检索式对话系统,生成式对话系统以及用到的一些技术。后续分享的内容也会在本文中总结,并会给出相应blog的链接。

    引用文献

    [1] What makes a good conversation? How controllable attributes affect human judgments, NAACL.2019
    [2] A Compare-Aggregate Model for Matching Text Sequences, ICLR.2017
    [3] Sequence to Sequence Learning with Neural Networks,NIPS,2014
    [4] AliMe Chat: A Sequence to Sequence and Rerank based Chatbot Engine,ACL,2017
    [5] A Survey on Dialogue Systems: Recent Advances and New Frontiers.2017

    展开全文
  • Conversational Robot - 对话机器人(聊天机器人)设计思考
  • 树莓派语音对话机器人
  • 开源对话机器人开发框架 CommuneChatbot <https://github.com/thirdgerb/chatbot> 发布 v0.1.0 版了。1. 项目介绍"Commune" 是 "亲切交谈" 的意思。CommuneChatbot 这个项目则是想通过 “对话” 的形式提供一...

    28e81a2d715ac2951b35de9db4651c46.png

    开源对话机器人开发框架 CommuneChatbot <https://github.com/thirdgerb/chatbot> 发布 v0.1.0 版了。

    1. 项目介绍

    "Commune" 是 "亲切交谈" 的意思。CommuneChatbot 这个项目则是想通过 “对话” 的形式提供一种人与机器的交互方式。在这个思路中,“对话”不是目的,而是“操作机器”的手段。

    简单来说,CommuneChatbot 是一个 :

    • 个人开源项目
    • 开发语言使用 PHP 7.2
    • 可对接语音、即时通讯、公众号、智能音箱等平台,搭建对话机器人
    • 最大特点是 多轮对话管理引擎, 用于解决 复杂多轮对话问题
    • 基于 Swoole + Hyperf 提供协程化的高性能服务端,提供工作站
    • 使用自然语言单元(Rasa,百度UNIT等)作为中间件,接入自然语言解析能力
    • 提供工程化 (模块/可配置/组件化) 的开发框架

    目标是能够像开发网站、触屏App一样开发复杂的对话式应用。

    项目相关的网址:

    • 项目网站:<https://communechatbot.com/>
    • 开发手册:<https://communechatbot.com/docs> (随时更新)
    • 主框架仓库:<https://github.com/thirdgerb/chatbot>
    • 工作站仓库:<https://github.com/thirdgerb/studio-hyperf>

    项目目前的Demo有:

    • 网页版 Demo : <https://communechatbot.com/>
    • 微信公众号 Demo : 搜索公众号 “CommuneChatbot”
    • 百度智能音箱 : 对音箱说 “打开三国群英传” 或 “打开方向迷宫”

    推荐文档:

    • 复杂多轮对话问题
    • 应用生命周期★
    • 多轮对话生命周期★
    • 快速教程★
    • 应用设想:对话式视频社交应用

    如有兴趣, 可以加入讨论 QQ 群: 907985715 ,或是参与项目 ISSUE :

    • CommuneChatbot Issue
    • StudioHyperf Issue

    2. 快速安装

    如果想要快速尝试这个项目,可以只安装主框架。先要检查依赖:

    • PHP >= 7.2
    • 基本 PHP 扩展
    • Intl 扩展(用于实现国际化)
    • Composer

    然后在命令行中安装:

    $ git clone https://github.com/thirdgerb/chatbot.git
    $ cd chatbot
    $ composer install
    

    如果 Composer 速度太慢, 建议使用 阿里云的Composer镜像 。 完成安装后,运行

    $ php demo/console.php
    

    查看Demo。更多内容请查看 快速教程, 或 搭建应用 。

    3. 开发样例

    使用 CommuneChatbot 项目开发多轮对话机器人,一个极简的例子是这样的:

    /**
     * 定义一个 Hello world 的上下文
     * @property string $name userName
     */
    class HelloWorldContext extends OOContext
    {
        // 上下文的介绍
        const DESCRIPTION = 'hello world!';
    
        // 对话单元 "start"
        public function __onStart(Stage $stage) : Navigator
        {
            return $stage->buildTalk()
    
                // 发送消息给用户
                ->info('hello world!!')
    
                // 进入 "askName" 对话单元
                ->goStage('askName')
        }
    
        // 对话单元 "askName"
        public function __onAskName(Stage $stage) : Navigator
        {
            return $stage->buildTalk()
    
                // 询问用户姓名
                ->askVerbal('How may I address you?')
    
                // 等待用户的消息
                ->hearing()
    
                // 接受到用户的消息, 符合答案的格式
                ->isAnswer(function(Answer $answer, Dialog $dialog) {
    
                    // 将答案赋值给上下文记忆
                    $this->name = $answer->toResult();
    
                    // 进入对话单元 "menu"
                    return $this->goStage('menu');
                })
    
                // 结束用 Hearing API 定义对话逻辑
                ->end();
        }
    
        // 对话单元 "menu"
        public function __onMenu(Stage $stage) : Navigator
        {
            // 用 "menu" 工具构建一个 对话单元组件
            $menu = new Menu(
                // 菜单向用户的提问
                'What can I help you?',
    
                // 给用户回答的建议
                [
                    // 进入 "play game" 的上下文
                    PlayGameContext::class,
    
                    // 进入 "order drink" 的上下文
                    OrderDrinkContext::class,
    
                    // 进入 "simple chat" 的上下文
                    SimpleChatContext::class,
                ]
            );
    
            return $stage
    
                // 当目标上下文结束后, 触发这个回调方法
                ->onFallback(function(Dialog $dialog) {
                    // 重复当前 Menu 对话
                    return $dialog->repeat();
                });
    
                // 加载 stage component
                ->component($menu);
        }
    }
    

    多轮对话上下文是完全可编程的,既可以通过代码来定义,也可以基于配置文件动态生成。

    4. 关于作者

    CommuneChatbot 项目由 ThirdGerb 基于个人兴趣设计并开发。

    作者是一名服务端工程师,对于对话交互形式的应用有很强的兴趣,但想要开发的应用往往卡在复杂多轮对话问题上,而找到的解决方案还不够理想,因此自己动手开发了这个项目。

    作者关于对话机器人的各种思考和观点,谨供参考。如果发现错谬之处,烦请批评指教,非常感谢!如有兴趣,可以加入讨论 QQ 群: 907985715

    展开全文
  • 智能对话机器人开发实战视频教程

    千人学习 2018-07-26 10:13:35
    案例驱动:三大智能对话机器人需求场景,三个完整案例; 2.源码操作:内含完整程序源码和数据集; 3.实战指引:覆盖智能对话机器人实战案例开发; 4.系统学习:一套完整的智能对话机器人开发方法,三大智能对话框架...
  • 教你用python几十行代码编写对话机器人最近闲来无事,就自己写点代码弄了一个对话机器人。当然,这个机器人是基于图灵机器人这个平台的接口的,因为对于我这个小白来说自己编写一个机器人代码还是颇有难度啊哈哈。说...

    教你用python几十行代码编写对话机器人

    最近闲来无事,就自己写点代码弄了一个对话机器人。当然,这个机器人是基于图灵机器人这个平台的接口的,因为对于我这个小白来说自己编写一个机器人代码还是颇有难度啊哈哈。

    c0396cd18918eb579a238bc4223911ff.png

    250a628ac5182925de72ce8ecc351f07.png

    说实话这个机器人小姐姐还是有点高冷呢(对了,悄悄告诉你们,机器人的性别、名字和年龄都是可以修改的哦,大家赶快自己去看看吧)

    好了,废话不多说,我们先来看看这个机器人是怎么实现的吧。

    首先我们先去http://www.tuling123.com注册一个账号,然后找到机器人管理页面:

    7214793019fa1334ab4ea75d1e784555.png

    这里可以免费创建一些自己的机器人,不过这些机器人是有单日调用次数限制的,好像是每天一千条,不过对于我们只是玩玩的人来说是绰绰有余啦。然后注意上面的apikey,这就是我们将来要调用的端口的秘钥,把它复制下来备用。

    接下来就是我们的代码实现了,这个代码主要完成的还是端口的调用,网上也有一些类似的代码,甚至有可以搭建微信还有qq机器人的代码,不过那些就有些复杂啦,为了方便起见我给大家准备了一个只有几十行的代码给大家作参考(大佬们也可以自己完成啦)

    import json

    import socket

    import uuid

    from urllib.request import urlopen, Request

    from urllib.parse import urlencode

    class robot(object):

    def __init__(self):

    self.turing_url = "http://www.tuling123.com/openapi/api?"

    self.app_key = "这里填写自己的apikey哦"

    def getTuringText(self, text):

    user_ip = self.getHostIp()

    mac_id = self.getMacId()

    turing_url_data = dict(key = self.app_key, info = text, userid = mac_id)

    request = Request(self.turing_url + urlencode(turing_url_data))

    try:

    w_data = urlopen(request)

    except:

    return error_info

    response_text = w_data.read().decode("utf-8")

    json_result = json.loads(response_text)

    return json_result["text"]

    def getHostIp(self):

    socket_info = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    socket_info.connect(("8.8.8.8", 80))

    ip = socket_info.getsockname()[0]

    return ip

    def getMacId(self):

    node = uuid.getnode()

    mac = uuid.UUID(int = node).hex[-12:]

    return mac

    if __name__ == '__main__':

    print("现在可以和机器人聊天了(退出请输q)")

    turing = robot()

    while True:

    msg = input("\n我:")

    if msg =='q':

    exit("聊天结束")

    else:

    turing_data = turing.getTuringText(msg)

    print("机器人:", turing_data)

    这段代码直接复制到你的集成开发环境就可以直接运行了,记得在里面填写自己机器人的apikey哦,是不是很简单呢?

    所以赶紧去问他一些有趣的问题吧!(当然一些非主流的问题他不一定回答的上来哦,毕竟机器人不是人哦)

    好了,本教程就到此结束啦,喜欢的小伙伴记得点赞哦,也欢迎志同道合的朋友们关注我和我一起交流。

    2019年4月2日

    展开全文
  • 零代码打造智能对话机器人 叶聪 AI技术专家 腾讯智能对话平台总架构师 || 零代码打造智能对话机器人 01 智能对话的前世今生 / 3min 02 智能对话从入门到放弃 / 1min 03 智能对话核心技术解析 / 5min 04 使用TBP零...
  • keras建立对话机器人,这是我在市面上找到的最简单的对话机器人开发,里面有大牛的博客。强烈建议阅读,实现自己的第一个对话机器人
  • 对话机器人服务介绍

    2019-12-23 18:04:54
    对话机器人服务(Conversational Bot Service) 是一款基于人工智能技术,针对企业应用场景开发的云服务,主要包括智能问答、智能质检、定制对话机器人和任务型对话等功能。智能问答旨在帮助企业快速构建,发布和...
  • 主要为大家详细介绍了基于树莓派的语音对话机器人,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 智能对话机器人实战(课件)案例驱动:三大智能对话机器人需求场景,三个完整案例;一套完整的智能对话机器人开发方法,三大智能对话框架;
  • 百度UNIT对话机器人实例
  • 简单对话机器人

    2020-04-28 20:24:23
    对话机器人 import random # 定语从句语法 grammar = ''' 战斗 => 施法 , 结果 。 施法 => 主语 动作 技能 结果 => 主语 获得 效果 主语 => 张飞 | 关羽 | 赵云 | 典韦 | 许褚 | 刘备 | 黄忠 | 曹操 |...
  • 文章问题 一些地方论文格式写的是(作者, 论文标题, 年份) ...以苹果的Siri和亚马逊的Echo为例,它实际上是一套非常复杂的智能系统,而对话机器人是其中一个界面。 有些文献或者商业机构把这部分称为Conversa...
  • 语音对话机器人搭建

    2021-01-06 11:51:48
    基于百度AI和图灵机器人搭建的语音对话机器人 源码: from aip import AipSpeech import requests import json import speech_recognition as sr import win32com.client # 初始化语音 speaker = win32...
  • 有些对话机器人总让人崩溃,也许是智能级别不够高。本文,就来一起看看如何判断一个机器人的智能程度。随着智能对话技术的发展,对话机器人越来越多地出现在人们的日常工作和生活中。从企业的角度,在合适的业务场景...
  • 本文来自于csdn,主要讲解了对话系统技能、现状、机器学习和深度学习、对话机器人的等等。对话系统(对话机器人)本质上是通过机器学习和人工智能等技术让机器理解人的语言。它包含了诸多学科方法的融合使用,是人工...
  • 不用AI,单纯的用python基础语法,也可以得到一个对话机器人哦!用list、dict、str基本语法,还有函数递归可以实现一个对话机器人。 代码过程 (最近时间精力有限,具体代码过程见gitee):基于Syntax Tree的对话...
  • 原标题:智能对话机器人能应用在哪里?智能对话机器人的应用非常广泛,在参与企业工作流程中,常常以虚拟助手的形式提供服务。与传统信息系统和流程自动化工具不同, 有了AI大脑的加持,TA具有认知、理解、分析、...
  • 自动对话机器人eliza

    2010-12-09 10:57:22
    英文自动对话机器人 eliza 具体信息大家可以google得到
  • 教你用python几十行代码编写对话机器人 最近闲来无事,就自己写点代码弄了一个对话机器人。当然,这个机器人是基于图灵机器人这个平台的接口的,因为对于我这个小白来说自己编写一个机器人代码还是颇有难度啊哈哈。 ...
  • 自制的一个对话机器人,语言库有些欠缺,有额外功能需要插件【压缩包内的exe文件,都放在C盘】,下载后请解压到任意目录【插件放在C盘】,程序会自动生成目录在C盘,请不必担心。
  • 评估智能对话机器人的7大数据指标

    千次阅读 2020-09-24 17:28:40
    不同行业都有着不同的数据指标体系,本文作者对评估智能对话机器人的数据指标维度展开了梳理,与大家分享。 如果你正负责一款智能对话机器人产品,不管是软件还是硬件,不管叫“小a”还是叫“小b”,总要遇到一...
  • 用Java编写的安卓语音对话机器人,界面和手机上的语音助手差不多,实现的功能包括智能问答、天气查询、百科查询、打开APP、创建日程等,直接在导入eclipse就可以运行,但是要配置安卓环境,具体步骤请自行百度

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,089
精华内容 1,235
关键字:

对话机器人