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

文章目录

  • 01-初心缘由
  • 02-准备工作
  • 03-语音机器人的搭建思路
  • 04-语音生成音频文件
  • 05-音频文件转文字STT
  • 06-与图灵机器人对话
  • 07-文字转语音
  • 08-语音对话机器人的完整代码
  • 09-结束语
  • 10-有问必答
      • 关于Python技术储备
        • 一、Python所有方向的学习路线
        • 二、Python基础学习视频
        • 三、精品Python学习书籍
        • 四、Python工具包+项目源码合集
        • ①Python工具包
        • ②Python实战案例
        • ③Python小游戏源码
        • 五、面试资料
        • 六、Python兼职渠道


Python从零开始快速搭建一个语音对话机器人_第1张图片

01-初心缘由

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

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

Python从零开始快速搭建一个语音对话机器人_第2张图片

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

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

02-准备工作

(1)准备python开发环境

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

(2)准备百度API

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

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

Python从零开始快速搭建一个语音对话机器人_第3张图片

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

Python从零开始快速搭建一个语音对话机器人_第4张图片

(3)准备图灵机器人:

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

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

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

Python从零开始快速搭建一个语音对话机器人_第5张图片

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

Python从零开始快速搭建一个语音对话机器人_第6张图片

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

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

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

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

Python从零开始快速搭建一个语音对话机器人_第7张图片

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-有问必答

第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,这样就能安装成功啦!


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Python从零开始快速搭建一个语音对话机器人_第8张图片
一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Python从零开始快速搭建一个语音对话机器人_第9张图片

你可能感兴趣的:(python,机器人,开发语言,经验分享,深度学习,学习,计算机网络)