Wprowadzenie

Już od pewnego czasu co raz większą popularność zyskują asystenci głosowi jak Amazon Alexa czy Google Home. Są to z ładne urzadzenia podpięte do sieci które przy wykorzystaniu potężnego chmurowego zaplecza w/w firm, są w stanie niemal natychmiastowo zrozumieć wypowiedziane przez nas zdanie, przełożyć je na tekst pisany czy zrozumieć naszą intencje i wykonać wydane polecenie.

Ogólne* działanie tych urządzeń, ich wykonanie, możliwości i cena z mojego punktu widzenia są fajną opcją dla ludzi którzy chcą uczynić swoje mieszkania i domy bardziej „smart” czy futurystycznymi.

Niestety nie dla mnie.

W obu przypadkach urządzenia muszą stale być podpięte do sieci, ponieważ rozpoznanie głosu odbywa się w chmurze a nie na urządzeniu. No własnie. W chmurze.

Nie lubie streamingów, chmury, zakupu cyfrowych produktów (np. gier na Steam), czyli wszystkiego co wyzbywa mnie kontroli oraz własności. Kiedyś może o tym napiszę obszerniejszy post bo już dziś na świecie dzieją się rzeczy które powinny wielu ludziom otworzyć oczy na to co może się za lat 10-15 (a stanie się), czyli za naszego życia.

Wracając do tematu.
W 2013 roku mocno zainspirowany Jarvisem z Iron Mana postanowiłem wykonać własnego asystenta głosowego. Okazało się że wystarczyło mieć w domu Windows 7 + mikrofon i może jakiś głośnik żeby miec własnego „Jarvisa”.

W Windows 7 znajdował się silnik Speech Recognition która umożliwiała rozpoznawanie głosu na poziomie systemu operacyjnego. Oczywiście można było ten silnik wykorzystać we własnych aplikacjach na Windows przy użyciu framework’a .NET.
Dosłownie 5-10 linii kodu wystarczyło aby na ekranie zobaczyć wypowiedziane do mikrofonu słowa.

Rozpoznawanie free-textu przyznam było… ekhm… słabe 🙂 Być może dla native brytyjczyka czy amerykanina działało by to _nieznacznie_ lepiej, moje doświadczenia były bardzo złe.
Tak było do momentu kiedy poznałem tzw. metodę słownikową w tym silniku. Pozwalała ona na stworzenie całych wyrażeń które mają być przez ten silnik rozpoznawane przy (chyba) całkowitym wyłączeniu free-textu.

Skuteczność była tak ogromna przy wypowiadaniu zakodowanej frazy, że szczękę zbierałem z podłogi przyznajmniej kilka razy z wrażenia.

Jak to działało ?
Dosyć prosto, silnik nasłuchiwał tylko określonych wyrażen i starał się za wszelką cenę dopasować słowa do stworzonego słownika. Jeżeli nie dopasował – wybierał wtedy to słowo (ze słownika) które pasowało mu najbardziej 🙂

Przykład:
Cały słownik zawiera tylko jedną frazę: I like $color vegetables.
Pod wyrażeniem $color również kryły się przedefiniowane wartości (tzw. alternatives) – red, green, yellow.

Wypowiedzenie „I like red vegetables” dawało skuteczność na poziomie 95%+, nawet z cięęęężkim polskim akcentem:)
Ciekawiej było powiedzieć „I like black vegetables” gdzie system znów nie miał problemu z rozpoznaniem frazy, ALE blue prawdopodobnie zamieniłoby się na ‚red’ czy ‚green’ w zależności co silnik uznałby za trafniejsze (oczywiście mowa o akustyce, a nie znaczeniu słowa).

Rozwiązanie miało jednak szereg wad:
* Win7 – czyli bez PCta nie da rady
* Obniżająca się skuteczność przy dużych słownikach
* Małe możliwości budowy „dynamicznych” słowników. Były wyrażenia opcjonalne oraz wildcardy ale nie dawało to aż takich dużych możliwości.
* Brak „Wake-word”, rozpoczęcie nasłuchiwania odbywało się na zasadzie Push To Talk

Projekt po około 50 dniach aktywnego developmentu mnie przerósł. Nie udzwignałem ogromu funkcjonalności który chciałem zaimplementować.

Minęło 7 lat, technologia poszła drastycznie naprzód, a ja jestem dojrzalszy więc do nowego projektu podszedłem w sposób bardziej wyważony.

W następnych wpisach postaram się opisywać swoje bieżace doświadczenia z budowy własnego asystenta głosowego.