Arduino słyszy głosy

Przyznam się, że z modułem do rozpoznawania głosu miałem do  czynienia po raz pierwszy:
IMG_20150323_210652IMG_20150323_210713IMG_20150323_210738
Moduł 'Elechouse Voice Recognition Module 3.1′ może rozpoznać do 7 komend jednocześnie (o długości do 1,5s – jedno, dwa słowa) wybieranych z biblioteki 80 komend nagrywanych przez użytkownika.

W rezultacie rozpoznania komendy zmieniana jest wartość jednego z pinów out0..out6 (np. ustawiana w stan wysoki – zależnie od konfiguracji) lub generowane odpowiednie zdarzenie w oprogramowaniu. Uczenie modułu najlepiej zrealizować wgrywając odpowiedni szkic na Arduino a później postępując zgodnie z instrukcjami wysyłanymi na port szeregowy. Można też do tego użyć komputera PC i przejściówki UART-USB – ale wtedy będziecie musieli się posługiwać komendami specjalnego protokołu (trochę mało intuicyjne, w stylu: aa120200a0).

Moduł dostarczany jest bez wlutowanych pinów. Jedyne piny, które musicie wlutować sami, to te odpowiedzialne za komunikacje (VCC, GND, TX i RX). Będziecie do tego potrzebować 4 gold piny 2.54mm – polecam Wam kątowe, łatwiej podłączyć do nich przejściówkę lub kabelki do Arduino. Resztę pinów możecie również wlutować – jeżeli np. będziecie chcieli korzystać z płytki stykowej. Co ciekawe piny out i in są w rastrze 2,54 mm – ale sekcja dodatkowych i2c/gnd/vpp/ecm jest przesunięta i nie pasuje do płytek stykowych. Jeżeli chcielibyście je wykorzystać – lutujcie szpilki ku górze. Pamiętajcie również, że moduł jest dość szeroki i na standardowej płytce stykowej pozostanie Wam jedynie 1 kolumna wolnych pinów – możecie więc potrzebować chmary zworek, żeby wyprowadzić porty pod układem.
Moduł wymaga zasilania 5V i z takimż napięciem chodzi logika. Jeżeli więc będziecie chcieli podłączyć go do Raspberry, musicie zatroszczyć się o konwersję poziomów napięć. Pobiera ~40mA.

Na rynku możecie również spotkać starsze wersje – np. v2. Mogą one rozpoznawać do 15 komend (o długości do 1,3s) w 3 grupach po pięć komend – czyli efektywnie 5 komend na raz. Żeby komenda z grupy została rozpoznana, dana grupa musi być najpierw wybrana. Wersja ta różni się również składnią protokołu szeregowego (tzn. moduły nie są kompatybilne wstecz).

Pinologia

Moduł udostępnia następujące piny:

Pin modułu Opis Podłączenie do Arduino Podłączenie do przejściówki UART-USB
GND Masa GND Arduino GND przejściówki
VCC Zasilanie, 4.5 – 5V 5C Arduino 5V na przejściówce (odpowiednio ustawcie zworkę – zależnie od modelu przejściówki)
RXD Odbiór danych 2 TxD
TXD Nadawanie danych 3 RxD
out0-out6 Wyjścia: ustawianie pinów sygnalizujących rozpoznanie jednej z komend w grupie Dowolny pin cyfrowy jako wejście (INPUT)
in0,in1,in2 Wejścia: piny ustawiające  która z grup rozkazów ma być rozpoznawana (zobaczcie poniżej). Ten sam efekt można również osiągnąć za pomocą odpowiednich komend wydawanych po UART

in0 in1 in2 Grupa Komendy
0 0 0 00 0-6
1 0 0 01 7-13
0 1 0 02 14-20
1 1 0 03 21-27
0 0 1 04 28-34
1 0 1 05 35-41
0 1 1 06 42-48
1 1 1 07 49-55

