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
|