딥러닝

아두이노 나노 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 = &micro_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;
  }
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다