当前位置:   article > 正文

python免费的实时语音交互(讯飞语音识别+青云客Robot)_python对接科大讯飞实现语音对话机器人

python对接科大讯飞实现语音对话机器人

须知:

py文件中的库,需要自己去pip,
其中有个pyaudio的库也许会安装失败,老是报错。我刚开始也费了半天时间才安装好的。

安装报错的话,可以去官网下载一个wheel文件,找到对应的版本下载,下载之后再按路径pip

如果还是出错的话,就把那个wheel文件名中的第二个‘cp38’(我下载的是38)改为none
    例:原本是“PyAudio-0.2.11-cp38-cp38-win_amd64.whl”
    改为“PyAudio-0.2.11-cp38-none-win_amd64.whl”
    再安装即可
    
py文件中的url和api接口、key等数据要去官网注册领取相应的接口(免费)【py文件中的注释语句中有写是哪个官网的】
  直接运行这个py文件是不行的,你需要把你自己的api写上去,py文件中的接口api是我自己的,我修改了后五位,你用不了的。
  
  
    语音识别是用 讯飞的
    智能机器人回复是调用  青云客机器人【这个接口我没改】。
    
    这个py我是有自定义些问题的,你们可以根据自己的需求改一下自己的问题和要回答的话【在question数组中】
    前面一个是问题,后面一个是回答。


这个是我由于当时时间紧迫大致随意写了一下,当然你也可以自己参考青云客官方文档去改进优化代码。

GitHub代码连接:GitHub - superzhangjc/python-Voice_chatContribute to superzhangjc/python-Voice_chat development by creating an account on GitHub.https://github.com/superzhangjc/python-Voice_chat

