2024-9-30 10:25:45 [显示全部楼层]
218浏览
查看: 218|回复: 0

[项目] 【行空板扩展板】基于ChatGPT的个人助手

[复制链接]
一、概要
行空板是一款专为Python学习和使用设计的新一代国产开源硬件,采用单板计算机架构,集成LCD彩屏、WiFi蓝牙、多种常用传感器和丰富的拓展接口。同时,其自带Linux操作系统和Python环境,还预装了常用的Python库,让广大师生只需两步就能进行Python教学。
行空板设计的适配扩展板,采用创新的倾斜金手指插槽设计,为屏幕提供最佳可视角度。集成了两路直流电机驱动,支持独立电源供电,并配备了RGB灯、红外发射与接收功能,以及10路3Pin口和4路I2C口的扩展能力,配合DFRobot强大的Gravity产品体系,让行空板的创意实现更加多样化。
ChatGPT是一种基于人工智能技术的大型语言模型,它利用深度学习和自然语言处理技术来模拟人类的对话过程。ChatGPT是由OpenAI公司开发并训练的,它拥有强大的语言理解和生成能力,可以与用户进行流畅、自然的对话。ChatGPT的主要功能包括回答各种类型的问题、提供相关的知识和信息、参与闲聊和对话等。它可以根据用户的输入生成连贯、富有逻辑的回复,并且能够理解和识别上下文信息,从而进行更加精准的回答和对话。
注:ChatGPT需要借助魔法上网
二、架构
我借助局域网访问请求的架构实现,行空板作为客户端,本机作为服务器端;用户首先使用唤醒词唤醒模型,提出问题,将语音数据转换为文本数据,文本数据拼接请求,访问服务器端,服务器端处理请求,返回到客户端响应,文本数据转换为语音数据,通过扬声器播放。
由于使用行空板扩展板,我们添加了灯光控制模块。
架构图如下所示:
【行空板扩展板】基于ChatGPT的个人助手图1
三、代码
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
四、效果展示
【行空板扩展板】基于ChatGPT的个人助手图2

MonSeptember-202409303548..png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail