218| 0
|
[项目] 【行空板扩展板】基于ChatGPT的个人助手 |
一、概要 行空板是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和Python环境,还预装了常用的Python库,让广大师生只需两步就能进行Python教学。 行空板设计的适配扩展板,采用创新的倾斜金手指插槽设计,为屏幕提供最佳可视角度。集成了两路直流电机驱动,支持独立电源供电,并配备了RGB灯、红外发射与接收功能,以及10路3Pin口和4路I2C口的扩展能力,配合DFRobot强大的Gravity产品体系,让行空板的创意实现更加多样化。 ChatGPT是一种基于人工智能技术的大型语言模型,它利用深度学习和自然语言处理技术来模拟人类的对话过程。ChatGPT是由OpenAI公司开发并训练的,它拥有强大的语言理解和生成能力,可以与用户进行流畅、自然的对话。ChatGPT的主要功能包括回答各种类型的问题、提供相关的知识和信息、参与闲聊和对话等。它可以根据用户的输入生成连贯、富有逻辑的回复,并且能够理解和识别上下文信息,从而进行更加精准的回答和对话。 注:ChatGPT需要借助魔法上网 二、架构 我借助局域网访问请求的架构实现,行空板作为客户端,本机作为服务器端;用户首先使用唤醒词唤醒模型,提出问题,将语音数据转换为文本数据,文本数据拼接请求,访问服务器端,服务器端处理请求,返回到客户端响应,文本数据转换为语音数据,通过扬声器播放。 由于使用行空板扩展板,我们添加了灯光控制模块。 架构图如下所示: 三、代码 Client #!/usr/bin/envpython3 #-*- coding: utf-8 -*- fromspeechmodules.speech2text import AzureASR fromspeechmodules.text2speech import AzureTTS importrequests fromunihiker import GUI # 导入unihiker库GUI模块 frompinpong.board import Board # 导入pinpong库 importtime frompinpong.board import Board frompinpong.board import NeoPixel frompinpong.board import Pin Board().begin()# 主板初始化 gui= GUI() # 实例化gui对象 np1= NeoPixel(Pin(Pin.P13), 3) np1.brightness(255) # 设置一次亮度即可 # 显示背景图片和文字 img= gui.draw_image(w=240, h=320, image='bot-02zz.png') text_query= gui.draw_text(x=20, y=15, w=150, color="red",text="",font_size=10) text_response= gui.draw_text(x=40, y=82, w=180, color="red",text="",font_size=10) AZURE_API_KEY= "7d72982e962d4958be8f0a204be8621d" # 你的azure key AZURE_REGION= "eastus" # 你的azure region defrequestChat(query): # 发送请求 # x =requests.get('http://127.0.0.1:5000/query?question=' + query) x =requests.get('http://10.1.2.101:5000/query?question=' + query) # qheaders = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64)", "Connection":"close"} # myobj = {'question': query} # x =requests.get('http://127.0.0.1:5000/query', headers=qheaders, data=myobj) if 200 == x.status_code: return x.text else: return '请检查您的网络' defchooselight(q): color_map = { '红灯': 0xFF0000, '绿灯': 0x66FF00, '黄灯': 0xFFFF00 } for color_name, color_value incolor_map.items(): if color_name in q: try: np1.range_color(0, 2,color_value) print("主人已开启"+color_value) while True: time.sleep(1) except Exception as e: print(f"出现错误: {e}") break defstartClient(asr, tts): print("\033[7m应用已启动,正在监听声音...\033[0m") text_response.config(text="应用已启动,正在监听声音...") while True: # 需要始终保持对唤醒词的监听 q = asr.speech_to_text() if q == None: continue print('识别到:', q) text_query.config(text=q) if q.__contains__('刚') orq.__contains__('钢') or q.__contains__('钢蛋') or q.__contains__('钢带'): text_query.config(text="钢蛋") print("\033[7m主动响应:主人,我在!\033[0m") text_response.config(text="主人,我在!") tts.text_to_speech_and_play("主人,我在!") #asyncio.run(tts.text_to_speech_and_play("嗯,我在,请讲!")) # 如果用Edgetts需要使用异步执行 flag = 1; while True: # 进入一次对话session q = asr.speech_to_text() if q is not None: print("\033[34m提问问题:" + q +"\033[0m") text_query.config(text=q) text_response.config(text="思考中...") if q.__contains__('灯'): chooselight(q) else: res = requestChat(q) print("\033[32m智能回复:" + res +"\033[0m") text_response.config(text=res) tts.text_to_speech_and_play(res) else: if flag < 3: print("\033[7m主人,我在等您的吩咐\033[0m") tts.text_to_speech_and_play('主人,我在等您的吩咐') text_query.config(text='') text_response.config(text="主人,我在等您的吩咐") flag += 1 else: flag = 1 print("\033[7m主人,我先退下了,如果需要的话,请呼唤我\033[0m") tts.text_to_speech_and_play('主人,我先退下了,如果需要的话,请呼唤我') text_query.config(text='') text_response.config(text="主人,我先退下了,如果需要的话,请呼唤我") break if__name__ == '__main__': asr = AzureASR(AZURE_API_KEY, AZURE_REGION) tts = AzureTTS(AZURE_API_KEY, AZURE_REGION) startClient(asr, tts) Web Python+Flask框架 OpenAI处理模块: classOpenaiChatModule: def __init__(self, openai_api_key): self.openai_api_key = openai_api_key self.origin_model_conversation = [ {"role":"system", "content": "你是用户user的好朋友,名字叫钢蛋儿,能够和user进行愉快的交谈。"} def chat_with_origin_model(self, text): openai.api_key = self.openai_api_key text = text.replace('\n','').replace('\r', '').strip() if len(text) == 0: return # print(f'chatGPT Q:{text}') self.origin_model_conversation.append({"role":"user","content": text}) response =openai.ChatCompletion.create( model="gpt-3.5-turbo", # model="gpt-4", messages=self.origin_model_conversation, max_tokens=2048, temperature=0.3, ) reply=response.choices[0].message.content reply =reply.replace('\n','').replace('\r', '') self.origin_model_conversation.append({"role":"assistant","content": reply}) return reply 接收请求+返回移动端内容: @app.route('/query',methods=['post','get']) defhello_world(): question = request.args.get('question') print("-------", question) res=openai_chat_module.chat_with_origin_model(question + '30字以内') returnres 四、效果展示 |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed