ESP32 对接GPT fuasr语音在线识别 webSocket协议
【代码】ESP32 对接GPT。
·
#include <WiFi.h>
#include <WebSocketsClient.h>
#include <ArduinoJson.h>
#include <driver/adc.h>
#include <HTTPClient.h>
WebSocketsClient webSocket;
#define MIC_PIN 1
#define SAMPLE_RATE 16000 // 采样率
#define BUFFER_SIZE 9600
int16_t buffer[BUFFER_SIZE];
String urlencode(String str)
{
String encodedString="";
char c;
char code0;
char code1;
char code2;
for (int i =0; i < str.length(); i++){
c=str.charAt(i);
if (c == ' '){
encodedString+= '+';
} else if (isalnum(c)){
encodedString+=c;
} else{
code1=(c & 0xf)+'0';
if ((c & 0xf) >9){
code1=(c & 0xf) -10 + 'A';
}
c=(c>>4)&0xf;
code0=c+'0';
if (c > 9){
code0=c - 10 + 'A';
}
code2='\0';
encodedString+='%';
encodedString+=code0;
encodedString+=code1;
//encodedString+=code2;
}
yield();
}
return encodedString;
}
//GPT请求
void printTextWithPunctuation(const JsonObject& doc) {
JsonArray stamp_sents = doc["stamp_sents"];
String result = "";
for(JsonVariant v : stamp_sents) {
JsonObject obj = v.as<JsonObject>();
result += obj["text_seg"].as<String>();
result += obj["punc"].as<String>();
}
result.replace(" ", "");
Serial.println(result);
//**************************************************************
delay(10);
HTTPClient http;
http.setTimeout(5000);
result = urlencode(result);
http.begin("https://gptxasdax.vuasdz.top/shuo.php?shuo="+ result); //Specify the URL
int httpCode = http.GET(); //Make the request
if (httpCode > 0) { //Check for the returning code
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
}
else {
Serial.println("Error on HTTP request");
}
http.end(); //Free the resources
}
void webSocketEvent(WStype_t type, uint8_t* payload, size_t length) {
switch (type) {
case WStype_DISCONNECTED:
Serial.printf("[WSc] Disconnected!\n");
break;
case WStype_CONNECTED:
Serial.printf("[WSc] Connected to url: %s\n", payload);
break;
case WStype_TEXT:
//以ASCII显示
Serial.printf("[WSc] get text length: %u\n", length);
/*for(size_t i = 0; i < length; i++) {
Serial.printf("%c", payload[i]);
}
Serial.println();*/
DynamicJsonDocument doc(9600);
deserializeJson(doc, payload);
printTextWithPunctuation(doc.as<JsonObject>());
break;
//打印回复文字
/*Serial.printf("[WSc] get text length: %u\n", length);
for (size_t i = 0; i < length; i++) {
Serial.printf("%c", payload[i]);
}
Serial.println();
// 新增的JSON解析代码
String payloadStr = String((char*)payload);
DynamicJsonDocument doc(1024);
deserializeJson(doc, payloadStr);
String text = doc["text"].as<String>(); // 提取"text"字段
Serial.println(text); */ // 打印"text"字段
}
}
void SendRequest() {
DynamicJsonDocument doc(1024);
// Adding data
JsonArray chunk_size = doc.createNestedArray("chunk_size");
chunk_size.add(5);
chunk_size.add(10);
chunk_size.add(5);
doc["wav_name"] = "ESP32";
doc["wav_format"] = "pcm";
doc["is_speaking"] = true;
doc["audio_fs"] = 16000;
doc["chunk_interval"] = 10;
doc["mode"] = "2pass";
doc["hotwords"] = "{\"阿里巴巴\":20,\"hello world\":40}";
doc["itn"] = false;
// Convert JsonDocument to string
String message;
serializeJson(doc, message);
// Send JSON data
webSocket.sendTXT(message);
}
void SendRequestEND() {
DynamicJsonDocument doc(1024);
// Adding data
JsonArray chunk_size = doc.createNestedArray("chunk_size");
chunk_size.add(5);
chunk_size.add(10);
chunk_size.add(5);
doc["wav_name"] = "ESP32";
doc["is_speaking"] = false;
doc["chunk_interval"] = 10;
doc["mode"] = "2pass";
// Convert JsonDocument to string
String messages;
serializeJson(doc, messages);
// Send JSON data
webSocket.sendTXT(messages);
}
void setup() {
// 配置 ADC
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_0, ADC_ATTEN_DB_11);
Serial.begin(115200);
WiFi.begin("5054642", "2546228.");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
webSocket.beginSSL("www.funasr.com", 10095);
webSocket.onEvent(webSocketEvent);
pinMode(14, OUTPUT);
digitalWrite(14, HIGH);
}
void loop() {
webSocket.loop();
if (digitalRead(14) == 0) {
delay(10);
SendRequest();
while (digitalRead(14) == 0) {
for (int i = 0; i < BUFFER_SIZE; i++) {
buffer[i] = adc1_get_raw(ADC1_CHANNEL_0)<<4;
delayMicroseconds(1000000 / SAMPLE_RATE);
}
// 使用websocket发送bytes数据
uint8_t* byte_buffer = (uint8_t*)buffer;
webSocket.sendBIN(byte_buffer, BUFFER_SIZE * sizeof(int16_t));
}
SendRequestEND();
webSocket.loop();
delay(500);
}
}
更多推荐
所有评论(0)