如今大部分人都面临着来自生活各方面的压力,时常感到焦虑、孤独,有的甚至患上了抑郁症等心理疾病,他们无法排解,甚至找不到人来诉苦,本系统提供了语音对话功能。
在用户无聊的时候,可以唤醒“依米”,让它陪着聊天,有意思的是,用户不会想到它将会回答什么内容,直到用户对它说出“退出”两个字。此功能旨在希望用户能把“依米”当成一个发泄口,把生活中的烦恼、不快一吐为尽,也希望能帮助用户打发闲暇时光。
语音聊天功能具体设计是,系统被语音唤醒后开始录音,录音完成后进行百度语音识别,如果包含关键词“聊天”两个字,系统则尝试获取图灵机器人的回复。成功获取回复后继续录音,再次尝试获取图灵机器人的回复。不断循环,直到用户说出包含“退出”的语句,系统便回到等待信号状态。具体实现流程如图所示。
在图灵机器人官网注册账户并申请一个机器人,此时得到一个专属的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 urllibreload(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_tokenbody = {"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_tokendef 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_resultreturn recognition_resultexcept:print erro_dict[resp_data["err_no"]]return Falsedef voiceSynthesis(self,word): #语音合成token = self.access_tokencuid = 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 urlclass 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放到代码中,实现调用功能。