removed codecs to save memory
This commit is contained in:
162
lib/ESP32-audioI2S/examples/OpenAI_Speech/readme.md
Normal file
162
lib/ESP32-audioI2S/examples/OpenAI_Speech/readme.md
Normal file
@@ -0,0 +1,162 @@
|
||||
# OpenAI Speech
|
||||
|
||||
### platformio.ini - example for: [XIAO ESP32S3](https://www.seeedstudio.com/XIAO-ESP32S3-p-5627.html)
|
||||
|
||||
```ShellCheck Config
|
||||
[env:seeed_xiao_esp32s3]
|
||||
platform = espressif32
|
||||
board = seeed_xiao_esp32s3
|
||||
framework = arduino
|
||||
monitor_speed = 115200
|
||||
build_flags =
|
||||
-Wall
|
||||
-Wextra
|
||||
-DCORE_DEBUG_LEVEL=3
|
||||
-DBOARD_HAS_PSRAM
|
||||
-DAUDIO_LOG
|
||||
-DARDUINO_RUNNING_CORE=1 ; Arduino Runs On Core (setup, loop)
|
||||
-DARDUINO_EVENT_RUNNING_CORE=1 ; Events Run On Core
|
||||
lib_deps =
|
||||
https://github.com/schreibfaul1/ESP32-audioI2S.git
|
||||
```
|
||||
|
||||
### main.cpp - using xTask example:
|
||||
|
||||
```cpp
|
||||
#include <Arduino.h>
|
||||
#include "SPI.h"
|
||||
#include <WiFi.h>
|
||||
#include <WiFiMulti.h>
|
||||
#include "Audio.h"
|
||||
|
||||
// WiFi credentials
|
||||
#define WIFI_SSID "<YOUR_WIFI_SSID>"
|
||||
#define PASSWORD "<YOUR_WIFI_PASSWORD>"
|
||||
#define OPENAI_API_KEY "<YOUR_OPENAI_API_KEY>"
|
||||
|
||||
// Configure I2S pins
|
||||
#define I2S_LRC D1
|
||||
#define I2S_DOUT D2
|
||||
#define I2S_BCLK D3
|
||||
#define I2S_MCLK 0
|
||||
|
||||
// Vars
|
||||
bool isWIFIConnected;
|
||||
|
||||
String result = "Added OpenAI Text to speech API support";
|
||||
String instructions = "Voice: Gruff, fast-talking, and a little worn-out, like a New York cabbie who's seen it all but still keeps things moving.\n\n";
|
||||
|
||||
// Inits
|
||||
WiFiMulti wifiMulti;
|
||||
TaskHandle_t playaudio_handle;
|
||||
QueueHandle_t audioQueue;
|
||||
Audio audio;
|
||||
|
||||
// Declaration
|
||||
void audio_info(const char *info);
|
||||
void wifiConnect(void *pvParameters);
|
||||
void playaudio(void *pvParameters);
|
||||
|
||||
// Default
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
isWIFIConnected = false;
|
||||
|
||||
// Create queue
|
||||
audioQueue = xQueueCreate(1, sizeof(int));
|
||||
if (audioQueue == NULL) {
|
||||
Serial.println("Failed to create audioQueue");
|
||||
while(1);
|
||||
}
|
||||
|
||||
// Create tasks
|
||||
xTaskCreate(wifiConnect, "wifi_Connect", 4096, NULL, 0, NULL);
|
||||
delay(500);
|
||||
xTaskCreate(playaudio, "playaudio", 1024 * 8, NULL, 3, &playaudio_handle);
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
audio.loop();
|
||||
}
|
||||
|
||||
void audio_info(const char *info) {
|
||||
Serial.print("audio_info: ");
|
||||
Serial.println(info);
|
||||
}
|
||||
|
||||
void wifiConnect(void *pvParameters) {
|
||||
while(1) {
|
||||
if (!isWIFIConnected) {
|
||||
wifiMulti.addAP(WIFI_SSID, PASSWORD);
|
||||
Serial.println("Connecting to WiFi...");
|
||||
while (wifiMulti.run() != WL_CONNECTED) {
|
||||
vTaskDelay(500);
|
||||
}
|
||||
Serial.print("Connected to WiFi\nIP: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
isWIFIConnected = true;
|
||||
|
||||
Serial.println("Sending result...");
|
||||
int eventMessage;
|
||||
if (xQueueSend(audioQueue, &eventMessage, 0) != pdPASS) {
|
||||
Serial.println("Failed to send result to queue");
|
||||
}
|
||||
} else {
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void playaudio(void *pvParameters) {
|
||||
while(1) {
|
||||
if (isWIFIConnected && audioQueue != 0) {
|
||||
int eventMessage;
|
||||
Serial.println("Waiting for result...");
|
||||
if (xQueueReceive(audioQueue, &eventMessage, portMAX_DELAY) == pdPASS) {
|
||||
Serial.print("Received result: ");
|
||||
Serial.println(result);
|
||||
|
||||
// Speech
|
||||
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT, -1);
|
||||
audio.setVolume(15); // 0...21
|
||||
audio.openai_speech(OPENAI_API_KEY, "tts-1", result, instructions, "shimmer", "mp3", "1");
|
||||
}
|
||||
} else {
|
||||
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
---
|
||||
|
||||
### console output example:
|
||||
|
||||
```ShellSession
|
||||
--- Terminal on /dev/ttyACM0 | 115200 8-N-1
|
||||
--- Available filters and text transformations: colorize, debug, default, direct, esp32_exception_decoder, hexlify, log2file, nocontrol, printable, send_on_enter, time
|
||||
--- More details at https://bit.ly/pio-monitor-filters
|
||||
--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
|
||||
[ 3911][I][WiFiMulti.cpp:114] run(): [WIFI] scan done
|
||||
[ 3911][I][WiFiMulti.cpp:119] run(): [WIFI] 15 networks found
|
||||
[ 3911][I][WiFiMulti.cpp:160] run(): [WIFI] Connecting BSSID: 26:AD:69:C2:AB:E8 SSID: OpwnSS Channel: 11 (-38)
|
||||
[ 4000][I][WiFiMulti.cpp:174] run(): [WIFI] Connecting done.
|
||||
Connected to WiFi
|
||||
IP: 192.168.86.23
|
||||
audio_info: Connect to new host: "api.openai.com"
|
||||
audio_info: PSRAM found, inputBufferSize: 638965 bytes
|
||||
[ 4698][I][Audio.cpp:5331] ts_parsePacket(): parseTS reset
|
||||
audio_info: buffers freed, free Heap: 255068 bytes
|
||||
audio_info: connect to api.openai.com on port 443 path /v1/audio/speech
|
||||
audio_info: SSL has been established in 925 ms, free Heap: 213908 bytes
|
||||
[ 6921][I][Audio.cpp:4000] parseContentType(): ContentType audio/mpeg, format is mp3
|
||||
audio_info: MP3Decoder has been initialized, free Heap: 214564 bytes , free stack 3760 DWORDs
|
||||
[ 6924][I][Audio.cpp:3846] parseHttpResponseHeader(): Switch to DATA, metaint is 0
|
||||
audio_info: stream ready
|
||||
audio_info: syncword found at pos 0
|
||||
audio_info: Channels: 1
|
||||
audio_info: SampleRate: 24000
|
||||
audio_info: BitsPerSample: 16
|
||||
audio_info: BitRate: 160000
|
||||
audio_info: slow stream, dropouts are possible
|
||||
audio_info: End of Stream.
|
||||
```
|
||||
61
lib/ESP32-audioI2S/examples/OpenAI_Speech/src/main.cpp
Normal file
61
lib/ESP32-audioI2S/examples/OpenAI_Speech/src/main.cpp
Normal file
@@ -0,0 +1,61 @@
|
||||
#include <Arduino.h>
|
||||
#include "SPI.h"
|
||||
#include <WiFi.h>
|
||||
#include <WiFiMulti.h>
|
||||
#include "Audio.h"
|
||||
|
||||
// WiFi credentials
|
||||
#define WIFI_SSID "<YOUR_WIFI_SSID>"
|
||||
#define PASSWORD "<YOUR_WIFI_PASSWORD>"
|
||||
#define OPENAI_API_KEY "<YOUR_OPENAI_API_KEY>" // https://platform.openai.com/api-keys
|
||||
|
||||
// Configure I2S pins
|
||||
#define I2S_LRC D1
|
||||
#define I2S_DOUT D2
|
||||
#define I2S_BCLK D3
|
||||
#define I2S_MCLK 0
|
||||
|
||||
// Inits
|
||||
WiFiMulti wifiMulti;
|
||||
Audio audio;
|
||||
|
||||
|
||||
String input = "Added OpenAI Text to speech API support";
|
||||
String instructions = "Voice: Gruff, fast-talking, and a little worn-out, like a New York cabbie who's seen it all but still keeps things moving.\n\n"
|
||||
"Tone: Slightly exasperated but still functional, with a mix of sarcasm and no-nonsense efficiency.\n\n"
|
||||
"Dialect: Strong New York accent, with dropped \"r\"s, sharp consonants, and classic phrases like whaddaya and lemme guess.\n\n"
|
||||
"Pronunciation: Quick and clipped, with a rhythm that mimics the natural hustle of a busy city conversation.\n\n"
|
||||
"Features: Uses informal, straight-to-the-point language, throws in some dry humor, and keeps the energy just on the edge of impatience but still";
|
||||
|
||||
// Declaration
|
||||
void audio_info(const char *info);
|
||||
|
||||
// Default
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
// Wifi
|
||||
wifiMulti.addAP(WIFI_SSID, PASSWORD);
|
||||
Serial.println("Connecting to WiFi...");
|
||||
while (wifiMulti.run() != WL_CONNECTED) {
|
||||
delay(500);
|
||||
}
|
||||
Serial.print("Connected to WiFi\nIP: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
|
||||
delay(500);
|
||||
|
||||
// Speech
|
||||
audio.setPinout(I2S_BCLK, I2S_LRC, I2S_DOUT, -1);
|
||||
audio.setVolume(15); // 0...21
|
||||
audio.openai_speech(OPENAI_API_KEY, "tts-1", input, instructions, "shimmer", "mp3", "1");
|
||||
}
|
||||
|
||||
void loop(void) {
|
||||
vTaskDelay(1);
|
||||
audio.loop();
|
||||
}
|
||||
|
||||
void audio_info(const char *info) {
|
||||
Serial.print("audio_info: ");
|
||||
Serial.println(info);
|
||||
}
|
||||
Reference in New Issue
Block a user