
ESP32直接对话大语言模型人工智能语音助手
简介
ESP32S3使用INMP441接收声音换为文字,再讲文字发送至大语言模型服务提问,文字发送至TTS语音合成服务,并通过MAX98357A播放音频。
简介:ESP32S3使用INMP441接收声音换为文字,再讲文字发送至大语言模型服务提问,文字发送至TTS语音合成服务,并通过MAX98357A播放音频。开源协议
:GPL 3.0
描述
ESP32S3使用INMP441接收声音后将pcm音频数据发送至STT语音识别服务转换为文字,再将文字发送至大语言模型API提问,最后将回答的文字发送至TTS语音合成服务,并通过MAX98357A播放音频,过程中用TFT触摸显示屏进行交互显示。
视频连接:
https://www.bilibili.com/video/BV1F1421k7Sv/?vd_source=922712da2bcef8666165702c88f19f89
项目原本是做ESP32播放MP3播放器的衍生项目。想着既然能播放就也能录音,所以就继续作了这个用esp32进行音频处理的简单处理的小玩意。
项目中STT语文识别和TTS语音合成都是使用的是讯飞API,需要先注册讯飞账号(https://www.xfyun.cn/),领取试用礼包后,方可以免费用时间。
项目中大语言模型使用的是火山引擎的豆包同款引擎(https://www.volcengine.com/product/ark),也是需要先注册账号,领取免费试用后,也可以试用一段时间。
上面三个API从各自官网控制台获取到KEY后修改代码中相关的字段,才可以正常连接到API,代码中还需要修改WiFi的连接信息。
其中讯飞的服务使用webscoket连接API,TTS使用了流式处理,一边接收一边播放音频,但数据处理不严谨有时会发生错误还没有解决,请自行排查修改吧。
火山引擎使用HTTP连接API(因为火山的webscoket确实没有调通,才疏学浅见笑了),没有做到流式处理,反应时间部分浪费再了这里。
STT虽然也使用webscoket连接但没有用流式处理(懒),说短句子没有什么影响,发送长句子的话,有一部分时间也是浪费在这里了。
主任才疏学浅,勉强整合些基础知识,让这个想法实现,代码供同道新人参考,高手一笑了之。
如道友有意复刻此项目,请务必先下载源码进行编译测试,可编译通过再进行复刻尝试,如若不能还请三思。
编译环境如下
编译软件:ArduinoIDE 2.3.2
SDK: ESP32 SDK 2.0.13(开发板管理中下载)
使用主要库:TFT_eSPI 2.5.43 (库管理中下载)、
U8g2_for_TFT_eSPI (下载地址:https://github.com/Bodmer/U8g2_for_TFT_eSPI)
开发板设置:
附件的源码包中有一个 Base64_Arturo库,需先复制到libraries/ 目录下
主板上R38和R39两个电阻是控制MAX98357A模块GAIN接口上下拉的,只需焊接其中之一或都不焊接都行。切勿两个同时焊接,务必注意,默认悬空不焊接。
GAIN管脚作用:
GAIN is, well, the gain setting. You can have a gain of 3dB, 6dB, 9dB, 12dB or 15dB.
- 15dB if a 100K resistor is connected between GAIN and GND
- 12dB if GAIN is connected directly to GND
- 9dB if GAIN is not connected to anything (this is the default)
- 6dB if GAIN is connected directly to Vin
- 3dB if a 100K resistor is connected between GAIN and Vin
TFT-espi的管脚设置:
#define ILI9341_DRIVER
#define TFT_WIDTH 320
#define TFT_HEIGHT 240
#define TFT_MISO 19
#define TFT_MOSI 4 // In some display driver board, it might be written as "SDA" and so on.
#define TFT_SCLK 5
#define TFT_CS 16 // Chip select control pin5
#define TFT_DC 6 // Data Command control pin
#define TFT_RST -1 // Reset pin (could connect to Arduino RESET pin)
#define TFT_BL 7 // LED back-light
#define TFT_BACKLIGHT_ON HIGH
#define TOUCH_CS 15 // Chip select pin (T_CS) of touch screen
关于其中元器件:
ESP32S3模块选用:S3-WROOM-1-N16R8 版本 我使用的连接:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.54402e8dfVHHff&id=675349632310&_u=o2oqo1kf26cd
INMP441 与 MAX98357A 使用的都是模块,直接从淘宝上搜索购买即可
电池插头是1.25间距正接头,仅支持单节3.7v锂电池,typec接口有充电功能,可以给锂电池充电。
喇叭:MAX98357A可以推动3w喇叭
串口模块是CH340C,后面代C需要注意。
显示屏幕是3.2寸带触摸屏幕参考连接:https://item.taobao.com/item.htm?spm=a1z09.2.0.0.54402e8dfVHHff&id=643516677167&_u=o2oqo1kfcc57
主板上有一颗MPU-6050陀螺仪,本来是想用于屏幕跟随旋转使用的,但本项目并未使用,不玩的话可以空掉不焊接。
其他具体看视频介绍吧,主任基本上不回复信息,因为大部分问题我也不知该如何作答。
一定要问的话,抖音上回复的概率高些。
设计图

BOM


评论