Control vocal al Arduino folosind Procesare și Google Speech API. Recunoașterea cifrelor pe un microcontroler

Cumva mi-a venit o idee de făcut control vocal Arduino, dar Arduino singur nu este suficient, pentru că... pentru sistem casă inteligentă De asemenea, trebuie să comunicați cu computerul și sistemele acestuia.

Găsirea unei soluții:

BitVoicer
Am dat peste diverse articole folosind BitVoicer împreună cu Arduino, dar problema este că BitVoicer funcționează numai pe Windows, iar acest lucru nu permite utilizarea sistemului pe dispozitive simple precum Rasberry Pi care rulează Unix.
Recunoașterea vocii Arduino
Arduino poate fi controlat și prin voce datorită modulului de recunoaștere vocală, dar până acum nu am bucuria de a-l achiziționa și există o serie de inconveniente când folosesc acest modul: un număr limitat de comenzi, antrenament obositor, comenzi noi necesită intermiterea modulului, ceea ce este deja un minus dacă sistemul a fost depanat și instalat.

Soluţie

Am început să caut o soluție multiplatformă care să permită sistemului să funcționeze pe mai multe sisteme de operare. Am gasit asta: Bibliotecă Speech to Text pentru Java/Procesare. Complexul este implementat pe baza limbajului Procesare (Java)Şi API-ul Google Speach Despre pisică s-a scris deja înainte. Această decizie Permite urmărirea vocală în timp real enableAutoRecord(), indicați limita de volum enableAutoThreshold(), conectați microfoane externe getLineIn(), specificați limba de recunoaștere setLanguage(Șir). O listă completă de caracteristici și detalii este disponibilă pe site-ul web al dezvoltatorului: http://stt.getflourish.com. Pentru muncă avem nevoie Google Speech Cheia API. Cum se obține este descris aici: www.chromium.org/developers/how-tos/api-keys. Singura punct negativ Problema este că Google Speech vă permite să procesați doar 50 de solicitări pe zi, dar în practică sunt procesate peste 500 de solicitări.

Pentru a facilita navigarea prin text în viitor, atașez toate sursele care conțin deja comenzi vocale, conexiune la placa Arduino, schiță pentru placa Arduino, confirmare vocală a frazelor și tot ce este deja acolo și funcționează: surse. După descărcare, plasăm folderul GoogleTTS în bibliotecile Processing"a. Schița pentru Arduino se află în folderul GoogleTTS/ArduinoSerial. Totul a fost scris în Processing 3.0a4, disponibil în pre-lansare pe site-ul oficial.

