- Būtini komponentai
- Grandinės schema
- „Arduino“ kalbos atpažinimo duomenų rinkinio kūrimas
- Mokyti modelį
- „Arduino“ balso atpažinimo kodas
Kalbos atpažinimo technologija yra labai naudinga automatizavimo srityje, kuri suteikia ne tik laisvų rankų įrangos valdymą, bet ir sistemos saugumą. Be balso valdomų įtaisų, kalbos atpažinimas taip pat teikia reikšmingą pagalbą žmonėms, kenčiantiems nuo įvairių negalių.
Ankstesniuose projektuose mes sukūrėme „Arduino“ pagrindu veikiantį teksto į kalbą (TTS) keitiklį ir balso valdomus žibintus. Šiame projekte mes naudosime mašininį mokymąsi, kad mokytume kalbos atpažinimo modelį naudodami „Edge Impulse Studio“ su trimis komandomis, ty „ LIGHT ON“ , „ LIGHT OFF“ ir „ NOISE “. „Edge Impulse“ yra internetinė mašininio mokymosi platforma, leidžianti kūrėjams sukurti naujos kartos intelektualiųjų įrenginių sprendimus su įterptuoju mašinų mokymu. Anksčiau mes naudojome „Edge“ impulsų studiją, kad galėtume atskirti kosulio ir triukšmo garsus.
Būtini komponentai
Aparatinė įranga
- „Arduino 33 BLE Sense“
- LED
- Šuolių laidai
Programinė įranga
- „Edge Impulse“ studija
- „Arduino IDE“
Pateikėme išsamią „Arduino 33 BLE Sense“ pamoką.
Grandinės schema
Šio balso atpažinimo naudojant „Arduino“ schema pateikta žemiau. Fritzing „Arduino 33 BLE“ dalis nebuvo prieinama, todėl aš naudojau „Arduino Nano“, nes abu turi tą patį pinout.
Teigiamas šviesos diodo laidas yra prijungtas prie „Arduino 33 BLE sense“ 5 skaitmeninio kaiščio, o neigiamas - prie „Arduino“ GND kaiščio.
„Arduino“ kalbos atpažinimo duomenų rinkinio kūrimas
Čia „Edge Impulse Studio“ naudojama mokant mūsų kalbos atpažinimo modelį. Modelio mokymas „Edge Impulse Studio“ yra panašus į mašininio mokymosi modelių mokymą kitose mašininio mokymosi sistemose. Treniruotėms pirmiausia reikia surinkti mašininio mokymosi modelį - rinkti duomenų rinkinį, kuriame yra duomenų pavyzdžiai, kuriuos norėtume atpažinti.
Kadangi mūsų tikslas yra valdyti šviesos diodą savo balso komanda, turėsime surinkti visų komandų ir triukšmo balso pavyzdžius, kad jis galėtų atskirti balso komandas nuo kitų triukšmų.
Sukursime duomenų rinkinį su trimis klasėmis „ LED ON “, „ LED OFF “ ir „ noise “. Norėdami sukurti duomenų rinkinį, sukurkite „Edge Impulse“ paskyrą, patikrinkite savo sąskaitą ir pradėkite naują projektą. Mėginius galite įkelti naudodami savo mobilųjį telefoną, „Arduino“ plokštę arba galite importuoti duomenų rinkinį į savo krašto impulsų paskyrą. Lengviausias būdas įkelti pavyzdžius į savo sąskaitą yra mobilusis telefonas. Tam prijunkite mobilųjį telefoną su „Edge Impulse“.
Norėdami prisijungti prie mobiliojo telefono, spustelėkite „ Įrenginiai “, tada spustelėkite „ Prijungti naują įrenginį“ .
Dabar kitame lange spustelėkite „Naudoti savo mobilųjį telefoną“ ir pasirodys QR kodas. Nuskaitykite QR kodą mobiliuoju telefonu arba įveskite URL, nurodytą QR kode.
Tai sujungs jūsų telefoną su „Edge Impulse“ studija.
Dabar, kai telefonas yra prijungtas prie „Edge Impulse Studio“, galite įkelti pavyzdžius. Norėdami įkelti pavyzdžius, spustelėkite „ Duomenų rinkimas“ . Dabar puslapyje „Duomenų gavimas“ įveskite etiketės pavadinimą, kaip jutiklį pasirinkite mikrofoną ir įveskite mėginio ilgį. Spustelėkite „ Pradėti atranką“ , jūsų įrenginys užfiksuos 2 sek. Įrašykite iš viso 10–12 balso pavyzdžių skirtingomis sąlygomis.
Įkėlę pirmos klasės pavyzdžius, dabar pakeiskite etiketę ir surinkite „ šviesos išjungimo“ ir „triukšmo“ klasės pavyzdžius.
Šie pavyzdžiai skirti modulio mokymui, atlikdami kitus veiksmus mes surinksime testo duomenis. Testo duomenys turėtų sudaryti bent 30% treniruočių duomenų, todėl surinkite 4 „triukšmo“ pavyzdžius ir 4–5 mėginius „šviesai įjungti“ ir „išjungti šviesą“.
Mokyti modelį
Kadangi mūsų duomenų rinkinys yra paruoštas, dabar galime sukurti impulsą duomenims. Tam eikite į puslapį „ Kurti impulsą “. Pakeiskite numatytuosius 1000 ms lango dydžio nustatymus į 1200 ms, o 500 ms langas padidinamas iki 50 ms. Tai reiškia, kad mūsų duomenys bus apdorojami 1,2 s vienu metu, pradedant nuo kiekvieno 58 ms.
Dabar puslapyje „ Kurti impulsą“ spustelėkite „ Pridėti apdorojimo bloką“ . Kitame lange pasirinkite garso (MFCC) bloką. Po to spustelėkite „ Pridėti mokymosi bloką“ ir pasirinkite „ Neural Network“ (Keras) bloką. Tada spustelėkite „ Išsaugoti impulsą“ .
Kitame žingsnyje eikite į MFCC puslapį ir tada spustelėkite „Generuoti funkcijas“. Tai sugeneruos MFCC blokus visiems mūsų garso langams.
Po to eikite į „ NN klasifikatoriaus“ puslapį ir spustelėkite tris taškus viršutiniame dešiniajame „ Neuroninio tinklo nustatymų“ kampe ir pasirinkite „ Perjungti į režimą„ Keras “(ekspertas)“ .
Pakeiskite originalą šiuo kodu ir pakeiskite „ Minimalus patikimumo įvertinimas“ į „ 0,70“ . Tada spustelėkite mygtuką „ Pradėti treniruotę“ . Tai pradės mokyti jūsų modelį.
importuoti tensorflow kaip tf iš tensorflow.keras.models importuoti seką iš tensorflow.keras.layers importuoti Dense, InputLayer, Dropout, Flatten, Reshape, BatchNormalization, Conv2D, MaxPooling2D, AveragePooling2D iš tensorflow.keras.erasimoptowflow Adam importuoti „MaxNorm“ # modelio architektūros 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, activation = 'relu', padding = 'same', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (base_size = 2, padding = 'same')) model.add (Conv2D (5, branduolio_size = 5, aktyvinimas = 'relu', padding = 'tas pats', kernel_constraint = MaxNorm (3))) model.add (AveragePooling2D (baseino dydis = 2,padding = 'same')) model.add (Flatten ()) model.add (Dense (class, activation = 'softmax', name = 'y_pred', kernel_constraint = MaxNorm (3)))) # tai kontroliuoja mokymosi greičio pasirinkimą = Adomas (lr = 0,005, beta_1 = 0,9, beta_2 = 0,999) # mokykite neuroninio tinklo modelį. Sudarykite (nuostolis = 'kategorinė_krosentropija', optimizavimo priemonė = opt, metrika =) modelis. = 9, patvirtinimo_duomenys = (X_test, Y_test), žodynas = 2)žodinis = 2)žodinis = 2)
Išmokęs modelį jis parodys treniruotės rezultatus. Man tikslumas buvo 81,1%, o nuostolis - 0,45, o tai nėra idealus našumas, bet mes galime tai tęsti. Galite padidinti savo modelio našumą sukurdami didžiulį duomenų rinkinį.
Dabar, kai mūsų kalbos atpažinimo modelis yra paruoštas, mes įdiegsime šį modelį kaip „Arduino“ biblioteką. Prieš atsisiųsdami modelį kaip biblioteką, galite išbandyti našumą apsilankę puslapyje „ Tiesioginė klasifikacija“ . „Live“ klasifikavimo funkcija leidžia išbandyti modelį tiek naudojant esamus bandymo duomenis, kurie buvo pateikti kartu su duomenų rinkiniu, tiek transliuojant garso duomenis iš savo mobiliojo telefono.
Norėdami patikrinti duomenis telefonu, telefone pasirinkite „ Perjungti į klasifikavimo režimą“ .
Dabar, norėdami atsisiųsti modelį kaip „Arduino“ biblioteką, eikite į puslapį „ Diegimas “ ir pasirinkite „ Arduino biblioteka“ . Dabar slinkite žemyn ir spustelėkite „ Sukurti “, kad pradėtumėte procesą. Tai sukurs jūsų projektui „Arduino“ biblioteką.
Dabar pridėkite biblioteką prie „Arduino IDE“. Tam atidarykite „Arduino IDE“ ir spustelėkite „ Eskizas“> „Įtraukti biblioteką“> „Add.ZIP“ biblioteka
Tada įkelkite pavyzdį eidami į Failas> Pavyzdžiai> Jūsų projekto pavadinimas - „Edge Impulse“> nano_ble33_sense_microphone
„Arduino“ balso atpažinimo kodas
Čia buvo atlikti keli pakeitimai, kaip valdyti šviesos diodą balso komandomis.
Atliekame keletą pakeitimų „ void loop“ (), kur spausdinama komandų tikimybė. Originaliame kode jis spausdina visas etiketes ir jų reikšmes.
for (dydis_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {ei_printf ("% s:%.5f \ n", rezultatas.klasifikacija.label, rezultatas.klasifikacija.value); }
Norėdami valdyti šviesos diodą, turime išsaugoti visas komandos tikimybes trimis skirtingais kintamaisiais, kad galėtume jiems pateikti sąlyginius sakinius. Taigi pagal naująjį kodą, jei „ šviesos įjungimo“ komandos tikimybė yra didesnė nei 0,50, ji įjungs šviesos diodą ir, jei „ šviesos išjungimo“ tikimybė yra didesnė nei 0,50, nei ji išjungs šviesos diodą.
už (dydis_t ix = 2; ix <EI_CLASSIFIER_LABEL_COUNT; ix ++) {triukšmas = rezultatas.klasifikacija.value; Serial.println ("Triukšmas:"); Serial.println (triukšmas); } (dydis_t ix = 0; ix <EI_CLASSIFIER_LABEL_COUNT; ix--) {lightoff = result.classification.value; Serial.println ("Šviesa išjungta:"); Serijinis atspaudas („lightoff“); } šviesa = 1- (triukšmas + apšvietimas); Serial.println („Šviesa įjungta:“); Serijinis atspaudas (šviesa); jei (šviesa> 0,50) {digitalWrite (led, HIGH); } if (apšvietimas> 0,50) {digitalWrite (led, LOW); }
Atlikę pakeitimus, įkelkite kodą į „Arduino“. Atidarykite nuoseklųjį monitorių 115200 baudų dažniu.
Taip galite sukurti kalbos atpažinimo funkciją naudodami „Arduino“ ir duoti komandas prietaisams valdyti.
Visas darbinis vaizdo įrašas su biblioteka ir kodu pateikiamas žemiau.