Ledy głosem sterowane – Rozpoznawanie mowy

Wprowadzenie

Przeglądając ciekawe itemy z chin natrafiłem na dość tanią adresowaną taśmę led. Jak to już bywa czasem najpierw się kupuje, a potem myśli. Początkowo miało to służyć jako ambilight, lecz ostatecznie przykleiłem pod półką, która wisi nad biurkiem. Przewiduje 4 opcje sterowania: sterowanie głosowe, panel www, klaśnięcie, przyciski/switche. Całość będzie oparta o Raspberry Pi Zero. Przedstawiane tutaj kody mają jedynie pokazać drogę do stworzenia aplikacji, lecz nie podawać tego na tacy, więc nie nastawiajcie się na kopiuj-wklej 🙂

Sterowanie głosowe

Od początku całość miała służyć jako pole manewrowe przy nabywaniu nowych umiejętności, z tego powodu też postanowiłem sam wszystko napisać. Poza programowaniem potrzebna będzie też podstawowa znajomość praw fizyki przy budowie układu elektronicznego (dotyczyć tego będzie osobna część tego devloga).

Aplikacja na telefon

Jako iż posiadam telefon z Androidem, tylko pod ten system powstanie aplikacja. Jako IDE wybrałem IntelliJ Idea z powodu przyzwyczajenia oraz tego, że Android Studio jest jak dla mnie za bardzo przepełnione dodatkami. Do rozpoznawania mowy wykorzystana została odpowiednia klasa z API systemu. Nie przypadła mi do gustu wizja wyskakującego okienka, dlatego przeszukałem Internet w poszukiwaniu rozwiązania aby tego uniknąć. Pomijam tutaj kwestię stworzenia projektu z wygenerowanym Activity.

Aby skorzystać z opcji rozpoznawania mowy potrzebujemy zezwolenia systemu do nagrywania audio. W tym celu dodajemy do pliku AndroidManifest.xml w środku elementu manifest linijkę: <uses-permission android:name="android.permission.RECORD_AUDIO"/>.

Kolejnym krokiem jest przygotowanie wyglądu naszej aplikacji (w zależności od potrzeb jest to layout activity albo fragment). Ja postanowiłem nie dawać użytkownikowi możliwości wyłączenia nagrywania tylko ustawiłem sztywno ilość czasu na podanie polecenia, dlatego użyłem zwykłego przycisku (w przeciwnym przypadku można pokusić się o 2 przyciski ON/OFF albo ToggleButton).

Gdy już nasza aplikacja jako tako wygląda, należy jakoś tchnąć w nią życie. W metodzie onCreate należy stworzyć nową instancję wyżej wymienionego SpeechRecognizer’a:

Tworzymy klasę RecognitationListener implementującą metody z androidowego interfejsu RecognitionListener. Teoretycznie potrzebna nam jest tylko metoda onResult (fajnie by było zaimplementować też obsługę błędów, lecz to już zależy od waszych preferencji). Teraz w metodzie onCreateView  musimy dopisać tuż przed return view; kod dodający listener do przycisku:

voice_activation_button to ID naszego przycisku przypisane w pliku xml wyglądu. W klasie należy stworzyć także metodę która jest wywoływana wewnątrz tego listenera, czyli onVoiceActivation:

Uruchamia to proces wykrywania mowy, a z opóźnieniem 5000 milisekund zatrzymuje go.

W klasie listenera rozpoznawania mowy, w metodzie onResults wszystkie uzyskane wyniki pobieramy np. tak: ArrayList<String> matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);.

Wpadłem później także na pomysł aby zamiast przycisku dać ImageButton a za nim wstawić okrągły progressbar pokazujący ile czasu minęło. Do tego celu wykorzystałem bibliotekę CircleProgress.

Screen aplikacji na tym stadium rozwoju:

Aplikacja do sterowania głosowego

To by było na dziś tyle. W kolejnej części devloga przedstawie jakiś sposób na przypisywanie otrzymanych wyników do danego szablonu i wykonywanie w związku z nim jakiejś akcji.

Mateusz Bałuch

Ten autor jeszcze nie podzielił się czymś o sobie.

Zobacz wszystkie posty tego autora →

Komentarze

  • Gronekmaster

    Mateuszu, lepiej przeczytaj tekst jeszcze raz i popraw wszelkie literówki, i błędy gramatyczne/ortograficzne (na samym początku dla przykładu jest „chin” zamiast „Chin”)