- Gerekli Bileşenler
- Devre şeması
- Arduino Konuşma Tanıma için Veri Kümesi Oluşturma
- Modeli Eğitmek
- Arduino Ses Tanıma için Arduino Kodu
Konuşma tanıma teknolojisi, yalnızca cihazlar üzerinde eller serbest kontrol sağlamakla kalmayıp aynı zamanda sisteme güvenlik de ekleyen otomasyonda çok kullanışlıdır. Sesle kontrol edilen araçlar yapmanın yanı sıra, konuşma tanıma ayrıca çeşitli engellerden muzdarip insanlara önemli yardım sağlar.
Önceki projelerde Arduino tabanlı Metin-Konuşma (TTS) Dönüştürücü ve ses kontrollü ışıklar geliştirdik. Şimdi bu projede, Edge Impulse Studio'yu üç komutla (' LIGHT ON' , ' LIGHT OFF' ve ' NOISE ') kullanarak bir konuşma tanıma modelini eğitmek için makine öğrenimini kullanacağız. Edge Impulse, geliştiricilerin yerleşik Makine Öğrenimi ile yeni nesil akıllı cihaz çözümleri oluşturmasına olanak tanıyan çevrimiçi bir makine öğrenimi platformudur. Daha önce öksürük ve gürültü seslerini ayırt etmek için Edge impulse stüdyosunu kullandık.
Gerekli Bileşenler
Donanım
- Arduino 33 BLE Sense
- LED
- Atlama Telleri
Yazılım
- Edge Impulse Studio
- Arduino IDE
Arduino 33 BLE Sense ile ilgili ayrıntılı bir öğreticiyi ele aldık.
Devre şeması
Arduino kullanılarak yapılan bu ses tanıma için Devre Şeması aşağıda verilmiştir. Arduino 33 BLE için Fritzing parçası mevcut değildi, bu yüzden her ikisi de aynı pinout'a sahip olduğundan Arduino Nano kullandım.
LED'in Pozitif kablosu Arduino 33 BLE sense'nin dijital pin 5'ine ve Negatif ucu Arduino'nun GND pinine bağlanır.
Arduino Konuşma Tanıma için Veri Kümesi Oluşturma
Burada Edge Impulse Studio, Konuşma Tanıma modelimizi eğitmek için kullanılır. Edge Impulse Studio'da bir model eğitmek, diğer makine öğrenimi çerçevelerinde makine öğrenimi modellerini eğitmeye benzer. Eğitim için, bir makine öğrenimi modelinin ilk adımı, tanımak istediğimiz veri örneklerine sahip bir veri kümesi toplamaktır.
Amacımız sesli komutumuzla bir LED'i kontrol etmek olduğundan, tüm komutlar ve gürültü için ses örnekleri toplamamız gerekecek, böylece sesli komutlar ile diğer Gürültüler arasında ayrım yapabilecektir.
" LED AÇIK ", " LED KAPALI " ve " gürültü " olmak üzere üç sınıftan oluşan bir veri kümesi oluşturacağız. Bir veri kümesi oluşturmak için bir Edge Impulse hesabı oluşturun, hesabınızı doğrulayın ve ardından yeni bir proje başlatın. Örnekleri cep telefonunuzu, Arduino kartınızı kullanarak yükleyebilir veya bir veri setini edge impulse hesabınıza aktarabilirsiniz. Örnekleri hesabınıza yüklemenin en kolay yolu cep telefonunuzu kullanmaktır. Bunun için cep telefonunu Edge Impulse ile bağlayın.
Cep telefonunu bağlamak için ' Cihazlar'a tıklayın ve ardından' Yeni Bir Cihaz Bağla'ya tıklayın .
Şimdi bir sonraki pencerede 'Cep Telefonunuzu Kullanın'ı tıklayın, bir QR kodu görünecektir. QR kodunu Cep Telefonunuzla tarayın veya QR kodunda verilen URL'yi girin.
Bu, telefonunuzu Edge Impulse stüdyosuna bağlayacaktır.
Telefonunuz Edge Impulse Studio'ya bağlıyken artık örneklerinizi yükleyebilirsiniz. Örnekleri yüklemek için ' Veri toplama' üzerine tıklayın. Şimdi Veri alma sayfasında etiket adını girin, mikrofonu sensör olarak seçin ve örnek uzunluğunu girin. ' Örneklemeye başla'yı tıklayın, cihazınız 2 Saniyelik bir örnek alacaktır. Farklı koşullarda toplam 10 ila 12 ses örneği kaydedin.
Birinci sınıf için örnekleri yükledikten sonra şimdi etiketi değiştirin ve ' light off' ve 'noise' sınıfı için örnekleri toplayın.
Bu örnekler modülü eğitmek içindir, sonraki adımlarda Test Verilerini toplayacağız. Test verileri eğitim verilerinin en az% 30'u olmalıdır, bu nedenle 4 'gürültü' örneği ve 'ışık açık' ve 'ışık kapalı' için 4 ila 5 numune toplayın.
Modeli Eğitmek
Veri setimiz hazır olduğu için artık veriler için bir dürtü oluşturabiliriz. Bunun için ' dürtü oluştur ' sayfasına gidin. 1000 ms Pencere boyutunun varsayılan ayarlarını 1200 ms olarak değiştirin ve 500 ms Pencere 50 ms'ye yükseltin. Bu, verilerimizin 58 ms'de bir başlayarak bir seferde 1,2 sn. İşleneceği anlamına gelir.
Şimdi ' İtme oluştur' sayfasında ' Bir işleme bloğu ekle'ye tıklayın. Sonraki pencerede Ses (MFCC) bloğunu seçin. Bundan sonra ' Bir öğrenme bloğu ekle'ye tıklayın ve Sinir Ağı (Keras) bloğunu seçin. Ardından ' Dürtüyü Kaydet'e tıklayın .
Bir sonraki adımda MFCC sayfasına gidin ve ardından 'Özellik Oluştur'a tıklayın. Tüm ses pencerelerimiz için MFCC blokları oluşturacaktır.
Bundan sonra ' NN Sınıflandırıcı' sayfasına gidin ve ' Sinir Ağı ayarları'nın sağ üst köşesindeki üç noktayı tıklayın ve' Keras (uzman) moduna geç'i seçin.
Orijinali aşağıdaki kodla değiştirin ve " Minimum güven derecesi" ni " 0,70" olarak değiştirin . Ardından ' Eğitimi başlat' düğmesine tıklayın. Modelinizi eğitmeye başlayacak.
tensorflow'u tensorflow.keras.models'ten tf olarak içe aktar tensorflow.keras.layers'dan Sequential ithal Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D'yi tensorflow.keras.optimizers'dan tensorflow.keras.optimizers'dan içe aktarır Adamas.constraints.ker import MaxNorm # model mimari model = Sıralı () model.add (InputLayer (input_shape = (X_train.shape,), name = 'x_input')) model.add (Yeniden şekillendirme ((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 (OrtalamaHavuz2D (pool_size = 2, padding = 'same')) model.add (Conv2D (5, kernel_size = 5, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (OrtalamaPooling2D (pool_size = 2,padding = 'same')) model.add (Flatten ()) model.add (Yoğun (sınıflar, aktivasyon = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3))) # bu, öğrenme hızını kontrol eder = Adam (lr = 0.005, beta_1 = 0.9, beta_2 = 0.999) # sinir ağı modelini eğitin. Yığın (kayıp = 'categorical_crossentropy', optimizer = opt, metrics =) model.fit (X_train, Y_train, batch_size = 32, epochs = 9, validation_data = (X_test, Y_test), ayrıntılı = 2)ayrıntılı = 2)ayrıntılı = 2)
Modeli eğittikten sonra, eğitim performansını gösterecektir. Benim için doğruluk% 81.1 ve kayıp 0.45 idi, bu ideal performans değil ama devam edebiliriz. Geniş bir veri kümesi oluşturarak modelinizin performansını artırabilirsiniz.
Şimdi Konuşma Tanıma modelimiz hazır olduğu için bu modeli Arduino kütüphanesi olarak konuşlandıracağız. Modeli bir kitaplık olarak indirmeden önce ' Canlı Sınıflandırma' sayfasına giderek performansı test edebilirsiniz. Canlı sınıflandırma özelliği, modeli hem veri kümesiyle birlikte gelen mevcut test verileriyle hem de cep telefonunuzdan ses verilerini aktararak test etmenizi sağlar.
Verileri telefonunuzla test etmek için telefonunuzda ' Sınıflandırma Moduna Geç'i seçin.
Şimdi modeli Arduino Kitaplığı olarak indirmek için, ' Dağıtım ' sayfasına gidin ve ' Arduino Kitaplığı'nı seçin. Şimdi aşağı kaydırın ve işlemi başlatmak için ' Oluştur'a tıklayın. Bu, projeniz için bir Arduino kitaplığı oluşturacaktır.
Şimdi kitaplığı Arduino IDE'nize ekleyin. Bunun için Arduino IDE'yi açın ve ardından Sketch> Include Library> Add.
Ardından, Dosya> Örnekler> Proje adınız - Edge Impulse> nano_ble33_sense_microphone'a giderek bir örnek yükleyin.
Arduino Ses Tanıma için Arduino Kodu
Burada LED'i sesli komutlarla kontrol etmek için bazı değişiklikler yapılmıştır.
Komutların olasılığını yazdırdığı void loop () 'da bazı değişiklikler yapıyoruz. Orijinal kodda, tüm etiketleri ve değerlerini birlikte yazdırmaktadır.
for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", result.classification.label, result.classification.value); }
LED'i kontrol etmek için tüm komut olasılıklarını üç farklı değişkene kaydetmeliyiz, böylece onlara koşullu ifadeler koyabiliriz. Yani yeni koda göre ' ışık açık' komutunun olasılığı 0,50'den fazla ise o zaman led'i açacak ve ' ışık kapat' komutunun olasılığı 0,50'den fazla ise led'i kapatacaktır.
for (size_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {noise = result.classification.value; Serial.println ("Gürültü:"); Serial.println (gürültü); } for (size_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = sonuç.classification.value; Serial.println ("Işık Kapalı:"); Serial.print (lighttoff); } lighton = 1- (gürültü + lighttoff); Serial.println ("Işık AÇIK:"); Seri baskı (lighton); eğer (lightton> 0.50) {digitalWrite (led, HIGH); } if (lighttoff> 0,50) {digitalWrite (led, LOW); }
Değişiklikleri yaptıktan sonra, kodu Arduino'nuza yükleyin. Seri monitörü 115200 baud'da açın.
Bu, Arduino'yu kullanarak konuşma tanımayı nasıl oluşturabileceğiniz ve cihazları çalıştırmak için komutlar verebilmenizin yoludur.
Aşağıda bir kitaplık ve kod içeren eksiksiz bir çalışma videosu verilmiştir.