108 lines
3.1 KiB
Python
108 lines
3.1 KiB
Python
|
import json
|
|||
|
import time
|
|||
|
|
|||
|
from ws4py.client.threadedclient import WebSocketClient
|
|||
|
import base64
|
|||
|
import hashlib
|
|||
|
import uuid
|
|||
|
from utils import config_util as cfg
|
|||
|
|
|||
|
base_url = "ws://wsapi.xfyun.cn/v1/aiui"
|
|||
|
|
|||
|
end_tag = "--end--"
|
|||
|
|
|||
|
|
|||
|
# qa 通讯类
|
|||
|
class __WSClient(WebSocketClient):
|
|||
|
q_msg = ''
|
|||
|
a_msg = ''
|
|||
|
|
|||
|
def opened(self):
|
|||
|
pass
|
|||
|
|
|||
|
def closed(self, code, reason=None):
|
|||
|
# if code == 1000:
|
|||
|
# print("qa close")
|
|||
|
# else:
|
|||
|
# print("连接异常关闭,code:" + str(code) + " ,reason:" + str(reason))
|
|||
|
return
|
|||
|
|
|||
|
def received_message(self, m):
|
|||
|
|
|||
|
s = json.loads(str(m))
|
|||
|
|
|||
|
if s['action'] == "started":
|
|||
|
|
|||
|
# 输入内容并发送
|
|||
|
str_content = self.q_msg
|
|||
|
self.send(bytes(str_content.encode('utf-8')))
|
|||
|
time.sleep(0.04)
|
|||
|
|
|||
|
# 数据发送结束之后发送结束标识
|
|||
|
self.send(bytes(end_tag.encode("utf-8")))
|
|||
|
|
|||
|
elif s['action'] == "result":
|
|||
|
data = s['data']
|
|||
|
# with open('qa/out.txt', 'w') as file:
|
|||
|
# file.write(str(data))
|
|||
|
if data['sub'] == "iat":
|
|||
|
print("user: ", data["text"])
|
|||
|
elif data['sub'] == "nlp":
|
|||
|
intent = data['intent']
|
|||
|
if intent['rc'] == 0:
|
|||
|
self.a_msg = intent['answer']['text']
|
|||
|
else:
|
|||
|
self.a_msg = "我没有理解你说的话啊"
|
|||
|
elif data['sub'] == "tts":
|
|||
|
# TODO 播报pcm音频
|
|||
|
print('tts')
|
|||
|
pass
|
|||
|
elif s['action'] == "error":
|
|||
|
print('[NLP错误] ' + s['desc'])
|
|||
|
else:
|
|||
|
print(s)
|
|||
|
|
|||
|
|
|||
|
def __get_auth_id():
|
|||
|
mac = uuid.UUID(int=uuid.getnode()).hex[-12:]
|
|||
|
return hashlib.md5(":".join([mac[e:e + 2] for e in range(0, 11, 2)]).encode("utf-8")).hexdigest()
|
|||
|
|
|||
|
|
|||
|
def question(text):
|
|||
|
ws = None
|
|||
|
try:
|
|||
|
# 构造握手参数
|
|||
|
curTime = int(time.time())
|
|||
|
|
|||
|
auth_id = __get_auth_id()
|
|||
|
|
|||
|
param = """{{
|
|||
|
"auth_id": "{0}",
|
|||
|
"data_type": "text",
|
|||
|
"scene": "main_box",
|
|||
|
"ver_type": "monitor",
|
|||
|
"close_delay": "200",
|
|||
|
"ent":"xtts",
|
|||
|
"vcn":"x_xiaoyan",
|
|||
|
"speed":"50",
|
|||
|
"interact_mode":"continuous",
|
|||
|
"context": "{{\\\"sdk_support\\\":[\\\"iat\\\",\\\"nlp\\\",\\\"tts\\\"]}}"
|
|||
|
}}"""
|
|||
|
|
|||
|
param = param.format(auth_id).encode(encoding="utf-8")
|
|||
|
paramBase64 = base64.b64encode(param).decode()
|
|||
|
checkSumPre = cfg.key_xf_aiui_api_key + str(curTime) + paramBase64
|
|||
|
checksum = hashlib.md5(checkSumPre.encode("utf-8")).hexdigest()
|
|||
|
connParam = "?appid=" + cfg.key_xf_aiui_app_id + "&checksum=" + checksum + "¶m=" + paramBase64 + "&curtime=" + str(curTime) + "&signtype=md5"
|
|||
|
|
|||
|
ws = __WSClient(base_url + connParam, protocols=['chat'], headers=[("Origin", "https://wsapi.xfyun.cn")])
|
|||
|
ws.q_msg = text
|
|||
|
ws.connect()
|
|||
|
ws.run_forever()
|
|||
|
|
|||
|
except KeyboardInterrupt:
|
|||
|
if ws is not None:
|
|||
|
ws.close()
|
|||
|
|
|||
|
return ws.a_msg
|