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调用C/C++动态链接库的方法详解
Jul 22 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
Python tornado队列示例-一个并发web爬虫代码分享
Jan 09 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
python中的变量如何开辟内存
Jun 26 Python
pycham查看程序执行的时间方法
Nov 29 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
pandas的排序和排名的具体使用
Jul 31 Python
解决Alexnet训练模型在每个epoch中准确率和loss都会一升一降问题
Jun 17 Python
matplotlib事件处理基础(事件绑定、事件属性)
Feb 03 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 Python
python blinker 信号库
May 04 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
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
php中截取字符串支持utf-8
2007/01/18 PHP
php遍历文件夹所有文件子文件夹函数代码
2013/11/27 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
php获取给定日期相差天数的方法分析
2017/02/20 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
javascript firefox不显示本地预览图片问题的解决方法
2008/11/12 Javascript
JavaScript 继承机制的实现(待续)
2010/05/18 Javascript
获得所有表单值的JQuery实现代码[IE暂不支持]
2012/05/24 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
js与css实现弹出层覆盖整个页面的方法
2014/12/13 Javascript
12个非常实用的JavaScript小技巧【推荐】
2016/05/18 Javascript
基于JS快速实现导航下拉菜单动画效果附源码下载
2016/10/27 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
浅谈webpack+react多页面开发终极架构
2018/11/11 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
Python中对列表排序实例
2015/01/04 Python
Python3.5 创建文件的简单实例
2018/04/26 Python
PyQt5 窗口切换与自定义对话框的实例
2019/06/20 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
通过canvas转换颜色为RGBA格式及性能问题的解决
2019/11/22 HTML / CSS
Yahoo-PHP面试题2
2014/12/06 面试题
介绍一下如何优化MySql
2016/12/20 面试题
汉语言文学毕业生求职信
2013/10/01 职场文书
应届生自荐信范文
2014/02/21 职场文书
担保书格式及范文
2014/04/01 职场文书
交通安全标语
2014/06/06 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
2015年世界粮食日演讲稿
2015/03/20 职场文书
2015年银行个人工作总结
2015/05/14 职场文书
家属联谊会致辞
2015/07/31 职场文书
Python通用验证码识别OCR库ddddocr的安装使用教程
2022/07/07 Python