【行空板扩展板】基于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 AzureASRfromspeechmodules.text2speech import AzureTTSimportrequestsfromunihiker import GUI # 导入unihiker库GUI模块frompinpong.board import Board # 导入pinpong库importtimefrompinpong.board import Boardfrompinpong.board import NeoPixelfrompinpong.board import PinBoard().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 keyAZURE_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应用已启动,正在监听声音...\033 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主动响应:主人,我在!\033 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提问问题:" + q +"\033 text_query.config(text=q) text_response.config(text="思考中...") if q.__contains__('灯'): chooselight(q) else: res = requestChat(q) print("\033智能回复:" + res +"\033 text_response.config(text=res) tts.text_to_speech_and_play(res) else: if flag < 3: print("\033主人,我在等您的吩咐\033 tts.text_to_speech_and_play('主人,我在等您的吩咐') text_query.config(text='') text_response.config(text="主人,我在等您的吩咐") flag += 1 else: flag = 1 print("\033主人,我先退下了,如果需要的话,请呼唤我\033 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) WebPython+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.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 四、效果展示
页:
[1]