아두이노 나노 33BLE 음성인식
아두이노 나노 33ble 기능
아두이노 나노 33 BLE 보드는 다양한 IoT(사물인터넷) 프로젝트를 개발할 수 있는 강력한 마이크로 컨트롤러이다.
프로세서 :
Nordic nRF52840 : ARM Cortex-M4 32비트 프로세서(64MHz) 및 1MB 플래시 메모리와 256KB SRAM이 탑재되어있다.
무선 연결 :
블루투스 5.0 BLE(Bluetooth Low Energy)를 지원하고, NFC(Near Field Communication) 근거리 무선 통신 기능이 탑재되어있다.
실습 예제
다음은 TensorFlow Lite를 사용하여 키워드(예: “yes”, “no”)를 인식하는 예제 코드입니다.
#include <Arduino.h>
#include <PDM.h>
#include <TensorFlowLite.h>
#include <tensorflow/lite/micro/all_ops_resolver.h>
#include <tensorflow/lite/micro/micro_error_reporter.h>
#include <tensorflow/lite/micro/micro_interpreter.h>
#include <tensorflow/lite/schema/schema_generated.h>
#include <tensorflow/lite/version.h>
// TensorFlow Lite 모델 파일 및 설정
#include "model.h"
const int kTensorArenaSize = 10 * 1024;
uint8_t tensor_arena[kTensorArenaSize];
tflite::MicroErrorReporter micro_error_reporter;
tflite::ErrorReporter* error_reporter = µ_error_reporter;
const tflite::Model* model = nullptr;
tflite::MicroInterpreter* interpreter = nullptr;
TfLiteTensor* input = nullptr;
TfLiteTensor* output = nullptr;
// 오디오 버퍼 설정
const int sample_buffer_size = 256;
int16_t sample_buffer[sample_buffer_size];
volatile int samples_read = 0;
// 음성 데이터 처리
void onPDMdata() {
int bytes_available = PDM.available();
PDM.read(sample_buffer, bytes_available);
samples_read = bytes_available / 2;
}
void setup() {
Serial.begin(9600);
// PDM 마이크 초기화
if (!PDM.begin(1, 16000)) {
Serial.println("Failed to start PDM!");
while (1);
}
PDM.onReceive(onPDMdata);
// TensorFlow Lite 모델 로드
model = tflite::GetModel(g_model);
if (model->version() != TFLITE_SCHEMA_VERSION) {
Serial.println("Model schema version mismatch!");
while (1);
}
static tflite::MicroMutableOpResolver<10> micro_op_resolver;
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_DEPTHWISE_CONV_2D, tflite::ops::micro::Register_DEPTHWISE_CONV_2D());
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_MAX_POOL_2D, tflite::ops::micro::Register_MAX_POOL_2D());
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_FULLY_CONNECTED, tflite::ops::micro::Register_FULLY_CONNECTED());
micro_op_resolver.AddBuiltin(tflite::BuiltinOperator_SOFTMAX, tflite::ops::micro::Register_SOFTMAX());
static tflite::MicroInterpreter static_interpreter(
model, micro_op_resolver, tensor_arena, kTensorArenaSize, error_reporter);
interpreter = &static_interpreter;
interpreter->AllocateTensors();
input = interpreter->input(0);
output = interpreter->output(0);
}
void loop() {
if (samples_read > 0) {
// 음성 데이터를 TensorFlow Lite 모델에 입력
for (int i = 0; i < samples_read; ++i) {
input->data.int16[i] = sample_buffer[i];
}
TfLiteStatus invoke_status = interpreter->Invoke();
if (invoke_status != kTfLiteOk) {
Serial.println("Error invoking the interpreter!");
return;
}
// 결과 처리
int8_t* results = output->data.int8;
Serial.print("Detection results: ");
for (int i = 0; i < output->dims->data[1]; ++i) {
Serial.print(results[i]);
Serial.print(" ");
}
Serial.println();
samples_read = 0;
}
}