#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);

 }

}
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