ESP32s3系列ai语音聊天
注释:本博客记录作者搜寻资料学习成果,使用请自行删减。
感谢让我学到很多的博主:https://vor2345.blog.youkuaiyun.com/article/details/136975580
在今年九月份我在网上看到了自己的ai聊天小助手,说做就做!搜索了很多资料
选择物料: esp32s3(需要大容量ram)作者用的是xiao-sense系列,max98357,麦克风,喇叭
话不多说开写
用的是VScode,下载platformIO,然后新建工程
思路简介
实现大模型接入玩法
制作自己的AI助手小人
首先通过简单
一:连接wifi✔
二:接收音频✔
三:打包数据成josn格式✔
四:接入模型API实现STT✔
五:打包传输下来的文件转成josn格式✔
六:接入模型API实现TTT✔
七:串口输出文本✔
八:再次上传接入语音minmax实现TTS✔
九:编码收集,I2S播放✔
*/
用到的库
arduinojson库
audioi2s库
#include <Arduino.h>
#include "base64.h"
#include "WiFi.h"
#include "HTTPClient.h"
#include "cJSON.h"
#define ARDUINOJSON_SLOT_ID_SIZE 4
#define ARDUINOJSON_STRING_LENGTH_SIZE 4
#include <ArduinoJson.h>
#include "Audio.h"
#include <SPIFFS.h>
Audio audio;
HTTPClient HTTP_TTS;
#define key 3
#define ADC 2
#define ledPin BUILTIN_LED
//max98357扬声器引脚
#define I2S_DOUT 6 // DIN connection
#define I2S_BCLK 5 // Bit clock
#define I2S_LRC 4 // Left Right Clock
下面填写自己的注册信息百度有免费的token可以申请
创建应用,我们用短句识别就可以了
将自己的信息填入下面
// 2、修改百度语言技术的用户信息:https://console.bce.baidu.com/ai/?fromai=1#/ai/speech/app/list
String CUID = "1155xxxxxx"; //AppID
String CLIENT_ID = "uxlxxxxxxxxxxxxxxxxxxxxxxx"; //API Key
String CLIENT_SECRET = "6Qxxxxxxxxxxxxxxxxxxxxxxxx"; //Secret key
String token;//通过上面得到的密钥
下面是tts要用到的api信息
我们使用的是minmax他的响应比较快
上他的官网注册一下
下面分别是TTT和TTS的接口
//https://www.minimaxi.com/news/%E9%80%9A%E7%94%A8%E5%A4%A7%E6%A8%A1%E5%9E%8Babab65%E7%B3%BB%E5%88%97
//Minmax参数
const char *AIKey = "";//TTT的密钥在接口密钥里新建一个
String apiUrl = "https://api.minimax.chat/v1/text/chatcompletion_v2";
String TTS_group_id ="";//账户信息里的groupID
String TTS_API_Key =";// TTS 同上最好再建一个密钥用同一个应该也可以
//const char *tts_url = "https://api.minimax.chat/v1/t2a_pro?GroupId="+TTS_group_id;
一些参数定义
HTTPClient http_client;
hw_timer_t *timer = NULL;
const int recordTimeSeconds = 3;//录音时间秒为单位
const int adc_data_len = 16000 * recordTimeSeconds;
const int data_json_len = adc_data_len * 2 * 1.4;
uint16_t *adc_data;
char *data_json;
String aduio_json;
uint8_t adc_start_flag = 0;//开始采集标志位
uint8_t adc_complete_flag = 0;//采集完成标志位
uint32_t num = 0;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
String payload;//STT返回值
String input ;
String answer, aduiourl;
int audio_time ;
int audio_end = 0;
函数申明
//函数申明
String gainToken();
void IRAM_ATTR onTimer();
void sendToSTT();
void assembleJson(String token);
String getGPTAnswer(String inputText);
String decodejson(String payload_message);
String getvAnswer(String ouputText) ;
void writeHexToMP3(String hexString, const char* filePath);
//WIFI账户和密码
const char* ssid = "veryveryfast";
const char* password = "veryveryfast123";
//WIFI连接
void WiFi_Connect()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
//这里是阻塞程序,直到连接成功
delay(300);
Serial.print(".");
}
}
//初始化
void setup()
{
Serial.begin(115200); // open the serial port at 115200 bps;
Serial.println(ESP.getFreeHeap());
delay(100);
pinMode(ADC, ANALOG);//麦克风接口
Serial.print("Connecting.. ");
WiFi_Connect();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
delay(100);
//上面是WiFi连接
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT);//接口定义
audio.setVolume(21); // 默认0...21声音大小
delay(1000);
token = gainToken();//得到密钥
timer = timerBegin(0, 80