用ESP32构建基于大模型的聊天机器人

        之前在HomeAssistant里使用Node-RED+小米智能音箱+某GPT实现了智能问答应用,但使用起来不太方便,最近看到一个开源项目,正好手头又有相关配件,于是试着搭建了一个自己的聊天机器人。

一、器件准备

1.  ESP32开发板(ESP-WROOM-32)

2、INMP441全向麦克风

3、MAX98357 I2S音频放大器模块

4、1.8寸(128x160)TFT彩色显示屏(8针)

5、小型喇叭

6、3D打印外壳

   

7、按钮开关

6*6*9按钮微动开关

二、器件连接

INMP441ESP32MAX98357ESP32TFT显示屏ESP32

LED

(可选)

ESP32
VDD3.3vVinVINVDDVIN正极GPIO33
GNDGNDGNDGNDGNDGND负极GND
SDGPIO22LRCGPIO27SCLGPIO18
WSGPIO15BCLKGPIO26SDAGPIO23
SCKGPIO4DINGPIO25RSTGPIO12
DCGPIO32
CSGPIO5

如下图:

三、注册并开通大模型服务

以接入讯飞星火模型为例:

1、注册账号

进入https://www.xfyun.cn注册个人账号

2、创建应用

完成注册并登录后,进入控制台,选择创建新应用,平台将自动生成APPID。

  

3、开通服务

点击已创建的应用条目,点击“更多服务信息查询”,可查看你的APPID、APISecret、APIKey信息,记录下来后面代码调试将使用。

返回后重新点击已创建的应用条目,进入后选择左侧的Spark4.0 Ultra模型,点击“立即购买”,然后选择我的应用、“免费包(个人)”,最后“确认下单”,这样就开通了讯飞认知大模型。

  

同样的操作,再选择开通语音转文字服务。

四、烧录固件

1、编译环境准备

下载vscode和platformIO插件

2、从GitHub克隆代码

地址:GitHub - Explorerlowi/ESP32_AI_LLM: 本项目使用esp32、esp32s3接入讯飞星火、豆包、chatgpt等大模型,实现语音对话聊天功能,支持语音唤醒、连续对话、音乐播放等功能,同时外接了一块显示屏实时显示对话的内容。

注意:找到.pio\libdeps\upesy_wroom\TFT_eSPI路径下的User_Setup.h文件,删除它,然后将根目录下的User_Setup.h文件剪切粘贴过去

3、按需修改代码

必须修改的代码:

......

int llm = 1;    // 大模型选择参数:0:豆包,1:讯飞星火,2:通义千问

......

// 讯飞stt和大模型服务的参数
String APPID = "12345678";     // App ID,必填
String APISecret = "12345678"; // API Secret,必填
String APIKey = "12345678";    // API Key,必填

......

根据个人喜好可以修改的代码:

......

// 角色设定
String roleSet = "你是一个二次元魔法猫娘,你的名字叫小灵,你的性格可爱活泼,说话简短,同时带有攻击嘲讽意味,你喜欢在回答的末尾加一个“喵”字。";
String roleSet1 = "你是一个二次元魔法猫娘,你的名字叫小灵,你的性格可爱活泼,说话简短,同时带有攻击嘲讽意味,你喜欢在回答的末尾加一个“喵”字。";


......

                // 增加足够多的同音字可以提高唤醒率,支持多唤醒词唤醒(askquestion.indexOf("你好") > -1 || askquestion.indexOf("您好") > -1) &&
                if( (askquestion.indexOf("坤坤") > -1 || askquestion.indexOf("小白") > -1 || askquestion.indexOf("丁真") > -1 || askquestion.indexOf("九歌") > -1))
                {
                    await_flag = 0;     //退出待机状态
                    start_con = 1;      //对话开始标识
                    Answer = "喵~九歌在的,请尽情吩咐小九歌,主人。";
                    response();     //屏幕显示Answer以及语音播放
                    conflag = 1;
                    return;
                }
......

Answer = "嗨~我没有听清,请再说一遍吧";

......

            else if (askquestion.indexOf("退下") > -1 || askquestion.indexOf("再见") > -1 || askquestion.indexOf("拜拜") > -1)
            {
                start_con = 0;      // 标识一轮对话结束
                musicplay = 0;
                Answer = "喵~主人,我先退下了,有事再叫我。";
                response();     //屏幕显示Answer以及语音播放
                await_flag = 1;     // 进入待机状态
                awake_flag = 0;     // 继续进行唤醒词识别
            }

......

4、编译并上传固件

在vscode中安装platformIO插件,编译并上传固件即可。

五、使用说明

1、首次使用设置

1)设备通电后,用电脑连接设备热点ESP32-Setup密码为12345678

2)打开浏览器,输入http://192.168.4.1

