아두이노

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

    답글 남기기

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