63 lines
1.6 KiB
C++
63 lines
1.6 KiB
C++
/**
|
|
* @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(); } |