- Wymagane składniki
- Schemat obwodu
- Tworzenie zestawu danych do rozpoznawania mowy Arduino
- Trenowanie modelu
- Kod Arduino do rozpoznawania głosu Arduino
Technologia rozpoznawania mowy jest bardzo przydatna w automatyzacji, która nie tylko zapewnia kontrolę nad urządzeniami bez użycia rąk, ale także zwiększa bezpieczeństwo systemu. Oprócz tworzenia gadżetów sterowanych głosem, rozpoznawanie mowy zapewnia również znaczną pomoc osobom z różnymi niepełnosprawnościami.
W poprzednich projektach zbudowaliśmy oparty na Arduino konwerter Text to Speech (TTS) oraz światła sterowane głosem. W tym projekcie zamierzamy wykorzystać uczenie maszynowe do wytrenowania modelu rozpoznawania mowy przy użyciu Edge Impulse Studio z trzema poleceniami, tj. „ LIGHT ON” , „ LIGHT OFF” i „ NOISE ”. Edge Impulse to internetowa platforma uczenia maszynowego, która umożliwia programistom tworzenie nowej generacji inteligentnych rozwiązań dla urządzeń z wbudowanym uczeniem maszynowym. Wcześniej używaliśmy Edge Impulse Studio do różnicowania dźwięków kaszlu i hałasu.
Wymagane składniki
Sprzęt komputerowy
- Arduino 33 BLE Sense
- DOPROWADZIŁO
- Przewody połączeniowe
Oprogramowanie
- Edge Impulse Studio
- Arduino IDE
Omówiliśmy szczegółowy samouczek dotyczący Arduino 33 BLE Sense.
Schemat obwodu
Schemat obwodu dla tego rozpoznawania głosu za pomocą Arduino podano poniżej. Część Fritzing dla Arduino 33 BLE nie była dostępna, więc użyłem Arduino Nano, ponieważ oba mają ten sam pinout.
Dodatni przewód diody LED jest podłączony do cyfrowego pinu 5 czujnika BLE Arduino 33, a przewód ujemny jest podłączony do pinu GND Arduino.
Tworzenie zestawu danych do rozpoznawania mowy Arduino
Tutaj Edge Impulse Studio jest używane do trenowania naszego modelu rozpoznawania mowy. Szkolenie modelu w Edge Impulse Studio jest podobne do szkolenia modeli uczenia maszynowego w innych strukturach uczenia maszynowego. W przypadku szkolenia pierwszym krokiem modelu uczenia maszynowego jest zebranie zestawu danych zawierającego próbki danych, które chcielibyśmy móc rozpoznać.
Ponieważ naszym celem jest sterowanie diodą LED za pomocą naszego polecenia głosowego, będziemy musieli zebrać próbki głosu dla wszystkich poleceń i hałasu, aby mogła odróżnić polecenia głosowe od innych dźwięków.
Stworzymy zbiór danych z trzema klasami „ LED ON ”, „ LED OFF ” i „ szum ”. Aby utworzyć zestaw danych, utwórz konto Edge Impulse, zweryfikuj swoje konto, a następnie rozpocznij nowy projekt. Możesz załadować próbki za pomocą telefonu komórkowego, płyty Arduino lub możesz zaimportować zestaw danych do konta Edge Impulse. Najłatwiejszym sposobem załadowania próbek na konto jest użycie telefonu komórkowego. W tym celu połącz telefon z Edge Impulse.
Aby podłączyć telefon komórkowy, kliknij „ Urządzenia ”, a następnie kliknij „ Podłącz nowe urządzenie” .
Teraz w następnym oknie kliknij „Użyj telefonu komórkowego” , a pojawi się kod QR. Zeskanuj kod QR telefonem komórkowym lub wprowadź adres URL podany w kodzie QR.
To połączy Twój telefon ze studiem Edge Impulse.
Po podłączeniu telefonu do Edge Impulse Studio możesz teraz załadować swoje próbki. Aby załadować próbki, kliknij „ Pobieranie danych” . Teraz na stronie Pozyskiwanie danych wprowadź nazwę etykiety, wybierz mikrofon jako czujnik i wprowadź długość próbki. Kliknij „ Rozpocznij próbkowanie” , urządzenie zarejestruje próbkę trwającą 2 sekundy. Nagraj w sumie od 10 do 12 próbek głosu w różnych warunkach.
Po załadowaniu próbek dla pierwszej klasy ustaw teraz zmianę etykiety i zbierz próbki dla klasy „ light off” i „noise” .
Te próbki służą do szkolenia modułu, w następnych krokach zbierzemy dane testowe. Dane testowe powinny stanowić co najmniej 30% danych uczących, więc zbierz 4 próbki „szumu” i 4 do 5 próbek dla „włączonego światła” i „wyłączonego światła”.
Trenowanie modelu
Ponieważ nasz zbiór danych jest gotowy, możemy teraz stworzyć impuls dla danych. W tym celu przejdź do strony „ Utwórz impuls ”. Zmień domyślne ustawienia rozmiaru okna 1000 ms na 1200 ms i zwiększenie okna 500 ms do 50 ms. Oznacza to, że nasze dane będą przetwarzane jednorazowo po 1,2 s, zaczynając co 58 ms.
Teraz na stronie „ Utwórz impuls” kliknij „ Dodaj blok przetwarzania” . W następnym oknie wybierz blok Audio (MFCC). Następnie kliknij „ Dodaj blok szkoleniowy” i wybierz blok Sieć neuronowa (Keras). Następnie kliknij „ Save Impulse” .
W następnym kroku przejdź do strony MFCC, a następnie kliknij „Generuj funkcje”. Wygeneruje bloki MFCC dla wszystkich naszych okien audio.
Następnie przejdź do strony „ Klasyfikator NN” i kliknij trzy kropki w prawym górnym rogu „ Ustawienia sieci neuronowej” i wybierz „ Przełącz na tryb Keras (ekspert)” .
Zastąp oryginał następującym kodem i zmień „ Minimalny poziom ufności” na „ 0,70” . Następnie kliknij przycisk „ Rozpocznij szkolenie” . Zacznie trenować Twój model.
import tensorflow jako tf z tensorflow.keras.models import Sequential z tensorflow.keras.layers import Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D z tensorflow.keras.optimizers import Adama z tensorflow.keras.optimizers. import MaxNorm # model architecture model = 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, aktywacja = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, aktywacja = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (classes, aktywacja = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # kontroluje szybkość uczenia opt = Adam (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # trenuj model sieci neuronowej. Stos (strata = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epoki = 9, validation_data = (X_test, Y_test), verbose = 2)gadatliwy = 2)gadatliwy = 2)
Po treningu model pokaże wydajność treningu. Dla mnie dokładność wyniosła 81,1%, a strata 0,45, co nie jest idealną wydajnością, ale możemy kontynuować. Możesz zwiększyć wydajność swojego modelu, tworząc obszerny zbiór danych.
Teraz, gdy nasz model rozpoznawania mowy jest gotowy, wdrożymy ten model jako bibliotekę Arduino. Przed pobraniem modelu jako biblioteki możesz przetestować wydajność, przechodząc do strony „ Klasyfikacja na żywo” . Funkcja klasyfikacji na żywo umożliwia przetestowanie modelu zarówno z istniejącymi danymi testowymi, które zostały dostarczone wraz z zestawem danych, jak i przez przesyłanie strumieniowe danych audio z telefonu komórkowego.
Aby przetestować dane za pomocą telefonu, wybierz w telefonie opcję „ Przełącz do trybu klasyfikacji” .
Teraz, aby pobrać model jako bibliotekę Arduino, przejdź do strony „ Wdrażanie ” i wybierz opcję „ Biblioteka Arduino” . Teraz przewiń w dół i kliknij „ Buduj ”, aby rozpocząć proces. Spowoduje to zbudowanie biblioteki Arduino dla twojego projektu.
Teraz dodaj bibliotekę do swojego Arduino IDE. W tym celu otwórz Arduino IDE, a następnie kliknij Szkic> Dołącz bibliotekę> Dodaj bibliotekę ZIP
Następnie załaduj przykład, przechodząc do Plik> Przykłady> Nazwa Twojego projektu - Edge Impulse> nano_ble33_sense_microphone
Kod Arduino do rozpoznawania głosu Arduino
Tutaj wprowadzono pewne zmiany w sterowaniu diodą LED za pomocą poleceń głosowych.
Wprowadzamy pewne zmiany w void loop (), gdzie wypisuje prawdopodobieństwo wykonania poleceń. W oryginalnym kodzie drukuje wszystkie etykiety i ich wartości razem.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
Aby sterować diodą LED, musimy zapisać wszystkie prawdopodobieństwa poleceń w trzech różnych zmiennych, abyśmy mogli umieścić na nich instrukcje warunkowe. Tak więc zgodnie z nowym kodem, jeśli prawdopodobieństwo wykonania polecenia „ światło włączone” jest większe niż 0,50, to zaświeci diodę, a jeśli prawdopodobieństwo polecenia „wyłączenie światła” jest większe niż 0,50 to wyłączy diodę.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Hałas:"); Serial.println (szum); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Światło wyłączone:"); Serial.print (lightoff); } lighton = 1- (szum + wyłączenie światła); Serial.println ("Światło włączone:"); Serial.print (lighton); if (lighton> 0,50) {digitalWrite (led, HIGH); } if (lightoff> 0,50) {digitalWrite (led, LOW); }
Po wprowadzeniu zmian prześlij kod do swojego Arduino. Otwórz monitor szeregowy z prędkością 115200 bodów.
W ten sposób możesz zbudować rozpoznawanie mowy za pomocą Arduino i wydawać polecenia do obsługi urządzeń.
Pełne wideo robocze wraz z biblioteką i kodem znajduje się poniżej.