智能聊天功能——语音聊天篇

介绍了一款基于百度语音识别和图灵机器人技术的智能语音聊天系统,该系统旨在为用户提供一个倾诉平台,帮助缓解压力与孤独感。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值