重构nlp模块逻辑
+ 重构NLP模块管理逻辑,便于自由扩展; + gpt:拆分为ChatGPT及GPT、更换新的GPT接口、可单独配置代理服务器; + 指定yolov8包版本,解决yolo不兼容问题; + 修复:自言自语bug、接收多个待处理消息bug。
This commit is contained in:
		
							parent
							
								
									e2859e9d68
								
							
						
					
					
						commit
						8a4c9d7329
					
				
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								README.md
									
									
									
									
									
								
							@ -109,8 +109,9 @@ Fay(服务端)与数字人的通讯接口: [`ws://127.0.0.1:10002`](ws://127
 | 
			
		||||
│   ├── ms_tts_sdk.py       # 微软 文本转语音
 | 
			
		||||
│   ├── nlp_lingju.py       # 灵聚 人机交互-自然语言处理
 | 
			
		||||
│   ├── xf_aiui.py          # 讯飞 人机交互-自然语言处理
 | 
			
		||||
│   ├── chatgpt.py          # gpt3.5对接
 | 
			
		||||
│   ├── yuan_1_0.py         # 浪潮.源大模型对接
 | 
			
		||||
│   ├── nlp_gpt.py          # gpt api对接
 | 
			
		||||
│   ├── nlp_chatgpt.py      # chat.openai.com逆向对接
 | 
			
		||||
│   ├── nlp_yuan.py         # 浪潮.源大模型对接
 | 
			
		||||
│   ├── nlp_rasa.py         # ChatGLM-6B的基础上前置Rasa会话管理(强烈推荐)
 | 
			
		||||
│   ├── nlp_VisualGLM.py    # 对接多模态大语言模型VisualGLM-6B
 | 
			
		||||
│   ├── yolov8.py           # yolov8资态识别
 | 
			
		||||
@ -141,6 +142,12 @@ Fay(服务端)与数字人的通讯接口: [`ws://127.0.0.1:10002`](ws://127
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## **三、升级日志**
 | 
			
		||||
**2023.06.28:**
 | 
			
		||||
 | 
			
		||||
+ 重构NLP模块管理逻辑,便于自由扩展;
 | 
			
		||||
+ gpt:拆分为ChatGPT及GPT、更换新的GPT接口、可单独配置代理服务器;
 | 
			
		||||
+ 指定yolov8包版本,解决yolo不兼容问题;
 | 
			
		||||
+ 修复:自言自语bug、接收多个待处理消息bug。
 | 
			
		||||
 | 
			
		||||
**2023.06.21:**
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										30
									
								
								ai_module/nlp_chatgpt.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								ai_module/nlp_chatgpt.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,30 @@
 | 
			
		||||
from revChatGPT.V1 import Chatbot
 | 
			
		||||
from utils import config_util as cfg
 | 
			
		||||
import time 
 | 
			
		||||
 | 
			
		||||
count = 0
 | 
			
		||||
def question(cont):
 | 
			
		||||
    global count
 | 
			
		||||
    try:
 | 
			
		||||
        chatbot = Chatbot(config={
 | 
			
		||||
            "access_token": cfg.key_gpt_access_token,
 | 
			
		||||
            "paid": False,
 | 
			
		||||
            "collect_analytics": True,
 | 
			
		||||
            "proxy": cfg.proxy_config,
 | 
			
		||||
            "model": "gpt-4",
 | 
			
		||||
            "conversation_id":cfg.key_gpt_conversation_id
 | 
			
		||||
            },conversation_id=cfg.key_gpt_conversation_id,
 | 
			
		||||
            parent_id=None)
 | 
			
		||||
 | 
			
		||||
        prompt = cont
 | 
			
		||||
        response = ""
 | 
			
		||||
        for data in chatbot.ask(prompt):
 | 
			
		||||
            response = data["message"]
 | 
			
		||||
        count = 0
 | 
			
		||||
        return response
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        count += 1
 | 
			
		||||
        if count < 3:
 | 
			
		||||
            time.sleep(15)
 | 
			
		||||
            return question(cont)
 | 
			
		||||
        return 'gpt当前繁忙,请稍后重试' + e
 | 
			
		||||
@ -1,5 +1,4 @@
 | 
			
		||||
from revChatGPT.V1 import Chatbot
 | 
			
		||||
from core.content_db import Content_Db
 | 
			
		||||
from revChatGPT.V3 import Chatbot
 | 
			
		||||
from utils import config_util as cfg
 | 
			
		||||
import time 
 | 
			
		||||
 | 
			
		||||
@ -7,19 +6,8 @@ count = 0
 | 
			
		||||
def question(cont):
 | 
			
		||||
    global count
 | 
			
		||||
    try:
 | 
			
		||||
        chatbot = Chatbot(config={
 | 
			
		||||
            "access_token": cfg.key_gpt_access_token,
 | 
			
		||||
            "paid": False,
 | 
			
		||||
            "collect_analytics": True,
 | 
			
		||||
            "model": "gpt-4",
 | 
			
		||||
            "conversation_id":cfg.key_gpt_conversation_id
 | 
			
		||||
            },conversation_id=cfg.key_gpt_conversation_id,
 | 
			
		||||
            parent_id=None)
 | 
			
		||||
 | 
			
		||||
        prompt = cont
 | 
			
		||||
        response = ""
 | 
			
		||||
        for data in chatbot.ask(prompt):
 | 
			
		||||
            response = data["message"]
 | 
			
		||||
        chatbot = Chatbot(proxy = cfg.proxy_config, api_key = cfg.key_chatgpt_api_key)
 | 
			
		||||
        response = chatbot.ask(cont)
 | 
			
		||||
        count = 0
 | 
			
		||||
        return response
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
 | 
			
		||||
@ -100,10 +100,6 @@ class FeiEyes:
 | 
			
		||||
                    cv2.putText(operated_frame, f"{res.names[int(cls.item())]}", (int(x1.item()), int(y1.item()) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)        
 | 
			
		||||
                if res.keypoints is not None and res.keypoints.size(0) > 0:  # check if keypoints exist
 | 
			
		||||
                    keypoints = res.keypoints[0]
 | 
			
		||||
 | 
			
		||||
                    #TODO人脸相似性的比较,待优化
 | 
			
		||||
                    keypoints_np = keypoints[0:5].cpu().numpy()
 | 
			
		||||
                    mtx1, mtx2, disparity = procrustes(keypoints_np[:, :2], self.my_face)
 | 
			
		||||
                    #总人数
 | 
			
		||||
                    person_count += 1
 | 
			
		||||
                    #坐着的人数
 | 
			
		||||
@ -142,5 +138,6 @@ def new_instance():
 | 
			
		||||
    return __fei_eyes
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										129
									
								
								core/fay_core.py
									
									
									
									
									
								
							
							
						
						
									
										129
									
								
								core/fay_core.py
									
									
									
									
									
								
							@ -21,64 +21,77 @@ from core.interact import Interact
 | 
			
		||||
from core.tts_voice import EnumVoice
 | 
			
		||||
from scheduler.thread_manager import MyThread
 | 
			
		||||
from utils import util, storer, config_util
 | 
			
		||||
from ai_module import yuan_1_0
 | 
			
		||||
from ai_module import chatgpt
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
import pygame
 | 
			
		||||
from utils import config_util as cfg
 | 
			
		||||
from core.content_db import Content_Db
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from ai_module import nlp_rasa
 | 
			
		||||
from ai_module import nlp_chatgpt
 | 
			
		||||
from ai_module import nlp_gpt
 | 
			
		||||
from ai_module import nlp_yuan
 | 
			
		||||
from ai_module import yolov8
 | 
			
		||||
from ai_module import nlp_VisualGLM as VisualGLM
 | 
			
		||||
from ai_module import nlp_VisualGLM
 | 
			
		||||
 | 
			
		||||
import platform
 | 
			
		||||
if platform.system() == "Windows":
 | 
			
		||||
    import sys
 | 
			
		||||
    sys.path.append("test/ovr_lipsync")
 | 
			
		||||
    from test_olipsync import LipSyncGenerator
 | 
			
		||||
    
 | 
			
		||||
from ai_module import nlp_lingju
 | 
			
		||||
 | 
			
		||||
modules = {
 | 
			
		||||
    "nlp_yuan": nlp_yuan, 
 | 
			
		||||
    "nlp_gpt": nlp_gpt,
 | 
			
		||||
    "nlp_chatgpt": nlp_chatgpt,
 | 
			
		||||
    "nlp_rasa": nlp_rasa,
 | 
			
		||||
    "nlp_VisualGLM": nlp_VisualGLM,
 | 
			
		||||
    "nlp_lingju": nlp_lingju
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def determine_nlp_strategy(sendto,msg):
 | 
			
		||||
    text = ''
 | 
			
		||||
    textlist = []
 | 
			
		||||
    try:
 | 
			
		||||
        util.log(1, '自然语言处理...')
 | 
			
		||||
        tm = time.time()
 | 
			
		||||
        cfg.load_config()
 | 
			
		||||
        if sendto == 2:
 | 
			
		||||
            text = nlp_chatgpt.question(msg)
 | 
			
		||||
        else:
 | 
			
		||||
            module_name = "nlp_" + cfg.key_chat_module
 | 
			
		||||
            selected_module = modules.get(module_name)
 | 
			
		||||
            if selected_module is None:
 | 
			
		||||
                raise RuntimeError('灵聚key、yuan key、gpt key都没有配置!')   
 | 
			
		||||
            if cfg.key_chat_module == 'rasa':
 | 
			
		||||
                textlist = selected_module.question(msg)
 | 
			
		||||
                text = textlist[0]['text'] 
 | 
			
		||||
            else:
 | 
			
		||||
                text = selected_module.question(msg)  
 | 
			
		||||
            util.log(1, '自然语言处理完成. 耗时: {} ms'.format(math.floor((time.time() - tm) * 1000)))
 | 
			
		||||
            if text == '哎呀,你这么说我也不懂,详细点呗' or text == '':
 | 
			
		||||
                util.log(1, '[!] 自然语言无语了!')
 | 
			
		||||
                text = '哎呀,你这么说我也不懂,详细点呗'  
 | 
			
		||||
    except BaseException as e:
 | 
			
		||||
        print(e)
 | 
			
		||||
        util.log(1, '自然语言处理错误!')
 | 
			
		||||
        text = '哎呀,你这么说我也不懂,详细点呗'   
 | 
			
		||||
 | 
			
		||||
    return text,textlist
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#文本消息处理
 | 
			
		||||
def send_for_answer(msg,sendto):
 | 
			
		||||
        contentdb = Content_Db()
 | 
			
		||||
        contentdb.add_content('member','send',msg)       
 | 
			
		||||
        text = ''
 | 
			
		||||
        textlist = []
 | 
			
		||||
        try:
 | 
			
		||||
            util.log(1, '自然语言处理...')
 | 
			
		||||
            tm = time.time()
 | 
			
		||||
            cfg.load_config()
 | 
			
		||||
            if sendto == 2:
 | 
			
		||||
                text = nlp_gpt.question(msg)
 | 
			
		||||
            else:
 | 
			
		||||
 | 
			
		||||
                if cfg.key_chat_module == 'yuan':
 | 
			
		||||
                    text = yuan_1_0.question(msg)
 | 
			
		||||
                elif cfg.key_chat_module == 'chatgpt':
 | 
			
		||||
                    text = chatgpt.question(msg)
 | 
			
		||||
                elif cfg.key_chat_module == 'rasa':
 | 
			
		||||
                    textlist = nlp_rasa.question(msg)
 | 
			
		||||
                    text = textlist[0]['text']  
 | 
			
		||||
                elif cfg.key_chat_module == "VisualGLM":
 | 
			
		||||
                    text = VisualGLM.question(msg)  
 | 
			
		||||
                elif cfg.key_chat_module == "lingju":
 | 
			
		||||
                    text = nlp_lingju.question(msg)  
 | 
			
		||||
        text,textlist = determine_nlp_strategy(sendto,msg)
 | 
			
		||||
                
 | 
			
		||||
 | 
			
		||||
                else:
 | 
			
		||||
                    raise RuntimeError('灵聚key、yuan key、gpt key都没有配置!')    
 | 
			
		||||
                util.log(1, '自然语言处理完成. 耗时: {} ms'.format(math.floor((time.time() - tm) * 1000)))
 | 
			
		||||
                if text == '哎呀,你这么说我也不懂,详细点呗' or text == '':
 | 
			
		||||
                    util.log(1, '[!] 自然语言无语了!')
 | 
			
		||||
                    text = '哎呀,你这么说我也不懂,详细点呗'                    
 | 
			
		||||
        except BaseException as e:
 | 
			
		||||
            print(e)
 | 
			
		||||
            util.log(1, '自然语言处理错误!')
 | 
			
		||||
            text = '哎呀,你这么说我也不懂,详细点呗'
 | 
			
		||||
                
 | 
			
		||||
        now = datetime.now()
 | 
			
		||||
        timetext = str(now.strftime("%Y-%m-%d %H:%M:%S"))
 | 
			
		||||
        contentdb.add_content('fay','send',text)
 | 
			
		||||
        wsa_server.get_web_instance().add_cmd({"panelReply": {"type":"fay","content":text}})
 | 
			
		||||
        if len(textlist) > 1:
 | 
			
		||||
@ -88,6 +101,8 @@ def send_for_answer(msg,sendto):
 | 
			
		||||
                  wsa_server.get_web_instance().add_cmd({"panelReply": {"type":"fay","content":textlist[i]['text']}})
 | 
			
		||||
                  i+= 1
 | 
			
		||||
        return text
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class FeiFei:
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        pygame.mixer.init()
 | 
			
		||||
@ -238,8 +253,8 @@ class FeiFei:
 | 
			
		||||
                        fay_eyes = yolov8.new_instance()            
 | 
			
		||||
                        if fay_eyes.get_status():#YOLO正在运行
 | 
			
		||||
                            person_count, stand_count, sit_count = fay_eyes.get_counts()
 | 
			
		||||
                            if person_count != 1: #不是有且只有一个人,不互动
 | 
			
		||||
                                 wsa_server.get_web_instance().add_cmd({"panelMsg": "不是有且只有一个人,不互动"})
 | 
			
		||||
                            if person_count < 1: #看不到人,不互动
 | 
			
		||||
                                 wsa_server.get_web_instance().add_cmd({"panelMsg": "看不到人,不互动"})
 | 
			
		||||
                                 continue
 | 
			
		||||
 | 
			
		||||
                        answer = self.__get_answer(interact.interleaver, self.q_msg)#确定是否命中指令或q&a
 | 
			
		||||
@ -252,35 +267,10 @@ class FeiFei:
 | 
			
		||||
                        wsa_server.get_web_instance().add_cmd({"panelReply": {"type":"member","content":self.q_msg}})
 | 
			
		||||
                        text = ''
 | 
			
		||||
                        textlist = []
 | 
			
		||||
                        self.speaking = True
 | 
			
		||||
                        if answer is None:
 | 
			
		||||
                            try:
 | 
			
		||||
                                wsa_server.get_web_instance().add_cmd({"panelMsg": "思考中..."})
 | 
			
		||||
                                util.log(1, '自然语言处理...')
 | 
			
		||||
                                tm = time.time()
 | 
			
		||||
                                cfg.load_config()
 | 
			
		||||
                                if cfg.key_chat_module == 'yuan':
 | 
			
		||||
                                    text = yuan_1_0.question(self.q_msg)
 | 
			
		||||
                                elif cfg.key_chat_module == 'chatgpt':
 | 
			
		||||
                                    text = chatgpt.question(self.q_msg)
 | 
			
		||||
                                elif cfg.key_chat_module == 'rasa':
 | 
			
		||||
                                    textlist = nlp_rasa.question(self.q_msg)
 | 
			
		||||
                                    text = textlist[0]['text']
 | 
			
		||||
                                elif cfg.key_chat_module == "VisualGLM":
 | 
			
		||||
                                    text = VisualGLM.question(self.q_msg)
 | 
			
		||||
                                elif cfg.key_chat_module == "lingju":
 | 
			
		||||
                                    text = nlp_lingju.question(self.q_msg) 
 | 
			
		||||
                                else:
 | 
			
		||||
                                    raise RuntimeError('灵聚key、yuan key、gpt key都没有配置!')    
 | 
			
		||||
                                util.log(1, '自然语言处理完成. 耗时: {} ms'.format(math.floor((time.time() - tm) * 1000)))
 | 
			
		||||
                                if text == '哎呀,你这么说我也不懂,详细点呗' or text == '':
 | 
			
		||||
                                    util.log(1, '[!] 自然语言无语了!')
 | 
			
		||||
                                    wsa_server.get_web_instance().add_cmd({"panelMsg": ""})
 | 
			
		||||
                                    continue
 | 
			
		||||
                            except BaseException as e:
 | 
			
		||||
                                print(e)
 | 
			
		||||
                                util.log(1, '自然语言处理错误!')
 | 
			
		||||
                                wsa_server.get_web_instance().add_cmd({"panelMsg": ""})
 | 
			
		||||
                                continue
 | 
			
		||||
                            wsa_server.get_web_instance().add_cmd({"panelMsg": "思考中..."})
 | 
			
		||||
                            text,textlist = determine_nlp_strategy(1,self.q_msg)
 | 
			
		||||
                        elif answer != 'NO_ANSWER': #语音内容没有命中指令,回复q&a内容
 | 
			
		||||
                            text = answer
 | 
			
		||||
                        self.a_msg = text
 | 
			
		||||
@ -293,8 +283,7 @@ class FeiFei:
 | 
			
		||||
                                wsa_server.get_web_instance().add_cmd({"panelReply": {"type":"fay","content":textlist[i]['text']}})
 | 
			
		||||
                                i+= 1
 | 
			
		||||
                    wsa_server.get_web_instance().add_cmd({"panelMsg": self.a_msg})
 | 
			
		||||
                    self.last_speak_data = self.a_msg
 | 
			
		||||
                    self.speaking = True
 | 
			
		||||
                    self.last_speak_data = self.a_msg               
 | 
			
		||||
                    MyThread(target=self.__say, args=['interact']).start()
 | 
			
		||||
 | 
			
		||||
            except BaseException as e:
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@ class Recorder:
 | 
			
		||||
        self.__processing = False
 | 
			
		||||
        self.__history_level = []
 | 
			
		||||
        self.__history_data = []
 | 
			
		||||
        self.__dynamic_threshold = 0.35 # 声音识别的音量阈值
 | 
			
		||||
        self.__dynamic_threshold = 0.7 # 声音识别的音量阈值
 | 
			
		||||
 | 
			
		||||
        self.__MAX_LEVEL = 25000
 | 
			
		||||
        self.__MAX_BLOCK = 100
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
requests~=2.26.0    
 | 
			
		||||
numpy~=1.22.0
 | 
			
		||||
numpy
 | 
			
		||||
pyaudio~=0.2.11
 | 
			
		||||
websockets~=10.2
 | 
			
		||||
ws4py~=0.5.1
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										15
									
								
								system.conf
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								system.conf
									
									
									
									
									
								
							@ -20,20 +20,20 @@ ms_tts_region=
 | 
			
		||||
xf_ltp_app_id=
 | 
			
		||||
xf_ltp_api_key=
 | 
			
		||||
 | 
			
		||||
#NLP五选一:lingju、yuan、chatgpt、rasa(需启动chatglm及rasa,https://m.bilibili.com/video/BV1D14y1f7pr)、VisualGLM
 | 
			
		||||
#NLP五选一:yuan、gpt、chatgpt、rasa(需启动chatglm及rasa,https://m.bilibili.com/video/BV1D14y1f7pr)、lingju
 | 
			
		||||
chat_module=lingju
 | 
			
		||||
 | 
			
		||||
#灵聚 服务密钥(NLP多选1) https://open.lingju.ai
 | 
			
		||||
lingju_api_key=
 | 
			
		||||
lingju_api_authcode=
 | 
			
		||||
 | 
			
		||||
#浪.潮源大模型 服务密钥(NLP5多1) https://air.inspur.com/
 | 
			
		||||
#浪.潮源大模型 服务密钥(NLP5选1) https://air.inspur.com/
 | 
			
		||||
yuan_1_0_account=  
 | 
			
		||||
yuan_1_0_phone=
 | 
			
		||||
 | 
			
		||||
#gpt 服务密钥(NLP多选1) https://openai.com/
 | 
			
		||||
#gpt 服务密钥(NLP5选1) https://openai.com/
 | 
			
		||||
chatgpt_api_key=
 | 
			
		||||
 | 
			
		||||
#灵聚 服务密钥 https://open.lingju.ai
 | 
			
		||||
lingju_api_key=
 | 
			
		||||
lingju_api_authcode=
 | 
			
		||||
 | 
			
		||||
#ngrok内网穿透id,远程设备可以通过互联网连接Fay(非必须)http://ngrok.cc
 | 
			
		||||
ngrok_cc_id=
 | 
			
		||||
@ -42,3 +42,6 @@ ngrok_cc_id=
 | 
			
		||||
gpt_access_token=
 | 
			
		||||
gpt_conversation_id=
 | 
			
		||||
 | 
			
		||||
#gpt代理
 | 
			
		||||
proxy_config=http://192.168.1.13:7890
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ key_chatgpt_api_key = None
 | 
			
		||||
key_chat_module = None
 | 
			
		||||
key_gpt_access_token = None
 | 
			
		||||
key_gpt_conversation_id = None
 | 
			
		||||
proxy_config = None
 | 
			
		||||
 | 
			
		||||
ASR_mode = None
 | 
			
		||||
local_asr_ip = None 
 | 
			
		||||
@ -45,6 +46,7 @@ def load_config():
 | 
			
		||||
    global key_gpt_conversation_id
 | 
			
		||||
    global key_lingju_api_key
 | 
			
		||||
    global key_lingju_api_authcode
 | 
			
		||||
    global proxy_config
 | 
			
		||||
 | 
			
		||||
    global ASR_mode
 | 
			
		||||
    global local_asr_ip 
 | 
			
		||||
@ -73,6 +75,8 @@ def load_config():
 | 
			
		||||
    local_asr_ip = system_config.get('key', 'local_asr_ip')
 | 
			
		||||
    local_asr_port = system_config.get('key', 'local_asr_port')
 | 
			
		||||
 | 
			
		||||
    proxy_config = system_config.get('key', 'proxy_config')
 | 
			
		||||
 | 
			
		||||
    config = json.load(codecs.open('config.json', encoding='utf-8'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user