/** * @file streams-i2s-tf.ino * @author Phil Schatzmann * @brief We read audio data from a I2S Microphone and send it to Tensorflow Lite to recognize the words yes and no * @version 0.1 * @date 2022-04-07 * * @copyright Copyright (c) 2022 * */ #include "AudioTools.h" #include "AudioTools/AudioLibs/TfLiteAudioStream.h" #include "model.h" // tensorflow model I2SStream i2s; // Audio source TfLiteAudioStream tfl; // Audio sink const char* kCategoryLabels[4] = { "silence", "unknown", "yes", "no", }; StreamCopy copier(tfl, i2s); // copy mic to tfl int channels = 1; int samples_per_second = 16000; void respondToCommand(const char* found_command, uint8_t score, bool is_new_command) { if (is_new_command) { char buffer[80]; sprintf(buffer, "Result: %s, score: %d, is_new: %s", found_command, score, is_new_command ? "true" : "false"); Serial.println(buffer); } } void setup() { Serial.begin(115200); AudioToolsLogger.begin(Serial, AudioToolsLogLevel::Warning); // setup Audioi2s input auto cfg = i2s.defaultConfig(RX_MODE); cfg.channels = channels; cfg.sample_rate = samples_per_second; cfg.use_apll = false; //cfg.auto_clear = true; cfg.buffer_size = 512; cfg.buffer_count = 16; i2s.begin(cfg); // Setup tensorflow output auto tcfg = tfl.defaultConfig(); tcfg.setCategories(kCategoryLabels); tcfg.channels = channels; tcfg.sample_rate = samples_per_second; tcfg.kTensorArenaSize = 10 * 1024; tcfg.respondToCommand = respondToCommand; tcfg.model = g_model; tfl.begin(tcfg); } void loop() { copier.copy(); }