如今大部分人都面临着来自生活各方面的压力,时常感到焦虑、孤独,有的甚至患上了抑郁症等心理疾病,他们无法排解,甚至找不到人来诉苦,本系统提供了语音对话功能。
在用户无聊的时候,可以唤醒“依米”,让它陪着聊天,有意思的是,用户不会想到它将会回答什么内容,直到用户对它说出“退出”两个字。此功能旨在希望用户能把“依米”当成一个发泄口,把生活中的烦恼、不快一吐为尽,也希望能帮助用户打发闲暇时光。
语音聊天功能具体设计是,系统被语音唤醒后开始录音,录音完成后进行百度语音识别,如果包含关键词“聊天”两个字,系统则尝试获取图灵机器人的回复。成功获取回复后继续录音,再次尝试获取图灵机器人的回复。不断循环,直到用户说出包含“退出”的语句,系统便回到等待信号状态。具体实现流程如图所示。
在图灵机器人官网注册账户并申请一个机器人,此时得到一个专属的key,在代码中使用它来调用图灵机器人接口。根据需要,还可以在机器人管理页面设定指定问题的答案,建立自己的语料库。如图4.10所示,左边的问题一栏和右边答案一栏都是设定好的关键词,如果机器人检测到左边问题一栏中的关键词,就会回复右边答案一栏已设定好的关键词给用户。
调用语音聊天功能的关键代码如下:
1. if "聊天" in recognition_result:
2. while True:
3. try:
4. reply_result = turlingAPI.turlingReply(reco_result)
5. except Exception:
6. url = baiduAPI.voiceSynthesis("对不起,获取回复失败")
7. voice.playVoice(url)
8. else:
9. url = baiduAPI.voiceSynthesis(reply_result)
10. voice.playVoice(url)
11. finally:
12. voice.recordVoice()
13. reco_result = baiduAPI.voiceRecognition()
14. if reco_result and "退出" in reco_result:
15. url = baiduAPI.voiceSynthesis("再见我的主人")
16. voice.playVoice(url)
17. return False
由于语音识别以及网络等问题,可能存在着获取回复失败,因此这里在获取图灵回复时加入try-except语句,避免了获取结果失败导致程序终止运行,影响用户体验。
api.py文件
通过百度语音识别和语音合成实现机器对话功能
# -*- coding: utf-8 -*-
import sys
import requests
import json
import urllib2
import base64
import urllib
reload(sys)
sys.setdefaultencoding("utf-8")
class BaiDuAPI:
def __init__(self):
self.GRANT_TYPE = "client_credentials"
self.CLIENT_ID = '百度应用的 API Key'
self.CLIENT_SECRET ='百度应用的 API Secret'
self.TOKEN_URL = "https://openapi.baidu.com/oauth/2.0/token"
self.RECOGNITION_URL = "http://vop.baidu.com/server_api"
self.CUID = "B8-27-EB-BA-24-14"
self.RECOGNITION_PATH = r"./record_voice.wav"
# self.SYNTHESIS_PATH = r"./play_voice.mp3"
def getToken(self): #获取access_token
body = {
"grant_type":self.GRANT_TYPE,
"client_id":self.CLIENT_ID,
"client_secret":self.CLIENT_SECRET
}
r = requests.post(self.TOKEN_URL,data=body,verify=True)
self.access_token = json.loads(r.text)["access_token"]
return self.access_token
def voiceRecognition(self): #语音识别
erro_dict = {
3300:"输入参数不正确",
3301:"音频质量过差",
3302:"鉴权失败",
3303:"语音服务器后端问题",
3304:"用户的请求QPS超限",
3305:"用户的日pv(日请求量)超限",
3307:"语音服务器后端识别出错问题",
3308:"音频过长",
3309:"音频数据问题",
3310:"输入的音频文件过大",
3311:"采样率rate参数不在选项里",
3312:"音频格式format参数不在选项里"
}
f = open(self.RECOGNITION_PATH,"rb")
voice_data = f.read()
f.close()
speech_data = base64.b64encode(voice_data).decode("utf-8")
speech_length = len(voice_data)
post_data = {
"format": "wav",
"rate": 16000,
"channel": 1,
"cuid": self.CUID,
"token": self.access_token,
"speech": speech_data,
"len": speech_length
}
json_data = json.dumps(post_data).encode("utf-8")
json_length = len(json_data)
req = urllib2.Request(self.RECOGNITION_URL, data=json_data)
req.add_header("Content-Type", "application/json")
req.add_header("Content-Length", json_length)
resp = urllib2.urlopen(req)
resp = resp.read()
resp_data = json.loads(resp.decode("utf-8"))
try:
recognition_result = resp_data["result"][0]
print recognition_result
return recognition_result
except:
print erro_dict[resp_data["err_no"]]
return False
def voiceSynthesis(self,word): #语音合成
token = self.access_token
cuid = self.CUID
# word = urllib.quote(word.encode("utf8"))
url = "http://tsn.baidu.com/text2audio?tex="+word+"&lan=zh&cuid="+cuid+"&ctp=1&tok="+token+"&per=4"
# urllib.urlretrieve(url,self.SYNTHESIS_PATH)
return url
class TurLingAPI:
def __init__(self):
self.Tuling_API_KEY = "你的图灵KEY"
self.URL = "http://www.tuling123.com/openapi/api"
def turlingReply(self,word): #图灵获取回复
body = {"key": self.Tuling_API_KEY,
"info": word.encode("utf-8")}
res = requests.post(self.URL, data=body, verify=True)
if res:
date = json.loads(res.text)
print date["text"]
return date["text"]
else:
print "对不起,未获取到回复信息"
return False
这里需要去百度申请语音识别api以及去申请一个图灵机器人,将得到的KEY放到代码中,实现调用功能。