Implementarea(„Ascultă porunca mea!”):
Ne-am hotărât recunoașterea. Acum trebuie să prindem comenzile de care avem nevoie și să luăm decizii cu privire la ele. Secțiunea este responsabilă pentru aceasta:
void commands() ( if (result.equals("arduino")) ( // Se caută o potrivire // Executați comanda când se primește o potrivire ) else if (result.equals("ce oră este")) ( / / Executați comanda când se primește o potrivire))
Răspuns vocal
Acum avem nevoie de un instrument care ne va răspunde cu o voce umană dacă se găsește o potrivire. Instrumentul de implementare ales a fost Google Translate, sau mai degrabă un modul care convertește textul în voce. Textul este trimis la cerere către serverul Google și convertit în fișier de sunetși trimis înapoi la noi în format mp3. Secțiunea este responsabilă pentru aceasta:
void googleTTS(String txt, String language) ( // textul este convertit în sunet folosind comanda googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl="; u = u + limba + "&q=" + txt; u = u.replace(" ", "%20"); URL URL= URL nou(u);

încercați ( URLConnection connection = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; . NET CLR 1.2.30703)"); connection.connect(); InputStream este = connection.getInputStream(); Fișier f = fișier nou (sketchPath + "/" + txt + ".mp3"); OutputStream out = nou FileOutputStream( f); byte buf = new byte ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); : " + txt + ".mp3" ) catch (IOException e) ( e.printStackTrace(); ) ) catch (MalformedURLException e) ( e.printStackTrace(); )
Secțiunea este responsabilă pentru procesarea directă a frazelor de text:

void voicer(String s) ( // Executat de comanda voicer("text") println(s); // folosit pentru a monitoriza text Fișier f = new File(sketchPath + "/" + s + ".mp3"); // Verificarea fișierului // Dacă fișierul există deja, redați fișierul if(f.exists())( println("Fișierul există deja! Joc fișierul!"); player = minim.loadFile(s + ".mp3"); player.play (); // Dacă fișierul nu există încă, creați-l else ( println ("Fișierul nu există încă! Creez!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3");
Exemplu de implementare a recunoașterii și confirmării vocale:
void commands() ( if (result.equals("computer"))) ( // Se caută un vocal de potrivire ("Ascultă"); // Primește confirmarea vocală // Execută comanda când se primește o potrivire ) )

Procesare + Arduino

Ei bine, se pare că a funcționat, dar lipsește ceva. Acum să ne „împrietenim” cu Arduino.
Inițializam conexiunea serială în Procesare pentru a trimite date către Arduino (pentru utilizatorii de Macși Unix):
String portName = Serial.list(); myPort = nou Serial (acest, portName, 9600); myPort.bufferUntil("\n");

Pentru utilizatorii de Windows:
String myPort = nou Serial (acesta, „Portul dumneavoastră COM”, 9600); myPort.bufferUntil("\n");

Și vom trimite o comandă acolo dacă se găsește o potrivire vocală:
void comenzi() ( dacă (result.equals ("aprinde lumina")) ( // Dacă fraza vocală recunoscut ca „aprinde lumina”, apoi executăm cererea myPort.write("High"); // Trimite comanda High către vocalul conexiunii seriale ("Aprinde luminile"); // Confirmare vocală a execuției comenzii ) else if (result.equals("sting the light")) ( myPort.write("Low"); // Trimite comanda Low către vocea conexiunii seriale ("Turn the light) "); // Confirmare // Executați comanda când se primește o potrivire ))

Acum să începem Placa Arduino. Trebuie să ascultăm portul serial și când găsim o comandă din listă, efectuam acțiunea necesară conform comenzii. Schița este foarte simplă:
int led = 13; // Pinul LED de pe placă void setup() ( Serial.begin(9600); // Inițializați conexiunea serială pinMode(led, OUTPUT); // Pinul LED transmite date ) void loop() ( int i=0; / / variabilă pentru a pune un șir în buffer char buffer // o matrice de buffer pentru a pune șirul în el if(Serial.available())( // Verificați portul serial pentru prezența întârzierii datelor(100); // puneți ceea ce a fost citit în tampon în timp ce (Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
Toate. Să verificăm.

Probleme și planuri:

Deoarece Nu am făcut programare înainte de această dată, nu înțeleg pe deplin unele lucruri în procesul de depanare. Aș fi recunoscător dacă cineva mi-ar putea spune cum să rezolv problemele enumerate mai jos:

Cea mai de bază problemă este că întreaga frază vocală nu este rostită. Ultimele litere dispar. Deși fișierul de sunet vine cu servere Google V forma normala. După cum am înțeles situația: există o problemă cu playerul audio, dar unde exact nu este încă clar.
- Am scris deja acel Google Speech API Există o limită de 50 de solicitări pe zi, dar de fapt se dovedește a fi mai multe. În orice caz, acest lucru nu este suficient. Intenționez să înregistrez recunoașterea locală a comenzii principale și numai după ce este recunoscută, trimit restul textului pentru procesare de către Google.
- Cred că nu ar strica să trimiți comenzi către scutul Ethernet Arduino, pentru că... Unele sisteme pot fi situate la o distanță considerabilă de computerul gazdă și o conexiune serială nu va mai funcționa aici. Voi aborda această decizie într-o zi, pentru că... Nu am un router pentru a conecta un Arduino cu un scut Ethernet la el.

Asta e tot! Vă rugăm să nu judecați strict pe baza liniilor de cod! Tocmai am început să studiez acest trambulină și îți voi fi extrem de recunoscător dacă îmi vei freca nasul cum să nu o fac și îmi arăți cum să o fac. De asemenea, mă voi bucura dacă și alte părți interesate se alătură acestui proiect - sunt mereu deschis la comunicare!

Îți amintești cum în urmă cu câțiva ani (și poate chiar și acum) era populară ideea de a controla lumina într-o cameră bătând din palme? Dar, e foarte comod, ești întins în pat, prea leneș să te ridici și să stingi lumina cu o bătaie din palme, sau mergem acasă, e întuneric, durează mult să găsești comutatorul și apoi chiar din prag se aude o palmă sau două și lumina este deja aprinsă. Mi se pare că acest concept este încă relevant, dar poate fi aplicat la mai multe tehnologie înaltă comparativ cu ceea ce era acum 5 ani, 10 ani. Acum, pentru o sumă relativ mică, puteți cumpăra mai multe piese și puteți programa designul pentru funcții similare, care vor fi discutate mai jos.

Astăzi ne vom uita la un modul conceput pentru a recunoaște comenzile vocale (inclusiv doar vocile dintr-o comandă vocală înregistrată) - Modul de recunoaștere vocală V3.1 (V3) sau numele de codificare frecvent întâlnit FZ0475.

Pachetul de livrare include modulul în sine ( PCB Foarte de bună calitate), un microfon pe un picior flexibil cu un conector jack de 3,5 mm și contacte PLS unghiulare cu pas de 2,56 mm pentru placa modulului (nu pot fi folosite dacă sunt conectate la contactele modulului într-un mod diferit).

Astăzi există mai multe tipuri de module cu funcționalități similare. diferiți producătoriși dezvoltatori sau execuții. Acest modul recunoașterea vocii, în opinia mea, are un anumit echilibru între cost, funcționalitate și comoditate. Modulul EasyVR va fi mai puternic și mult mai scump. Modulele bazate pe LD3320 vor fi mai ieftine și mai incomod (incomod cel puțin pentru că nu este ușor să găsiți o descriere normală pentru ele, dar în rest, aceasta este subiectivă).

Caracteristicile modulului de recunoaștere vocală V3.1 (V3):

  • Tensiune de alimentare – 5 volți
  • Consum de curent – ​​până la 40 mA
  • Interfețe – UART, GPIO
  • Precizia recunoașterii – 99% (in conditii ideale)
  • Raza de actiune - depinde de microfonul folosit, pentru microfonul standard inclus in kit raza de actiune este de 0,5 - 1 metru distanta maxima cu o voce suficient de puternica, dar daca vocea este silentioasa, va trebui sa apropii microfonul de gura.

Modulul este o placă mică, îngrijită, pe care se află microcontrolerul principal (black blot), un conector jack de 3,5 mm pentru conectarea unui microfon și un microcircuit. memorie flash, GPIO, UART și contacte de putere, o pereche de LED-uri și restul echipamentului necesar pentru funcționarea circuitului - rezistențe, condensatoare, cuarț. Dimensiunea compactă a plăcii vă va permite să integrați cu ușurință modulul în propriile dezvoltări. Pentru a crește gama de comenzi vocale, este probabil necesar să folosiți un microfon amplificat. Odată ce este atins un interval acceptabil, modulul este potrivit pentru utilizarea în sistemele de casă inteligentă. Fără modificări pentru îmbunătățirea domeniului de funcționare, modulul poate fi utilizat în sistemele de control desktop, precum și în sistemele de securitate (control acces și restricție). Cu un microfon standard, din cauza razei scurte, este cel mai fiabil să utilizați modulul de recunoaștere a vocii ca căști și fără fir transmiteți comenzi unui controler care controlează ceva folosind o baterie și module wireless (de exemplu, HC-05 sau HC-12 sau orice alte adecvate). Modulul este capabil să funcționeze fără un microcontroler extern, deoarece producătorul oferă independență funcțională, trebuie să înregistrați o singură dată comenzile vocale și să setați setările; munca independenta cu ajutorul dispozitiv extern(PC sau MK).

Deci, pentru a începe să lucrăm cu modulul de recunoaștere a vocii, trebuie să-l conectăm fie la un computer (aveți nevoie de un adaptor USB-UART), fie la un microcontroler (trebuie să dezvoltați codul programului pentru a controla modulul).

Nu există nicio diferență fundamentală în gestionarea și configurarea modulului între conectarea la un computer sau la un microcontroler, așa că pentru claritate, vom folosi un PC pentru configurare. Instrucțiunile descriu comenzile pentru modul în formă hexazecimală, așa că pentru comoditate veți avea nevoie și de un terminal care transmite octeți în formă hexazecimală, de exemplu, AccessPort (poate fi descărcat la sfârșitul articolului). În plus, producătorul se concentrează pe utilizatorii platformei Arduino și oferă o bibliotecă pentru utilizarea acestui modul și instrucțiuni pentru utilizarea acestei biblioteci. Cu toate acestea, mulți dintre noi sunt mult mai interesați să lucreze cu modulul în sine direct decât prin ambalajul Arduino.

Înainte de a începe lucrul, să ne uităm la tablă. La capetele plăcii din dreapta există o priză pentru conectarea unui microfon, pe cealaltă sunt patru contacte interfață UART. În partea de jos există opt contacte folosite pentru a scoate semnale cauzate de recunoașterea comenzilor vocale. În partea de sus, patru pini configurați ca intrare de semnal sunt utilizați pentru a comuta între grupuri (de șapte comenzi vocale fiecare) de comenzi, dacă este utilizată o astfel de caracteristică. Și cei șase pini rămași din partea de sus sunt probabil folosiți pentru a se conecta la memoria modulului.

Un sistem de comandă este utilizat pentru a opera și configura modulul. Vedere generală cadrul arata asa:

Primele patru comenzi 00, 01, 02, 03 sunt folosite pentru a verifica starea modulului și setările acestuia. Următoarele șase comenzi 10, 11, 12, 13, 14, 15 sunt folosite pentru a modifica setările modulului, inclusiv controlul portului de ieșire și setările de încărcare automată. În continuare, trei comenzi 20,21, 22 sunt folosite pentru a înregistra comenzi vocale. Următoarele trei comenzi 30,31,32 sunt folosite pentru a controla recunoașterea comenzilor vocale. Comenzile 0A, 0D, FF sunt utilizate numai atunci când datele sunt returnate de modul însuși. De fapt, nu există multe comenzi și toate acestea nu sunt atât de înfricoșătoare pe cât pare la prima vedere în documentația pentru modul. Să ne uităm la comenzile necesare pentru a lucra cu modulul de recunoaștere vocală. Nu toate comenzile existente sunt practice.

Este de remarcat faptul că modulul poate funcționa fără un microcontroler de control extern și, de asemenea, poate controla în mod independent ceva cu porturile sale de ieșire. Pentru a face acest lucru, trebuie să le configurați (comenzile 12, 13, 14).

Echipa 12 – configurați porturile de ieșire. Această comandă configurează modul de funcționare al porturilor de ieșire ale modulului de recunoaștere vocală.

Format: | AA | 03 | 12 | MOD | 0A |

Unde MODE poate lua patru valori: 0 – modul puls (când este declanșată o comandă vocală, ieșirea corespunzătoare comenzii își va schimba starea pentru timpul stabilit de comanda 13), 1 – modul comutator (comutați sau răsturnați) (de fiecare dată) este declanșată o comandă vocală, ieșirea corespunzătoare comenzii vocale inversată), 2 – modul pornit (când este declanșată comanda vocală, ieșirea va intra în starea logică și nu va mai intra în starea zero logic, resetarea este efectuat prin comanda 14), 3 – modul oprit (asemănător modului pornit, doar dimpotrivă, la declanșarea comenzii vocale, ieșirea trece la starea zero logic).

Cel mai practic este modul de comutare, care nu necesită comenzi suplimentare. Modul puls ar fi bun, dar logica acestui mod este de așa natură încât atunci când este declanșată o comandă vocală, emite una logică o dată, pentru un timp de la 10 ms la 1 s. Acest lucru nu este suficient. Deși, în funcție de cerințele pentru acest mod, poate fi util. Modurile de pornire și oprire sunt implementate în mod incomod, deoarece necesită executarea unor comenzi suplimentare.

Echipa 13 – setarea duratei pulsului modului corespunzător.

Format: | AA | 03 | 13 | NIVEL | 0A |

Unde LEVEL ia o valoare de la 00 la 0F (corespunzător unei durate de la 10 ms la 1 s).

NIVEL durată
0x00 10 ms
0x01 15 ms
0x02 20 ms
0x03 25 ms
0x04 30 ms
0x05 35 ms
0x06 40 ms
0x07 45 ms
0x08 50 ms
0x09 75 ms
0x0A 100 ms
0x0B 200 ms
0x0C 300 ms
0x0D 400 ms
0x0E 500 ms
0x0F 1 s

Echipa 14 – resetați porturile de ieșire la starea specificată de modurile pornit sau oprit.

Format: | AA| 03 | 14 | FF | 0A | - resetați toate porturile de ieșire

| AA| 03+n | 14 | IO0 | ... | IOn | 0A | - resetați porturile de ieșire selectate

Unde n este numărul de pini care sunt resetati selectiv, IO0...IOn este o listă a acestor pini în cadrul de trimitere a datelor.

În continuare, pentru ca comenzile vocale să fie executate, acestea trebuie înregistrate în modul (antrenează modulul). Există o limitare aici. Doar șapte comenzi pot fi recunoscute simultan, deși multe altele pot fi înregistrate. Pentru a extinde gama de comenzi vocale care vor fi recunoscute, se folosește un sistem de grupare (comanda 32), care este controlat de porturile de intrare ale modulului. Setând configurația semnalului pe acești pini, selectați grupul de comenzi care vor fi recunoscute. Acest lucru se datorează performanței limitate a controlerului de voce al modulului.

Echipa 20 - înregistrarea uneia sau mai multor comenzi vocale.

Format: | AA| 03+n | 20 | R0 | ... | Rn | 0A |

Unde n este numărul de comenzi vocale înregistrate (dacă se înregistrează o comandă n=0, două comenzi n=1 și așa mai departe în conformitate cu formatul general de transmitere a comenzilor Lungime - lungime), R0...Rn numere de comenzi vocale (AA 03 20 03 0A - comandă pentru înregistrarea celei de-a treia comenzi vocale).

Echipa 21 - înregistrați o comandă vocală și setați o semnătură pentru aceasta.

Format: | AA| 03+SIGLEN | 21 | ÎNREGISTRARE | SIG | 0A |

Unde RECORD este numărul comenzii vocale, SIG este semnătura (poate consta din mai mulți octeți, astfel încât fiecare octet să corespundă unei codări de caracter alfabetic dacă este necesar), SIGLEN este numărul de octeți care alcătuiesc semnătura.

Echipa 22 - adăugați sau ștergeți o semnătură pentru comanda vocală selectată.

Format: | AA | 03+SIGLEN | 22 | ÎNREGISTRARE | SIG | 0A | - adăugarea unei semnături

| AA | 03 | 22 | ÎNREGISTRARE | 0A | - eliminarea semnăturii

Când înregistrați comenzi vocale, trebuie să fiți ghidat de semnale LED. După introducerea comenzii care pornește procesul de înregistrare, LED-ul galben (portocaliu) începe să clipească rapid. De îndată ce LED-ul roșu se aprinde, trebuie să rostiți o comandă vocală în microfon. Dacă are succes, LED-ul galben (portocaliu) se va aprinde și apoi din nou roșu - trebuie să confirmați comanda vocală și să o spuneți din nou. Dacă reușește, ambele LED-uri se vor aprinde - comanda vocală a fost salvată.

Odată ce comenzile vocale sunt înregistrate în modul, nu se va întâmpla nimic până când aceste comenzi nu sunt plasate în „Recunoașterea” modulului. Pentru a face acest lucru, trebuie să utilizați comanda 30. După executarea acestei comenzi, modulul va începe să aștepte ca comanda vocală să se potrivească cu mostrele salvate. Doar șapte comenzi pot fi recunoscute simultan. În acest caz, LED-ul galben (portocaliu) de pe placa modulului va clipi lent.

Echipa 30 - încărcați înregistrările în Recognizer-ul modulului.

Format: | AA| 2+n | 30 | R0 | ... | Rn | 0A |

Formatul răspunsului este următorul: | AA | 07 | 0D | 00 | GRPM | R | RI | SIGLEN | SIG | 0A |

Unde GRPM este informații despre grupul căruia îi aparține comanda (dacă este utilizată), R este comanda vocală recunoscută (folosind aceste date puteți distinge comenzile unele de altele dacă nu sunt utilizate semnăturile), RI este indexul comenzii din dispozitiv de recunoaștere, SIGLEN este lungimea semnăturii în octeți, SIG - semnătură (dacă este utilizată).

Și, în sfârșit, dacă modulul trebuie să funcționeze independent, atunci trebuie să utilizați comanda 15 pentru pornire automată conform presetarilor de recunoastere. În acest caz, modulul de recunoaștere vocală va funcționa independent, fără a fi nevoie de inițializare după pornire.

Echipa 15 - setarea dispozitivului de recunoaștere la pornire automată când este pornit.

Format: | AA| 03 | 15 | 00 | 0A | - dezactivați funcția de rulare automată

| AA| 03+n | 15 | BITMAP | R0 | ... | Rn | 0A | - setarea funcției de rulare automată

Pentru a controla execuția corectă a comenzilor, fiecare dintre ele are propriul răspuns. Dacă este necesar, toate datele pot fi găsite în documentația pentru modulul de recunoaștere vocală atașată la sfârșitul articolului. Nu uita că totul valori numerice prezentat în hexazecimal formă.

Astfel, folosind sistemul de comandă, puteți configura flexibil modulul de recunoaștere a vocii pentru utilizare în diverse scopuri. Dacă controale simple Deoarece porturile de ieșire ale modulului nu sunt suficiente, modulul de recunoaștere vocală poate fi conectat la alte dispozitive prin UART sau GPIO. Pentru conexiune fără fir Puteți utiliza modulele discutate anterior.

Folosind module wireless, puteți conecta modulul de recunoaștere a vocii la orice dispozitiv unde este necesar. De exemplu, să-l conectăm la un microcontroler, care va controla LED-urile pe baza datelor primite despre recunoașterea comenzilor vocale. Module wireless permiteți transferul datelor în două direcții, așa că, dacă este necesar, puteți scrie cod pentru microcontroler pentru a inițializa modulul vocal și a înregistra comenzile vocale. În cazul nostru, sub controlul PC, mai multe comenzi vocale sunt deja înregistrate în modul și recunoașterea este configurată să pornească automat la pornirea alimentării, așa că pentru microcontroler vom înregistra doar recepția de date și controlul LED-ului în raport cu aceste date. Microcontrolerul STM32F103C8T6 folosește USART1 pentru a primi date și pinii PB10...PB15 configurați ca ieșire, care controlează LED-urile. Cod sursă aflate în anexe de la sfârșitul articolului.

Un pic despre rezultate

Recunoașterea vocii nu este complet exactă. Depinde de comenzile selectate și de vocea utilizatorului. În timpul testării am găsit câteva puncte negative. La predarea comenzilor modulului, au fost selectate comenzile vocale „unu” și „două”. Comanda „două” a trecut întotdeauna clar, dar comanda „unu” a fost adesea identificată ca o comandă „două” și codul celei de-a doua comenzi a fost executat în consecință. În plus, când încercam să dai comenzi vocale în engleză (și nu au fost înregistrate în modulul vocal), comanda „unu” a fost aproape întotdeauna definită ca „două”. Poate că totul este despre pronunție, intonație și alte aspecte ale vocii umane încorporate în algoritmul pentru codificarea modulului vocal al comenzilor rostite. Cu toate acestea, aceste secrete producătorii acces deschis nu o dau. În plus, calitatea recunoașterii este afectată de condițiile de zgomot extern - zgomotul de pe stradă, zgomotul ventilatorului, sunete aleatorii etc. Producătorul atrage atenția asupra faptului că nivel înalt acuratețea recunoașterii are loc în condiții ideale. Ideea de a folosi un microfon cu un amplificator va crește, desigur, raza de operare a dispozitivului, dar va crește și probabilitatea de erori, deoarece amplificarea vocii va crește și zgomotul.

În cele din urmă, dacă aveți cerințe scăzute pentru recunoașterea vocii și executarea comenzilor vocale, atunci acest modul va calcula cu sinceritate banii cheltuiți pe el.

Lista radioelementelor

Desemnare Tip Denumire Cantitate NotaMagazinBlocnotesul meu
IC1 MK STM32

STM32F103C8

1 La blocnotes
VR1 Regulator liniar

AMS1117-3.3

1 La blocnotes
MOD1, MOD3 Modul wirelessHC-122 La blocnotes
MOD2 Modul de recunoaștere a vociiVR3.11 La blocnotes
Z1 Cuarţ8 MHz1

În acest tutorial Arduino vă vom arăta cum să utilizați aplicație mobilă pentru Android și modul bluetooth HC-05 pentru controlul vocal al LED-urilor.

Pentru acest tutorial vom avea nevoie de un minim de componente. După ce finalizați lecția, puteți complica circuitul și puteți adăuga dispozitive după bunul plac.

  • Arduino UNO
  • Modul Bluetooth HC-05
  • Placa de dezvoltare
  • Firele
  • Rezistor de 330 ohmi
  • Diode emițătoare de lumină (LED)

Pasul 2: Conectarea modulului Bluetooth HC-05

Modulul Bluetooth standard HC-05 are șase pini. Cu toate acestea, în acest proiect vom folosi doar 4.

Vom folosi pinul VCC, pinul GND, pinul TXD și pinul RXD. Pinul VCC al modulului bluetooth este conectat la +3,3V de la Arduino. Pinul GND al modulului este conectat la masa Arduino GND. Pinul TX al modulului bluetooth este conectat la pinul digital 0 (RXD), iar pinul RXD este conectat la ieșire digitală 1 (TXD).

Pasul 3: Conectarea LED-urilor

Următorul pas în crearea LED-urilor este controlat prin voce, este să conectați LED-urile la Arduino printr-o placă de breadboard.

Mai întâi conectați capătul scurt al LED-ului la masă. Apoi conectați capătul lung al fiecărui LED la un rezistor de 330 ohmi. În cele din urmă, conectați rezistența de curent de la LED-uri la pinii digitali de pe Arduino.

În acest proiect, vom conecta un LED la pinul digital 2, un altul la pinul digital 3 și ultimul LED la pinul digital 4.

Pasul 4: Putere

Pentru acest proiect, putem furniza energie Arduino prin orice sursă de alimentare de +5V Puteți utiliza portul USB de la computer pentru a alimenta Arduino, dar în acest proiect vom folosi baterie portabila 5V. Înainte de a conecta sursa de alimentare la Arduino, asigurați-vă că GND-ul Arduino este conectat la masa plăcii.

Pasul 5: Cod

Codul pentru proiectul nostru este mai jos.

Pasul 6: Utilizarea aplicației mobile

Puteți începe să vă testați proiectul prin descărcarea aplicației Android - BT Control vocal pentru Arduino (BT Voice Control for Arduino) creat de SimpleLabsIN.

După ce ați descărcat și instalat aplicația pe telefonul dvs Bazat pe Android faceți clic pe bara de meniu din dreapta colțul de susși selectați „Conectați robotul”. În noua fereastră care apare, selectați modulul Bluetooth HC-05 și conectați-l.

Acum, când vorbești cu anumite comenzi de la cod la dispozitiv prin intermediul aplicației, anumite LED-uri ar trebui să se aprindă și să se stingă. Aruncă o privire mai atentă la codul în care sunt indicate comenzile și adaugă-l pe al tău. De exemplu, în loc de „*porniți roșu” puteți specifica pur și simplu „roșu”. În acest fel comenzile vor fi mai rapide, mai scurte și mai clare.

Pasul 7: Rezultatul final

Rezultatul final poate fi văzut în videoclipul de mai jos.

Vă dorim proiecte de succes! Nu uitați să lăsați comentarii despre proiect în pagina noastră

  • Prelucrare
  • Dezvoltare site
  • Idee:

    Cumva mi-a venit ideea de a face Arduino control vocal, dar Arduino singur nu este suficient, pentru că... Pentru un sistem de casă inteligentă, trebuie să comunicați și cu computerul și sistemele acestuia.

    Găsirea unei soluții:

    BitVoicer
    Am dat peste diverse articole care folosesc BitVoicer împreună cu Arduino, dar problema este că BitVoicer funcționează doar pe Windows, iar acest lucru nu permite ca sistemul să fie utilizat pe dispozitive simple, cum ar fi Rasberry Pi, care rulează Unix.
    Recunoașterea vocii Arduino
    Arduino poate fi controlat și prin voce datorită modulului de recunoaștere vocală, dar până acum nu am bucuria de a-l achiziționa și există o serie de inconveniente când folosesc acest modul: un număr limitat de comenzi, antrenament obositor, comenzi noi necesită intermiterea modulului, ceea ce este deja un minus dacă sistemul a fost depanat și instalat.

    Soluţie

    Am început să caut o soluție multiplatformă care să permită sistemului să funcționeze pe mai multe sisteme de operare. Am gasit asta: Bibliotecă Speech to Text pentru Java/Procesare. Complexul este implementat pe baza limbajului Procesare (Java)Şi API-ul Google Speach Despre pisică s-a scris deja înainte. Această soluție vă permite să urmăriți vocea în timp real enableAutoRecord(), indicați limita de volum enableAutoThreshold(), conectați microfoane externe getLineIn(), specificați limba de recunoaștere setLanguage(Șir). O listă completă de caracteristici și detalii este disponibilă pe site-ul web al dezvoltatorului: http://stt.getflourish.com. Pentru a funcționa, avem nevoie de cheia API Google Speech. Cum se obține este descris aici: www.chromium.org/developers/how-tos/api-keys. Singurul punct negativ este că Google Speech vă permite să procesați doar 50 de solicitări pe zi, dar în practică sunt procesate peste 500 de solicitări.

    Pentru a facilita navigarea prin text în viitor, atașez toate sursele, care conțin deja comenzi vocale, conexiune la placa Arduino, o schiță pentru placa Arduino, confirmarea vocală a frazelor și tot ce este deja acolo și lucrează: surse. După descărcare, plasăm folderul GoogleTTS în bibliotecile Processing"a. Schița pentru Arduino se află în folderul GoogleTTS/ArduinoSerial. Totul a fost scris în Processing 3.0a4, disponibil în pre-lansare pe site-ul oficial.

    Implementarea(„Ascultă porunca mea!”):
    Ne-am hotărât recunoașterea. Acum trebuie să prindem comenzile de care avem nevoie și să luăm decizii cu privire la ele. Secțiunea este responsabilă pentru aceasta:
    void commands() ( if (result.equals("arduino")) ( // Se caută o potrivire // Executați comanda când se primește o potrivire ) else if (result.equals("ce oră este")) ( / / Executați comanda când se primește o potrivire))
    Răspuns vocal
    Acum avem nevoie de un instrument care ne va răspunde cu o voce umană dacă se găsește o potrivire. Google Translate a fost ales ca instrument de implementare, sau mai degrabă un modul care convertește textul în voce. Textul este trimis la cerere către serverul Google, convertit într-un fișier audio și trimis înapoi la noi în format mp3. Secțiunea este responsabilă pentru aceasta:
    void googleTTS(String txt, String language) ( // textul este convertit în sunet folosind comanda googleTTS("text", "language") String u = "http://translate.google.com/translate_tts?tl="; u = u + language + "&q=" + txt; u = u.replace(" ", "%20"); încercați ( URL URL = new URL(u); încercați ( URLConnection connection = url.openConnection();); setRequestProperty("User-Agent", "Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 1.2.30703)"); connect(); InputStream is = connection.getInputStream(); new File(sketchPath + "/" + ".mp3" out = new FileOutputStream(f); ) ( out.write(buf, 0, len); ) out.close(); println("Fișier creat: " + txt + " .mp3" ) catch (IOException e) ( e.printStackTrace(); ) ) catch (MalformedURLException e) ( e.printStackTrace(); ) )

    încercați ( URLConnection connection = url.openConnection(); connection.setRequestProperty("User-Agent", "Mozilla/4.0 (compatibil; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; . NET CLR 1.2.30703)"); connection.connect(); InputStream este = connection.getInputStream(); Fișier f = fișier nou (sketchPath + "/" + txt + ".mp3"); OutputStream out = nou FileOutputStream( f); byte buf = new byte ((len = is.read(buf)) > 0) ( out.write(buf, 0, len); ) out.close(); : " + txt + ".mp3" ) catch (IOException e) ( e.printStackTrace(); ) ) catch (MalformedURLException e) ( e.printStackTrace(); )
    Secțiunea este responsabilă pentru procesarea directă a frazelor de text:

    void voicer(String s) ( // Executat de comanda voicer("text") println(s); // folosit pentru a monitoriza text Fișier f = new File(sketchPath + "/" + s + ".mp3"); // Verificarea fișierului // Dacă fișierul există deja, redați fișierul if(f.exists())( println("Fișierul există deja! Joc fișierul!"); player = minim.loadFile(s + ".mp3"); player.play (); // Dacă fișierul nu există încă, creați-l else ( println ("Fișierul nu există încă! Creez!"); googleTTS(s, "ru"); player = minim.loadFile(s + ".mp3");
    Exemplu de implementare a recunoașterii și confirmării vocale:
    void commands() ( if (result.equals("computer"))) ( // Se caută un vocal de potrivire ("Ascultă"); // Primește confirmarea vocală // Execută comanda când se primește o potrivire ) )

    Procesare + Arduino

    Ei bine, se pare că a funcționat, dar lipsește ceva. Acum să ne „împrietenim” cu Arduino.
    Inițializam conexiunea serială în Procesare pentru a trimite date către Arduino (pentru utilizatorii Mac și Unix):
    String portName = Serial.list(); myPort = nou Serial (acest, portName, 9600); myPort.bufferUntil("\n");

    Pentru utilizatorii de Windows:
    String myPort = nou Serial (acesta, „Portul dumneavoastră COM”, 9600); myPort.bufferUntil("\n");

    Și vom trimite o comandă acolo dacă se găsește o potrivire vocală:
    void commands() ( if (result.equals("aprinde lumina")) ( // Dacă fraza vocală este recunoscută ca "aprinde lumina", atunci executați cererea myPort.write ("Înalt"); / / Trimite comanda High către vocalul conexiunii seriale ("Aprinde lumina" // Confirmare vocală a execuției comenzii ) else if (result.equals ("Opriți lumina")) ( myPort.write("Low); "); // Trimite comanda Low către vocalul conexiunii seriale ("Stingerea luminii"); // Confirmare // Executați comanda când se primește o potrivire) )

    Acum să trecem la placa Arduino. Trebuie să ascultăm portul serial și când găsim o comandă din listă, efectuam acțiunea necesară conform comenzii. Schița este foarte simplă:
    int led = 13; // Pinul LED de pe placă void setup() ( Serial.begin(9600); // Inițializați conexiunea serială pinMode(led, OUTPUT); // Pinul LED transmite date ) void loop() ( int i=0; / / variabilă pentru a pune un șir în buffer char buffer // o matrice de buffer pentru a pune șirul în el if(Serial.available())( // Verificați portul serial pentru prezența întârzierii datelor(100); // puneți ceea ce a fost citit în tampon în timp ce (Serial.available () && i< 99) { buffer = Serial.read(); } //закрываем массив buffer="\0"; String val = buffer; if (val == "High") { // Если получили значение High Serial.println("Led is On"); // Отправляем в Serial подтверждение получения digitalWrite(led, HIGH); // Включаем светодиод } if (val == "Low") { // Если получили значение Low Serial.println("Led is Off"); // Отправляем в Serial подтверждение получения digitalWrite(led, LOW); // Выключаем светодиод } } }
    Toate. Să verificăm.

    Probleme și planuri:

    Deoarece Nu am făcut programare înainte de această dată, nu înțeleg pe deplin unele lucruri în procesul de depanare. Aș fi recunoscător dacă cineva mi-ar putea spune cum să rezolv problemele enumerate mai jos:

    Cea mai de bază problemă este că întreaga frază vocală nu este rostită. Ultimele litere dispar. Deși fișierul de sunet vine de la serverul Google în formă normală. După cum am înțeles situația: există o problemă cu playerul audio, dar unde exact nu este încă clar.
    - Am scris deja că API-ul Google Speech are o limită de 50 de solicitări pe zi, dar de fapt iese mai multe. În orice caz, acest lucru nu este suficient. Intenționez să înregistrez recunoașterea locală a comenzii principale și numai după ce este recunoscută, trimit restul textului pentru procesare de către Google.
    - Cred că nu ar strica să trimiți comenzi către scutul Ethernet Arduino, pentru că... Unele sisteme pot fi situate la o distanță considerabilă de computerul gazdă și o conexiune serială nu va mai funcționa aici. Voi aborda această decizie într-o zi, pentru că... Nu am un router pentru a conecta un Arduino cu un scut Ethernet la el.

    Asta e tot! Vă rugăm să nu judecați strict pe baza liniilor de cod! Tocmai am început să studiez acest trambulină și îți voi fi extrem de recunoscător dacă îmi vei freca nasul cum să nu o fac și îmi arăți cum să o fac. De asemenea, mă voi bucura dacă și alte părți interesate se alătură acestui proiect - sunt mereu deschis la comunicare!