squllwu 发表于 2024-9-30 10:25:45

【行空板扩展板】基于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]
查看完整版本: 【行空板扩展板】基于ChatGPT的个人助手