음성 인식 기술은 장치를 핸즈프리로 제어 할 수있을뿐만 아니라 시스템에 보안을 추가하는 자동화에 매우 유용합니다. 음성 제어 장치를 만드는 것 외에도 음성 인식은 다양한 장애로 고통받는 사람들에게 중요한 도움을 제공합니다.
이전 프로젝트에서 우리는 Arduino 기반 TTS (Text to Speech) 변환기와 음성 제어 조명을 구축했습니다. 이제이 프로젝트에서는 기계 학습을 사용하여 Edge Impulse Studio를 사용하여 ' LIGHT ON' , ' LIGHT OFF' 및 ' NOISE '의 세 가지 명령을 사용하여 음성 인식 모델을 학습 할 것입니다. Edge Impulse는 개발자가 임베디드 머신 러닝을 통해 차세대 지능형 장치 솔루션을 만들 수 있도록 지원하는 온라인 머신 러닝 플랫폼입니다. 우리는 이전에 Edge impulse studio를 사용하여 기침과 소음을 구별했습니다.
필요한 구성 요소
하드웨어
- Arduino 33 BLE Sense
- LED
- 점퍼 와이어
소프트웨어
- 에지 임펄스 스튜디오
- Arduino IDE
Arduino 33 BLE Sense에 대한 자세한 자습서를 다루었습니다.
회로도
아두 이노를 이용한 음성 인식 회로도 는 아래와 같습니다. Arduino 33 BLE의 Fritzing 부분은 사용할 수 없었기 때문에 둘 다 동일한 핀아웃을 가지므로 Arduino Nano를 사용했습니다.
LED의 양극 리드는 Arduino 33 BLE 감지의 디지털 핀 5에 연결되고 음극 리드는 Arduino의 GND 핀에 연결됩니다.
Arduino 음성 인식을위한 데이터 세트 생성
여기서 Edge Impulse Studio는 음성 인식 모델을 훈련하는 데 사용됩니다. Edge Impulse Studio에서 모델을 훈련하는 것은 다른 기계 학습 프레임 워크에서 기계 학습 모델을 훈련하는 것과 유사합니다. 훈련을 위해 기계 학습 모델의 첫 번째 단계는 인식 할 수있는 데이터 샘플이있는 데이터 세트를 수집하는 것입니다.
우리의 목표는 음성 명령으로 LED를 제어하는 것이므로 모든 명령과 소음에 대한 음성 샘플을 수집하여 음성 명령과 다른 소음을 구분할 수 있도록해야합니다.
" LED ON ", " LED OFF "및 " 노이즈 "의 세 가지 클래스로 데이터 세트를 생성합니다. 데이터 세트를 만들려면 Edge Impulse 계정을 만들고 계정을 확인한 다음 새 프로젝트를 시작하세요. 모바일, Arduino 보드를 사용하여 샘플을로드하거나 데이터 세트를 에지 임펄스 계정으로 가져올 수 있습니다. 샘플을 계정에로드하는 가장 쉬운 방법은 휴대폰을 사용하는 것입니다. 이를 위해 모바일을 Edge Impulse와 연결하십시오.
휴대폰을 연결하려면 ' 장치 '를 클릭 한 다음 ' 새 장치 연결 '을 클릭하십시오.
이제 다음 창에서 '휴대폰 사용'을 클릭 하면 QR 코드가 나타납니다. 휴대폰으로 QR 코드를 스캔하거나 QR 코드에 제공된 URL을 입력하십시오.
그러면 휴대폰이 Edge Impulse 스튜디오와 연결됩니다.
휴대폰을 Edge Impulse Studio에 연결하면 이제 샘플을로드 할 수 있습니다. 샘플을로드하려면 ' 데이터 수집'을 클릭하십시오. 이제 데이터 수집 페이지에서 레이블 이름을 입력하고 마이크를 센서로 선택한 다음 샘플 길이를 입력합니다. ' 샘플링 시작 '을 클릭하면 장치가 2 초 샘플을 캡처합니다. 서로 다른 조건에서 총 10 ~ 12 개의 음성 샘플을 녹음합니다.
첫 번째 클래스의 샘플을 업로드 한 후 이제 레이블을 변경하고 ' 소등' 및 '노이즈' 클래스 의 샘플을 수집합니다.
이 샘플은 모듈 교육용이며 다음 단계에서 테스트 데이터를 수집합니다. 테스트 데이터는 학습 데이터의 30 % 이상이어야하므로 '노이즈'샘플 4 개와 '조명'및 '소등'샘플 4 ~ 5 개를 수집합니다.
모델 훈련
데이터 세트가 준비되었으므로 이제 데이터에 대한 임펄스를 생성 할 수 있습니다. 이를 위해 ' 충동 만들기 '페이지 로 이동 하십시오. 1000ms 창 크기의 기본 설정을 1200ms로 변경하고 500ms 창을 50ms로 늘립니다. 이는 데이터가 58ms마다 시작하여 한 번에 1.2 초 동안 처리된다는 것을 의미합니다.
이제 ' 임펄스 만들기' 페이지에서 ' 처리 블록 추가 '를 클릭합니다. 다음 창에서 오디오 (MFCC) 블록을 선택합니다. 그 후 ' 학습 블록 추가 '를 클릭 하고 신경망 (Keras) 블록을 선택합니다. 그런 다음 ' Save Impulse'를 클릭하십시오.
다음 단계에서 MFCC 페이지로 이동 한 다음 '기능 생성'을 클릭합니다. 모든 오디오 창에 대해 MFCC 블록을 생성합니다.
그런 다음 ' NN 분류기' 페이지 로 이동 하여 ' 신경망 설정' 의 오른쪽 상단 모서리에있는 세 개의 점을 클릭하고 ' Keras (전문가) 모드로 전환 ' 을 선택 합니다 .
원본을 다음 코드로 바꾸고 ' 최소 신뢰 등급' 을 ' 0.70'으로 변경하십시오. 그런 다음 ' 훈련 시작' 버튼을 클릭하십시오. 모델 학습이 시작됩니다.
tensorflow.keras.models에서 tf로 tensorflow 가져 오기 tensorflow.keras.layers에서 Sequential import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D from tensorflow.keras.optimizers import Adam from tensorflow.keras. import MaxNorm # 모델 아키텍처 모델 = Sequential () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Reshape ((int (X_train.shape / 13), 13, 1), input_shape = (X_train.shape,))) model.add (Conv2D (10, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, activation = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # 학습률을 제어합니다. = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # 신경망 모델 훈련.compile (loss = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), verbose = 2)verbose = 2)verbose = 2)
모델을 훈련 한 후 훈련 성능을 보여줍니다. 저에게있어 정확도는 81.1 % 이고 손실은 0.45로 이상적인 성능은 아니지만 계속 진행할 수 있습니다. 방대한 데이터 세트를 생성하여 모델의 성능을 높일 수 있습니다.
이제 음성 인식 모델이 준비되었으므로이 모델을 Arduino 라이브러리로 배포합니다. 모델을 라이브러리로 다운로드하기 전에 ' 라이브 분류' 페이지 로 이동하여 성능을 테스트 할 수 있습니다. 라이브 분류 기능을 사용하면 데이터 세트와 함께 제공된 기존 테스트 데이터를 사용하거나 휴대폰에서 오디오 데이터를 스트리밍하여 모델을 테스트 할 수 있습니다.
휴대폰으로 데이터를 테스트하려면 휴대폰에서 ' 분류 모드로 전환' 을 선택하십시오.
이제 모델을 Arduino Library로 다운로드하려면 ' 배포 '페이지 로 이동하여 ' Arduino Library'를 선택 합니다. 이제 아래로 스크롤하고 ' 빌드 '를 클릭 하여 프로세스를 시작하십시오. 그러면 프로젝트에 대한 Arduino 라이브러리가 빌드됩니다.
이제 Arduino IDE에 라이브러리를 추가하십시오. 이를 위해 Arduino IDE를 연 다음 Sketch> Include Library> Add.ZIP 라이브러리 를 클릭 합니다.
그런 다음 File> Examples> Your project name-Edge Impulse> nano_ble33_sense_microphone 으로 이동하여 예제를로드합니다.
Arduino 음성 인식을위한 Arduino 코드
여기에서 음성 명령으로 LED를 제어하기 위해 몇 가지 변경이 이루어졌습니다.
우리는 명령 확률을 인쇄하는 void loop () 에서 약간의 변경을하고 있습니다. 원래 코드에서는 모든 레이블과 해당 값을 함께 인쇄합니다.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s: %.5f \ n", result.classification.label, result.classification.value); }
LED를 제어하려면 조건문을 넣을 수 있도록 모든 명령 확률을 세 가지 변수에 저장해야합니다. 따라서 새 코드에 따르면 ' light on' 명령의 확률 이 0.50 이상이면 LED가 켜지고 ' light off' 명령 의 확률 이 0.50 이상이면 LED가 꺼집니다.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("노이즈:"); Serial.println (노이즈); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("소등:"); Serial.print (lightoff); } lighton = 1- (노이즈 + lightoff); Serial.println ("조명 켜짐:"); Serial.print (lighton); if (lighton> 0.50) {digitalWrite (led, HIGH); } if (lightoff> 0.50) {digitalWrite (led, LOW); }
변경 한 후 코드를 Arduino에 업로드하십시오. 115200 보드에서 직렬 모니터를 엽니 다.
이것이 Arduino를 사용하여 음성 인식을 구축 하고 장치를 작동하는 명령을 내리는 방법 입니다.
라이브러리와 코드가 포함 된 전체 작업 비디오가 아래에 나와 있습니다.