直接上代码!

  1. import pyttsx3
  2. import websocket
  3. import hashlib
  4. import base64
  5. import hmac
  6. import json
  7. from urllib.parse import urlencode
  8. import time
  9. import ssl
  10. from wsgiref.handlers import format_date_time
  11. from datetime import datetime
  12. from time import mktime
  13. import _thread as thread
  14. import pyaudio
  15. import sys
  16. import requests
  17. STATUS_FIRST_FRAME = 0 # 第一帧的标识
  18. STATUS_CONTINUE_FRAME = 1 # 中间帧标识
  19. STATUS_LAST_FRAME = 2 # 最后一帧的标识
  20. question = ['where are you from?','China']
  21. class Ws_Param(object):
  22. # 初始化
  23. def __init__(self, APPID, APIKey, APISecret):
  24. self.APPID = APPID
  25. self.APIKey = APIKey
  26. self.APISecret = APISecret
  27. # 公共参数(common)
  28. self.CommonArgs = {"app_id": self.APPID}
  29. # 业务参数(business),更多个性化参数可在官网查看
  30. self.BusinessArgs = {"domain": "iat", "language": "zh_cn", "accent": "mandarin", "vinfo":1,"vad_eos":10000}
  31. # 生成url
  32. def create_url(self):
  33. url = 'wss://ws-api.xfyun.cn/v2/iat'
  34. # 生成RFC1123格式的时间戳
  35. now = datetime.now()
  36. date = format_date_time(mktime(now.timetuple()))
  37. # 拼接字符串
  38. signature_origin = "host: " + "ws-api.xfyun.cn" + "\n"
  39. signature_origin += "date: " + date + "\n"
  40. signature_origin += "GET " + "/v2/iat " + "HTTP/1.1"
  41. # 进行hmac-sha256进行加密
  42. signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),
  43. digestmod=hashlib.sha256).digest()
  44. signature_sha = base64.b64encode(signature_sha).decode(encoding='utf-8')
  45. authorization_origin = "api_key=\"%s\", algorithm=\"%s\", headers=\"%s\", signature=\"%s\"" % (
  46. self.APIKey, "hmac-sha256", "host date request-line", signature_sha)
  47. authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')
  48. # 将请求的鉴权参数组合为字典
  49. v = {
  50. "authorization": authorization,
  51. "date": date,
  52. "host": "ws-api.xfyun.cn"
  53. }
  54. # 拼接鉴权参数,生成url
  55. url = url + '?' + urlencode(v)
  56. # print("date: ",date)
  57. # print("v: ",v)
  58. # 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致
  59. # print('websocket url :', url)
  60. return url
  61. # 收到websocket消息的处理
  62. def on_message(ws, message):
  63. result = ''
  64. try:
  65. code = json.loads(message)["code"]
  66. sid = json.loads(message)["sid"]
  67. if code != 0:
  68. errMsg = json.loads(message)["message"]
  69. print("sid:%s call error:%s code is:%s" % (sid, errMsg, code))
  70. else:
  71. data = json.loads(message)["data"]["result"]["ws"]
  72. for i in data:
  73. for w in i["cw"]:
  74. result += w["w"]
  75. if result == '。' or result=='?' or result==',':
  76. result = ''
  77. pass
  78. if result == "再见" or result == "退出":
  79. print("用户:"+result)
  80. sys.exit()
  81. elif result in question:
  82. print ( "用户: %s" % (result) )
  83. # reply是机器人回答的话
  84. reply = question[question.index ( result ) + 1]
  85. else:
  86. print("用户: %s" % (result))
  87. # 根据语音识别文字给出智能回答
  88. #此处是青云客的智能机器人api
  89. url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg=" + result
  90. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 \
  91. (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE',
  92. 'Host': 'api.qingyunke.com'
  93. }
  94. response = requests.get ( url, headers=headers )
  95. reply = json.loads ( response.text )['content'].replace ( '{br}', '/n' )
  96. except Exception as e:
  97. print("receive msg,but parse exception:", e)
  98. #输出回答
  99. print ( "机器人:" + reply )
  100. # 语音合成
  101. # 初始化语音
  102. engine = pyttsx3.init ()
  103. # 设置语速
  104. rate = engine.getProperty ( 'rate' )
  105. engine.setProperty ( 'rate', rate - 50 )
  106. # 输出语音
  107. engine.say ( reply ) # 合成语音
  108. engine.runAndWait ()
  109. # 收到websocket错误的处理
  110. def on_error(ws, error):
  111. print("### error:", error)
  112. # 收到websocket关闭的处理
  113. def on_close(ws):
  114. pass
  115. # print("### closed ###")
  116. # 收到websocket连接建立的处理
  117. def on_open(ws):
  118. def run(*args):
  119. status = STATUS_FIRST_FRAME # 音频的状态信息,标识音频是第一帧,还是中间帧、最后一帧
  120. CHUNK = 520 # 定义数据流块
  121. FORMAT = pyaudio.paInt16 # 16bit编码格式
  122. CHANNELS = 1 # 单声道
  123. RATE = 16000 # 16000采样频率
  124. p = pyaudio.PyAudio()
  125. # 创建音频流
  126. stream = p.open(format=FORMAT, # 音频流wav格式
  127. channels=CHANNELS, # 单声道
  128. rate=RATE, # 采样率16000
  129. input=True,
  130. frames_per_buffer=CHUNK)
  131. print("- - - - - - - Start Recording ...- - - - - - - ")
  132. for i in range(0,int(RATE/CHUNK*60)):
  133. buf = stream.read(CHUNK)
  134. if not buf:
  135. status = STATUS_LAST_FRAME
  136. if status == STATUS_FIRST_FRAME:
  137. d = {"common": wsParam.CommonArgs,
  138. "business": wsParam.BusinessArgs,
  139. "data": {"status": 0, "format": "audio/L16;rate=16000",
  140. "audio": str(base64.b64encode(buf), 'utf-8'),
  141. "encoding": "raw"}}
  142. d = json.dumps(d)
  143. ws.send(d)
  144. status = STATUS_CONTINUE_FRAME
  145. # 中间帧处理
  146. elif status == STATUS_CONTINUE_FRAME:
  147. d = {"data": {"status": 1, "format": "audio/L16;rate=16000",
  148. "audio": str(base64.b64encode(buf), 'utf-8'),
  149. "encoding": "raw"}}
  150. ws.send(json.dumps(d))
  151. # 最后一帧处理
  152. elif status == STATUS_LAST_FRAME:
  153. d = {"data": {"status": 2, "format": "audio/L16;rate=16000",
  154. "audio": str(base64.b64encode(buf), 'utf-8'),
  155. "encoding": "raw"}}
  156. ws.send(json.dumps(d))
  157. time.sleep(1)
  158. break
  159. stream.stop_stream()
  160. stream.close()
  161. p.terminate()
  162. ws.close()
  163. thread.start_new_thread(run,())
  164. # def run():
  165. if __name__ == "__main__":
  166. # global wsParam
  167. #此处是讯飞语音的api接口
  168. wsParam = Ws_Param(APPID='03bxxxxx', APIKey='714f58a9fc5fccd12fa6cd94492xxxxx',
  169. APISecret='NGM5NTE2YTlmODExZDg1MGYyZjxxxxx')
  170. websocket.enableTrace(False)
  171. wsUrl = wsParam.create_url()
  172. ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close)
  173. ws.on_open = on_open
  174. ws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE}, ping_timeout=5)

notice:语音识别时间是有限制时间的(这里设置的是每五秒识别一次)建议大家还是自己去申请青云客robot-api,也是相对easy且free。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/201622
推荐阅读
相关标签
  

闽ICP备14008679号