Wersja 3 modułu posługuje się grupami systemowymi (jak powyżej) i zdefiniowanymi przez użytkownika.

Dowolny pin cyfrowy jako wyjście (OUTPUT)
Do manipulacji na portach szeregowych producent poleca aplikację AccessPort
Do manipulacji na portach szeregowych producent poleca aplikację AccessPort risrmy SUDT – do pobrania tutaj

Czas na trening

Moduł dzieli komendy (a właściwie wzorce służące do ich rozpoznawania) na grupy. Każda grupa składa się z max. 7 komend. Grupy systemowe (00-07) opierają się na kolejności umieszczenia wzorców w pamięci – pierwsze 7 to grupa '0′, następne 7 – grupa '1′ itd. Grupę użytkownika tworzy się przez dodanie do niej wybranych wzorców – np. 0, 10, 25 – maksymalnie 7. Używając ten moduł trzeba wskazać, która grupa jest aktywna. Tylko komendy z aktywnej grupy będą rozpoznawane. Efektywnie moduł może więc rozpoznawać 7 komend na raz – pochodzących z jednej grupy.
Moduł działa w ten sposób, że porównuje nagrane wzorce do przechwyconych fraz poszukując między nimi podobieństw. W pierwszym kroku konieczne jest więc 'nauczenie’ modułu wzorców. Instrukcja jest naprawdę przejrzysta:

  • Z githuba pobrałem pliki biblioteki i rozpakowałem do katalogu instalacyjnego Arduino IDE – np. 'C:\Program Files (x86)\Arduino\libraries’
  • Otworzyłem Arduino IDE i załadowałem przykład 'Plik>Przykłady>VoiceRecognitionV3>vr_sample_train’
  • Załadowałem projekt na UNO; otworzyłem monitor portu szeregowego [CTRL]+[Shift]+[M]. Pamiętajcie, żeby wybrać szybkość 115200 i wysyłanie końców linii:
    Clipboard0100
  • Używając monitora możecie wysłać do Arduino kilka poleceń:
    settings Ustawienia systemu
    sigtrain 0 robot Nagraj wzorzec o nazwie (signature) 'robot’ na miejsce 0 (grupa systemowa 0); setch poprosi o wypowiedzenie komendy, a później powtórzenie jej, tak:
    sigtrain 0 robot
    --------------------------------------------------------------------------------
    Record: 0 Speak now
    Record: 0 Speak again
    Record: 0 Success
    Success: 1
    Record 0 Trained
    SIG: robot
    sigtrain 8 start Nagraj wzorzec o nazwie (signature) 'stop’ na miejsce 8 (grupa systemowa 1)
    load 0 8 Załaduj wzorce 0 i 8 do rozpoznawania; jeżeli po tym rozkazie wypowiecie polecenie, moduł będzie starał się dopasować je do wzorców (tutaj: 0 i 8)
    help Komendy dostępne w tym trybie
    clear Wyczyść wszystkie wzorce

Clipboard02

Ja planuję wykorzystać moduł do sterowania robotem, nagrałem więc:

  • 0: robot – grupa 0; to będzie klucz, który gdy moduł usłyszy przejdzie do grupy 1 odpowiedzialnej za sterowanie
  • 8: start – grupa 1
  • 9: stop – grupa 1
  • 10: lewo – grupa 1
  • 11: prawo – grupa 1

Clipboard01
Czas na test: najpierw załadowałem odpowiednie wzorce do rozpoznawania:
load 0 8 9 10 11
Wypowiadałem kolejno komendy do mikrofonu i obserwowałem wyniki rozpoznawania na monitorze portu. Generalnie trzeba było je wypowiadać z bliska i pewne słowa modułowi się namiętnie myliły 0 np. 'robot’ z 'prawo’. Wyniki były zdecydowanie lepsze, gdy z pokoju z telewizorem w tle przeszedłem do spokojniejszego miejsca. Wtedy moduł wychwytywał komendy z odlegości ponad metra a liczba pomyłek była znacznie mniejsza.

