Python3从零开始搭建一个语音对话机器人的实现


Posted in Python onAugust 23, 2019

01-初心缘由

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

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

Python3从零开始搭建一个语音对话机器人的实现

虽然百度目前槽点很多,但是不得不说百度在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接口。

Python3从零开始搭建一个语音对话机器人的实现

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

Python3从零开始搭建一个语音对话机器人的实现

(3)准备图灵机器人:

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

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

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

Python3从零开始搭建一个语音对话机器人的实现

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

Python3从零开始搭建一个语音对话机器人的实现

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

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

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

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

Python3从零开始搭建一个语音对话机器人的实现

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python的gevent框架下执行异步的Solr查询的教程
Apr 16 Python
python利用拉链法实现字典方法示例
Mar 25 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
Django 多语言教程的实现(i18n)
Jul 07 Python
对pandas中Series的map函数详解
Jul 25 Python
python飞机大战pygame碰撞检测实现方法分析
Dec 17 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
浅谈matplotlib.pyplot与axes的关系
Mar 06 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
如何利用Python matplotlib绘制雷达图
Dec 21 Python
python小程序之飘落的银杏
Apr 17 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 #Python
自定义django admin model表单提交的例子
Aug 23 #Python
django admin 自定义替换change页面模板的方法
Aug 23 #Python
解决python多行注释引发缩进错误的问题
Aug 23 #Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 #Python
python如何保证输入键入数字的方法
Aug 23 #Python
对python while循环和双重循环的实例详解
Aug 23 #Python
You might like
header()函数使用说明
2006/11/23 PHP
PHP生成UTF8文件的方法
2010/05/15 PHP
php面向对象 字段的声明与使用
2012/06/14 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
小议Function.apply() 之一------(函数的劫持与对象的复制)
2006/11/30 Javascript
xml 与javascript结合的问题解决方法
2007/03/24 Javascript
javascript new一个对象的实质
2010/01/07 Javascript
ScrollDown的基本操作示例
2013/06/09 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
jQuery实现遮罩层登录对话框
2016/12/29 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
Vue实现简单分页器
2018/12/29 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
微信小程序地图实现展示线路
2020/07/29 Javascript
Python爬取读者并制作成PDF
2015/03/10 Python
python执行等待程序直到第二天零点的方法
2015/04/23 Python
Python3实现Web网页图片下载
2016/01/28 Python
python发送邮件功能实现代码
2016/07/15 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
Django 对IP访问频率进行限制的例子
2019/08/30 Python
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
珍珠鸟教学反思
2014/02/01 职场文书
大学应届生的自我评价
2014/03/06 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
三人合伙协议书范本
2014/10/29 职场文书
节约用电通知
2015/04/25 职场文书
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers