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 |