Protokół komunikacyjny?

Żeby efektywnie używać modułu z Arduino producent dostarcza odpowiednią bibliotekę. Zawiera ona funkcje wymagane do obsługi wszystkich funkcji modułu. Opis interfejsu znajdziecie w pliku 'libref.pdf’ załączynym do biblioteki – choć pewnie ciekawiej będzie spojrzeć do kodu źródłowego (pliki 'VoiceRecognitionV3.cpp’ i 'VoiceRecognitionV3.h’). Nie przejmujcie się, że część kodu jest otagowana jako wersja v2. Gdy spojrzycie do pliku 'VoiceRecognitionV3.cpp’:
void VR :: send_pkt(...)
{
//...
write(FRAME_HEAD);
write(len+3);
write(cmd);
write(subcmd);
write(buf, len);
write(FRAME_END);
//..
}

…zauważycie, że format wysyłanej ramki jest zgodny z wersją protokołu 3, nie 2:

Nagłówek Długość (to pole+komenda+dane) Komenda Dane Koniec
AA wartość wartość wartość 0A

W wersji 2 każda komenda składała się z 2 części: nagłówka i kodu komendy.

Zainteresowanym polecam lekturę tego protokołu. Dzięki niemu będziecie mogli obsłużyć moduł np. z poziomu pythona na komputerze. Więcej szczegółów na jego temat znajdziecie w instrukcja obsługi modułu vr3

Kawałek programu

Mając już wytrenowany moduł, podłączyłem go UARTem do Arduino (jak przy treningu, do pinów 2 i 3), otworzyłem nowy projekt w Arduino IDE i:

  • Dodałem biblitekę VR: Szkic>Importuj bibliotekę>VoiceRecognition’
  • Dodałem biblitekę SoftwareSerial: 'Szkic>Importuj bibliotekę>SoftwareSerial’
  • Kod:

    Jakkolwiek by to dziwnie nie wyglądało…
Arbotta - test sterowania głosem
Arbotta – test sterowania głosem

Krótkie video – prototyp ArBotta sterowany głosem

Podsumowanie

Dzięki swoim niewielkim rozmiarom testowany 'Elechouse Voice Recognition Module 3.1′ udało się zastosować nawet na pokładzie niewielkiego ArBotta – chociaż jazgot silników znacznie ograniczył możliwość rozpoznawania komend. Oczywiście (co nie jest zaskoczeniem) dużo lepiej spisuje się w cichych otoczeniach. W głośniejszych trzeba mówić do mikrofonu z mniejszej odległości (niekoniecznie głośniej). W niektórych realizacjach można zastąpić dostarczany z modułem mikrofon na drucie innym, na elastycznym przewodzie – wtedy sam moduł nie musiałby już być dokładnie w miejscu źródła głosu.

Producent chwali się 99% skutecznością rozpoznawania głosu. Pewnie jest to możliwe przy rozważnym dobraniu komend. Oczywiście wzorce są charakterystyczne dla osoby – moduł chętnie rozpoznawał mój głos, na inne nie reagował w ogóle.
Na olbrzymi plus należy na pewno zaliczyć dostarczane z modułem wsparcie – biblioteki, przykłady, dokumentacja interfejsu, dokumentacja modułu – to bardzo ułatwia uruchomienie. Dostarczony soft jest odpowiedniej jakości i nie sprawił większych problemów. Co więcej – sketch do wgrywania komend był bardzo elegancki.

Jakość wykonania nie budzi zastrzeżeń. Super, że producent pomyślał o otworach montażowych – bardzo łatwo będzie go umocować. Małym minusem jest to, że kupujący musi samodzielnie wlutować sobie kilka pinów.
Myślę, że moduł ten może stać się ciekawym rozszerzeniem niektórych projektów. Życzę fajnej zabawy:)

Źródła

2 komentarze do “Arduino słyszy głosy”

Dodaj komentarz