olivebot/ai_module/xf_aiui.py
2022-06-20 11:05:10 +08:00

108 lines
3.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 + "&param=" + 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