Question/Issue:
I want to implements Edge Impulse AI Edge Model for DF Robot 1154 AI Camera. Here is a first demo with ChatGPT.
I want to trigger KeyWord Spotting before capturing and sending audio to ChatGPT. I followed Edge Impulse Tutorial + Tour but I struggle at the end implementing to the ESP32. And ChatGPT hallucinate at providing the right answers … the board reboot when I call run_classifier().
Project ID:
My project ID should be 678141 I folllowed all the step generating a “Sarah” keyword with the default value “Quantized”
Context/Use case:
I’m new to Edge Impulse and just follow the tutorial because I wan tot give a try on AI on Edge and it seems the best way to do it ![]()
The goal is to perform Keyword Spotting then capturing audio and send it to ChatGPT. See the youtube video demo.
Steps Taken:
- I follow the tutorial train on “Sarah” keyword
- Get the default zip Quantized I assume
- Throw the library + code to make it work
I think (and ChatGPT is obssessed) the problems comes
- from a memory issue or size because of the model (I don’t believe)
- from memory management or leak with malloc and
- from the usage 16bit vs 8bit etc …
Expected Outcome:
I expect to get a value corresponding to the keywork spotting.
Then I’ll put the code into a task
Then I’ll trigger the rest of my code that send audio to ChatGPT, take picture, …
Actual Outcome:
The board reboot on run_classifier()
Reproducibility:
- [x ] Always
Environment:
- Platform: Arduino v3 on DFR1154_ESP32_S3_AI_CAM
- Build Environment Details: PlatformIO on VSCode
- OS Version: Windows 11
- Edge Impulse Version (Firmware): ? Major 1 / Minor 71 / Patch 29
- Project Version: 2
Logs/Attachments:
No logs, it compile correctly and fails at Serial.println("Run classifier...");
Additional Information:
I’m using PlatformIO hard time figuring out I just have to declare the zip all by it self in platformIO. It is configured to use Arduino v3 and so ESP_I2S.h
[platformio]
src_dir = src
[env:esp32-s3-aicam]
platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip
board = esp32-s3-devkitc1-n16r8
framework = arduino
build_flags =
-w
-DBOARD_HAS_PSRAM
-DARDUINO_USB_CDC_ON_BOOT=1
-DCORE_DEBUG_LEVEL=1
-DCONFIG_WIFI_ENABLED
lib_deps =
mathertel/OneButton@^2.6.1
gilmaimon/ArduinoWebsockets@^0.5.4
bblanchon/ArduinoJson@^7.3.1
./lib/keyword-spotting-v2.zip
With the help of ChatGPT. I use #include “ESP_I2S.h”
#include "ESP_I2S.h"
#include "edge-impulse-sdk/classifier/ei_run_classifier.h"
#include "model-parameters/model_metadata.h"
#include "tflite-model/tflite_learn_5_compiled.h"
#define EI_CLASSIFIER_USE_QUANTIZED 1
#define EI_MAX_AUDIO_SAMPLES 16000 // 1 seconde à 16kHz
static int8_t audio_data_int8[EI_MAX_AUDIO_SAMPLES];
static float audio_data_float[EI_MAX_AUDIO_SAMPLES];
void runEdgeImpulse() {
Serial.println("Record 1 second of audio...");
size_t wav_size = 0;
uint8_t* wav_buffer = i2s_rec.recordWAV(1, &wav_size);
if (!wav_buffer) {
Serial.println("Erreur wav_buffer");
return;
}
Serial.println("Prepare audio...");
int16_t* audio_data_raw = (int16_t*)wav_buffer;
size_t sample_count = wav_size / sizeof(int16_t);
if (sample_count > EI_MAX_AUDIO_SAMPLES) sample_count = EI_MAX_AUDIO_SAMPLES;
Serial.println("Convert int16_t to int8_t...");
for (size_t i = 0; i < sample_count; i++) {
int val = audio_data_raw[i] >> 8;
if (val > 127) val = 127;
if (val < -128) val = -128;
audio_data_int8[i] = (int8_t)val;
}
Serial.println("Convert int8_t to float...");
if (numpy::int8_to_float(audio_data_int8, audio_data_float, sample_count) != 0) {
Serial.println("Erreur int8_to_float");
free(wav_buffer);
return;
}
Serial.println("Build signal...");
signal_t signal;
if (numpy::signal_from_buffer(audio_data_float, sample_count, &signal) != 0) {
Serial.println("Erreur signal_from_buffer");
free(wav_buffer);
return;
}
Serial.println("Run classifier...");
ei_impulse_result_t result = {};
if (run_classifier(&signal, &result, false) != EI_IMPULSE_OK) {
Serial.println("Erreur run_classifier");
free(wav_buffer);
return;
}
Serial.println("Print results...");
for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {
ei_printf("%s:\t%.5f\n", result.classification[ix].label, result.classification[ix].value);
}
free(wav_buffer);
}
The ei_shim.cpp requires
extern "C" {
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include "esp_timer.h"
void* ei_malloc(size_t size) { return malloc(size); }
void* ei_calloc(size_t n, size_t size) { return calloc(n, size); }
void ei_free(void* ptr) { free(ptr); }
void ei_printf(const char *format, ...) {
va_list args;
va_start(args, format);
vprintf(format, args);
va_end(args);
}
void ei_printf_float(float f) { printf("%f\n", f); }
uint64_t ei_read_timer_us() { return esp_timer_get_time(); }
bool ei_run_impulse_check_canceled() { return false; }
}