3)进入ESP32 Configuration页面,点击“WI-FI Management”

4)输入你的WI-FI信息,点击“Save”

如果需要在其他WIFI环境使用,也可以添加多个WIFI,只不过启动会稍微慢一点。也可以通过“Delete”删除多余的WIFI配置。

2、正常使用

点击ESP32开发板上的“EN”重启键设备,就可以连接WIFI开始使用了。在待机状态下,使用唤醒词“小白”唤醒设备,设备应答后就可以开始提问。设备回答完一个问题,过一段时间没有新的问题,设备会自动回到待机模式。也可以说“拜拜”“退下”让设备进入待机模式。如要在设备回答过程中终止设备回答,可以按ESP32开发板上的“ROOT”按钮,开始下一个提问。如设备响应出现问题,可以按“EN”键重启设备。

六、组装

1、打印3D外壳

在以下地址下载3D打印外壳文件:

百度网盘链接:https://pan.baidu.com/s/1ek-Phzb4BuplCgqt3bZ0RA?pwd=ulze 
提取码:ulze 
 

2、组装

按照接线图进行组装,注意为方便操作,需将ESP32开发板上的“EN”、“ROOT”键外接到机壳上。

3、效果视频

ESP32制作聊天机器人(连接大模型)_哔哩哔哩_bilibili

### 回答1: 在 TURBO C 2.0 中,您可以使用 biosdisk() 函数来格式化软盘。 下面是一段代码示例: ``` #include <stdio.h> #include <dos.h> int main() { // 定义扇区的大小 unsigned int sector_size[3] = {512, 512, 1024}; // 定义填充字节 unsigned char fill_char[3] = {0xF6, 0xF6, 0x48}; // 格式化磁道 70 面 0 的前三个扇区 for (int i = 0; i < 3; i++) { int result = biosdisk(2, 0, 70, 0, i + 1, 1, sector_size[i], fill_char[i]); if (result != 0) { printf("格式化扇区 %d 失败,返回码: %d\n", i + 1, result); } } return 0; } ``` 请注意,在使用 biosdisk() 函数之前,需要包含 dos.h 头文件。 希望这能帮到您! ### 回答2: 使用TURBO C 2.0语言,可以通过以下代码格式化软盘的70磁道0面,并分别格式化3个扇区,大小分别为512字节、512字节和1024字节。其中,前两个扇区使用F6填充,第三个扇区使用48填充。 ```c #include<stdlib.h> #include<stdio.h> #include<dos.h> void formatFloppyDisk(){ union REGS regs; regs.h.ah = 0x0;// To format a floppy disk, we set AH=0 regs.h.dl = 0;// Drive number (0=A, 1=B, etc.) regs.x.cx = 0;// Track number to format regs.h.dh = 0;// Head number regs.h.al = 0;// Sector size (0=default, 1=512 bytes, 2=1024 bytes, 3=2048 bytes etc.) int FILL_BYTE = 0;// The byte value to fill the sectors with during formatting int NUM_SECTORS = 3;// Number of sectors to format // To format 70th track 0th head regs.x.ax = 0x1301; // 0x13 = Reset disk system, 01H = Reset only specified drive int86(0x13, &regs, &regs); // BIOS interrupt to reset disk system for (int i=0; i<NUM_SECTORS; i++){ regs.x.ax = 0x3101; // 0x31 = Write Format, 01H = Format only current track regs.x.bx = 0x0001; // 0x00 = Drive A:, 01H = Head 1, 0 = Generate ID Field depending on the disk in the drive 1 = Keep the ID Field all zeros regs.x.cx = 0x0170; // Track number=70(0-79 range) regs.h.dh = 0x00; // Head number=0 or 1 regs.h.al = 0x02; // Control byte=always zero regs.x.dx = i+1; // Sector number starting from 1 regs.x.si = 0x0000; // segment and offset of read/write buffer regs.x.di = 0x0000; // segment and offset of result if(i == 2){ FILL_BYTE = 0x48; // Fill the third sector with 48 regs.x.ax = 0x3102; // 0x31 = Write Format, 02H = Format sequential tracks immediately following the one being formatted }else{ FILL_BYTE = 0xF6; // Fill the first two sectors with F6 } regs.h.ah = FILL_BYTE; // Fill the sector with specified byte int86(0x13, &regs, &regs); // BIOS interrupt to format the specified sector } } int main(){ formatFloppyDisk(); return 0; } ``` 上述代码使用了INT 0x13,即BIOS中断服务例程,来执行软盘格式化操作。通过设置寄存器的不同参数,可以指定要格式化的磁道、面、扇区大小和填充字节。在这个例子中,我们格式化了软盘70磁道0面的3个扇区,前两个扇区使用F6填充,第三个扇区使用48填充。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值