Od zera do spikera - sterujemy komputerem za pomocą głosu cz. 4
10.05.2014 13:23
Człowiek to ciekawe stworzenie, dasz mu odpowiednie narzędzia i postawisz w obliczu problemu - będzie tylko kwestią czasu nim uruchomią się w nim odpowiednie procesy myślowe i zacznie szukać stosownego rozwiązania... z potrzeby lub choćby z czystej ciekawości. Każdy z nas inaczej, na swój sposób. Kreatywnie.
Czasami odnoszę nieodparte wrażenie, że oprogramowanie ubiegłej dekady bardziej niż obecnie wspierało właśnie takie indywidualne przejawy twórczej aktywności. Przynajmniej w obszarach, które interesują mnie najbardziej. Dlatego też, wbrew wszystkiemu, postanowiłem, że zrobię coś po swojemu i rozpocząłem pracę nad narzędziem tworzącym pomost między technologią rozpoznawania mowy, a tym co możesz zobaczyć na ekranie swojego komputera.
Jak więc mówić do komputera, aby ten nas rozumiał? Najlepiej wykorzystać oprogramowanie, które wyszuka w naszej mowie wcześniej ustalone (zaprogramowane) komendy głosowe i podejmie właściwe dla tych poleceń działania. Aplikacją zdolną do podejmowania takich działań, obsługującą w pełni język polski, działającą szybko i sprawnie, jest właśnie Spikit. Ten tekst ma na celu pokazać, że utworzenie własnego asystenta głosowego może być bardzo proste i przyjemne.
Jeśli dotrzesz do końca tego wpisu, szybko zobaczysz, że łącząc Spikit z dostępnymi powszechnie rozwiązaniami (serwisami takimi jak WolframAlpha ) będziesz mógł w zaciszu swojego mieszkania budować zalążek własnego odpowiednika Cortany lub Siri. Bez kitu!
Czy na efekty trzeba długo czekać? Nie, dla sprawnego użytkownika to kwestia kilku chwil. Dla początkujących mówców, którym z jakichś przyczyn dołączony do programu podręcznik użytkownika po prostu "nie leży", stworzyłem ten oto kurs. Osoby obeznane z aplikacją mogą odnaleźć zarówno tu, jak i w poprzednich odcinkach (cz. 1, cz. 2, cz. 3 ), wiele ciekawych informacji i utrwalić zdobytą wcześniej wiedzę.
Najpierw jednak, zaktualizuj swoją wersję Spikit do najnowszego (w chwili publikacji tego wpisu) wydania opatrzonego numerem 1.7.0.0. Gotowy?
Lekcja 4
W dzisiejszej części kursu skupimy się na zagadnieniu ustalania kontekstu wypowiedzi dla naszych komend głosowych. Mówiąc inaczej, zaczniemy przyporządkowywać różnego rodzaju akcje naszym poleceniom. Pamiętając podstawowe prawidła wprowadzone w pierwszej części serii "Od zera do spikera", dzięki akcjom informujemy program podjęcia jakich czynności oczekujemy w zamian za wypowiedzenie komendy. W przypadku, gdy pominiemy tę jakże istotną czynność, no cóż...
W ogóle brak akcji jest. Nic się nie dzieje.
Choć ilość typów akcji w Spikit jest ograniczona (wyróżniamy w zasadzie tylko 5 typów), ilość możliwych do utworzenia różnych poleceń głosowych wykorzystujących poszczególne rodzaje akcji już tak ograniczona nie jest. Jest wręcz przeogromna, a przynajmniej takie są podstawowe założenia programu.
W przypadku zaprogramowanych w aplikacji stałych czynności (typ akcji: Predefiniowana), możemy mówić o ograniczonym zakresie ich stosowania. Siatka czy klawiatura ekranowa, a nawet okno podglądu dostępnych w danej chwili poleceń to przykłady stałych elementów programu, których głosowa obsługa wygląda zawsze w zbliżony sposób. Chęć podyktowania tekstu przy użyciu lokalnego Słownika lub za pomocą modułu sieciowego możemy wyrazić w różny sposób, ale zawsze sprowadza się to do przekazania informacji:
hej komputer, włącz dyktowanie
Najważniejsza - z punktu widzenia programu - jest zatem ta końcowa informacja, a słowa wypowiadane przez użytkownika odgrywają drugorzędną rolę. Tak, IMHO, powinien wyglądać dobry system rozpoznawania mowy. Powinien dawać użytkownikowi końcowemu dowolność wyboru komend sterujących:
Jak widać powyżej, ustalenie kontekstu wypowiedzi (zdefiniowanie akcji) w systemie rozpoznawania mowy Spikit sprowadza się do wstawienia znaków { } i umieszczenia pomiędzy nimi sensownej treści. Nie ma przy tym znaczenia miejsce ustalenia kontekstu jeśli obejmuje ono swoim zakresem wykorzystywane w komendzie słowa. Przypomnij sobie zasady budowania list poleceń i oddzielania jednych komend od drugich. W następnym przykładzie, trzy kolejne polecenia wchodzące w skład niewielkiej Reguły głosowej wskazują na tę samą akcję:
Typ akcji - Predefiniowana
Ten rodzaj akcji, jak to podkreśliłem już wcześniej, wykorzystujemy wtedy, gdy chcemy powiązać wypowiadane przez nas słowa z pojedynczą (zwykle skomplikowaną) czynnością, zaprogramowaną na stałe wewnątrz aplikacji. Dla szybkiego odróżnienia tego typu akcji od innych dostępnych w Spikit, zapisu poszczególnych nazw predefiniowanych czynności dokonujemy wielkimi literami. Stosowanie takiej konwencji zapisu nie jest wymagane, ale ułatwia późniejszą pracę i ewentualną modyfikację poleceń (szczególnie w przypadku długich lub rozbudowanych Reguł głosowych). Możesz zapisywać akcje małymi lub wielkimi literami albo stosować inne zasady tak długo jak poszczególne słowa będą się po prostu zgadzały co do litery. Poniższe zapisy akcji są więc równoważne (znaczą dokładnie to samo):
Predefiniowane, czyli inaczej wbudowane akcje, mogą odnosić się do różnych funkcji programu. Wiele z tych akcji przynależy do tych samych kategorii, stąd też ich nazwy rozpoczynają się od tych samych słów np. DYKTOWANIE_ albo SIATKA_ czy USTAWIENIA_. Każda predefiniowana akcja posiada przypisany do siebie krótki opis. Opis ten wyświetlany jest razem z okienkiem autouzupełniania nazw po wprowadzeniu znaku specjalnego { w polu edycyjnym Reguły głosowej. Poszczególne nazwy akcji starałem się dobrać w taki sposób, by bezpośrednio wskazywały na czynność, która zostanie zrealizowana, gdy tylko Spikit rozpozna dane polecenie.
Warto śledzić zmiany w kolejnych wersjach aplikacji, gdyż - naturalnie - lista predefniowanych akcji nie jest jeszcze zamknięta i okresowo dodaję do programu rozwiązania zasugerowane przez użytkowników bądź będące efektem własnych rozważań. Jedną z ostatnich nowości wprowadzonych w Spikit jest możliwość skalowania (i np. powiększenia) interfejsu programu. Rzecz szczególnie przydatna osobom pracującym z dużą rozdzielczością ekranu. Nie należy jednak spodziewać się lawinowego wzrostu liczby takich wbudowanych rozwiązań. Mamy już ich całkiem pokaźny zestaw, oferujący bardzo szeroki wachlarz możliwości. Nie zapominajmy też, że Spikit posiada inne mechanizmy umożliwiające nawet tworzenie własnych "wtyczek" i powiązań pomiędzy wypowiadanymi słowami, a tym czego nam w danej chwili rzeczywiście potrzeba (o czym nadmienię w następnym wpisie). Nie wspominając już o kolejnym typie akcji jakim jest...
Typ akcji - Tekst
Korzystając na co dzień z kilkunastu serwisów internetowych, operując na tych samych typach plików lub wypełniając dokumenty zgodnie z tym samym, przyjętym przez nas schematem - we wszystkich tych czynnościach działamy ciągle na powtarzających się (niekiedy do znudzenia!) kawałkach informacji, zwykle reprezentowanych w postaci tekstowej. W oparciu o słowo pisane zbudowaliśmy przecież całą cywilizację. Warto więc mieć możliwość powiązania słów komendy głosowej z akcją wprowadzenia ustalonego przez nas ciągu znaków w aktywne pole formularza, w pasku adresu czy w edytorze tekstu, wszędzie tam, gdzie mamy do czynienia z pojedynczymi literami bądź cyframi, słowami lub nawet z długimi frazami. Przykład prosto z życia:
lub jeszcze prościej:
Jak można zauważyć, interesujący nas tekst umieszczamy między znakami cudzysłowu. Gdy wypowiemy słowa komendy, Spikit wprowadzi za nas przechowywany w pamięci tekst dokładnie w taki sam sposób, jak byśmy to my sami wykorzystali do tego celu klawiaturę komputera tj. informacja zostanie przekazana do aktywnej aplikacji w sposób, który dokładnie odwzorowuje zachowanie się systemu operacyjnego Windows w momencie naciskania poszczególnych klawiszy na prawdziwej klawiaturze. Prosta, acz przydatna funkcja, mająca tyleż samo różnych zastosowań, co użytkowników.
Typ akcji - Sekwencja klawiszy
Możliwość przypisania sekwencji klawiszy do wybranych przez nas słów, a co za tym idzie głosowego wyzwalania skrótów klawiszowych to jedna z pierwszych funkcji wprowadzonych do Spikit. Dlaczego jest ona istotna? Niech najlepszą odpowiedzią będzie niezaprzeczalny fakt, że systemem operacyjnym Windows, a także zainstalowanym na nim domyślnym oprogramowaniem można komfortowo sterować z poziomu klawiatury, bez potrzeby sięgania po myszkę. Co prawda wymaga to trochę wprawy i zdarzają się wyjątki od reguły, ale w większości przypadków szybciej jest sięgnąć do klawiatury niż po zasłużonego gryzonia. Dotyczy to również większości programów utworzonych przez firmy trzecie. Jeśli więc jakąś czynność mogliśmy już wcześniej wykonać z poziomu klawiatury (np. zaznaczanie całego lub tylko fragmentu dłuższego tekstu), możemy ją równie prosto i szybko zrealizować za pomocą naszego własnego głosu.
Tym co dla nas istotne, jest wiedza, w którym programie okienkowym lub konsolowym aktualnie się znajdujemy i jak wykorzystywaliśmy wcześniej klawiaturę podczas pracy z danym programem. Wiemy przecież, że choć niektóre popularne skróty klawiszowe są współdzielone między aplikacjami (Zapisz plik, Pomoc, Znajdź w pliku, itp.) to inne już nie zawsze są takie same. Nie oczekujmy zatem, że Spikit sam domyśli się, że jednak "zapisz plik" w tym konkretnym przypadku skutkować będzie zapisaniem pliku, a nie np. wyłączeniem programu bez zapisywania. Włączamy myślenie - tak jest bezpieczniej ;‑P
Naciśnięcie pojedynczego klawisza nie powinno wymagać dodatkowego tłumaczenia. Pomiędzy znakami specjalnymi { } wprowadzamy jedną z nazw dostępnych w oknie autouzupełniania, a dokładnie jedną z tych przypisanych do kategorii 'Klawisze'. Gdy tylko wypowiemy słowa komendy głosowej, wskazany przez nas klawisz zostanie naciśnięty. Aby nacisnąć jakiś klawisz wielokrotnie lub kilka różnych klawiszy po kolei, należy oddzielić poszczególne nazwy spacją np.:
Jeśli jakiegoś klawisza nie odnajdziemy na liście to bardzo możliwe, że do jego wprowadzenia wymagane jest naciśnięcie modyfikatora Shift lub Alt wraz z innym klawiszem, dokładnie w taki sam sposób jak na prawdziwej klawiaturze. Oczywiście umieszczanie na liście poszczególnych liter alfabetu (bez polskich znaków) oraz cyfr mijało się z celem, więc należy przyjąć, że klawisze te są po prostu dostępne do wykorzystania.
Połączenie dwóch lub większej ilości klawiszy symbolem dodawania zostanie zinterpretowane przez program jako chęć przytrzymania poszczególnych klawiszy w określonym porządku, naciśnięcia klawisza docelowego i zwolnienia przytrzymanych klawiszy w odwrotnej kolejności. Zatem polecenie "naciśnij skrót {Ctrl+Shift+Tab}" zostanie wykonane w następujący sposób: przytrzymaj Ctrl i przytrzymaj Shift i naciśnij Tab i puść Shift i puść Ctrl.
W przypadku, gdy chcemy wykorzystać bardziej zaawansowany skrót klawiszowy, pełniący np. rolę combo w grze komputerowej, możemy skorzystać z możliwości dłuższego przytrzymania jednego lub większej ilości klawiszy. W tym celu należy poprzedzić nazwę odpowiedniego klawisza przedrostkiem Hold_ (przytrzymaj), a gdy przestanie on nam być potrzebny - przedrostkiem Release_ (zwolnij). To niezwykle ważne, by w odpowiednim czasie zwolnić przytrzymane klawisze i nie pozostawiać ich w stanie ciągłego przytrzymania (przytrzymałem-zapomniałem). Czy próbowałeś tak zrobić kiedyś z prawdziwą klawiaturą komputera? Jeśli zapomisz, które z klawiszy zostały przez Ciebie głosowo przytrzymane, możesz w ostateczności wykorzystać jedną z predefiniowanych akcji {KLAWISZE_WYCZYŚĆ}, by zwolnić wszystkie przytrzymywane klawisze.
Ciąg zapisany pomiędzy znakami specjalnymi { } traktowany jest jako pojedyncza akcja, choć dzięki możliwości mieszania różnych sposobów zapisów, można niekiedy odnieść wrażenie, że dana sekwencja składa się z wielu drobnych akcji. Tak jednak nie jest. Cały proces naciskania kolejnych klawiszy odbywa się w jednakowym tempie, dającym się oczywiście modyfikować globalnie (patrz: {KLAWISZE_WYDŁUŻ_OPÓŹNIENIE} oraz {KLAWISZE_SKRÓĆ_OPÓŹNIENIE}). Możliwość zmiany tempa (przerwy pomiędzy kolejnymi naciśnięciami jak i czasu przytrzymania klawisza) jest bardzo przydatna w przypadku gier komputerowych, w których sterowanie nie odbywa się drogą obsługi zdarzeń systemowych, a na zasadzie okresowego odpytywania (np. sprawdź co 100 ms, które z klawiszy są w danej chwili naciśnięte). Odpowiednie wydłużenie lub skrócenie czasu wciskania klawisza umożliwi nam np. precyzyjnie oddawać określoną ilość strzałów w grze FPP.
Typ akcji - !Bang
Jeśli regularnie korzystasz ze znakomitej wyszukiwarki DuckDuckGo, powinieneś czuć się jak u siebie w domu. Jeśli po raz pierwszy spotykasz się z tą nazwą, wiedz, że jest to "Wyszukiwarka, która Cię nie śledzi", przynajmniej według zapewnień jej autora.
Komendy !Bang w Spikit działają właśnie we współpracy z wyszukiwarką DuckDuckGo (z której oryginalnie pochodzą) i dają możliwość błyskawicznego dostępu do zasobów setek różnych serwisów internetowych działając na zasadzie prostego przekierowania pytania zadanego wyszukiwarce. DuckDuckGo działa w tym przypadku jak proxy (pośrednik) i przekierowuje zapytanie na przykład do serwisu YouTube, Zdjęć Google albo WolframAlpha (na oficjalnej liście znajdują się również polskie strony). Co więc w tym specjalnego i jaki to ma związek z technologią rozpoznawania mowy dostępną w Spikit?
Akcję typu !Bang utworzymy przez umieszczenie pomiędzy znakami specjalnymi { } wykrzyknika i skróconej nazwy interesującego nas serwisu. Nie muszę więc znać pełnego adresu strony internetowej googlowskiej wyszukiwarki zdjęć lub translatora, wystarczy mi !gimages lub !gtranslate. By odszukać coś na mapie dostarczanej przez Bing użyję komendy !bmaps lub !bingmaps. Lista wszystkich dostępnych komend udostępniana jest na stronie duckduckgo.com/bang.
Tworzenie polecenia głosowego wykorzystującego komendy !Bang jest dziecinnie proste, a nawet jeśli ustalisz kontekst wypowiedzi w Spikit w sposób prawidłowy, ale przy użyciu nieistniejącej komendy, DuckDuckGo zwróci Tobie wynik wyszukiwania dla wprowadzonej frazy korzystając ze swojego silnika. Oczywiście żadnego z pytań nie musimy wprowadzać ręcznie. Po wypowiedzeniu stosownego polecenia głosowego Spikit włączy funkcję wyszukiwania głosowego przy użyciu modułu sieciowego lub lokalnego Słownika. Wystarczy wtedy powiedzieć dokładnie to, co wpisalibyśmy w polu wyszukiwania lub innym formularzu odwiedzanego serwisu. Sam możesz skorzystać z możliwości wyszukiwania głosowego z poziomu dowolnej otwartej aplikacji. Gdy Spikit rozpozna wypowiadane przez Ciebie słowa, uruchomi Twoją ulubioną (tj. domyślną) przeglądarkę internetową (Internet Explorer, Firefox, Chrome lub inną).
Najlepsze jest to, że także Ty możesz dodać do listy obsługiwanych komend swoje ulubione serwisy. Ciekawe ile czasu zajmie Czytelnikom dodanie komendy umożliwiającej głosowe wyszukiwanie treści na portalu dobreprogramy.pl (np. !dobreprogramy)? Trochę dziwi fakt, że jeszcze go tam nie ma (ekhm... Redakcjo!). Kiedy już to zrobicie, wspomnijcie o tym fakcie koniecznie w komentarzach. Dodam wtedy stosowne polecenie do domyślnej Reguły dostarczanej razem ze Spikit :‑) Jak integracja Spikit z DuckDuckGo wygląda w praktyce, mogliśmy już zobaczyć na filmie sprzed kilku wersji (pierwsza minuta filmu), który przypominam poniżej:
Typ akcji - URI
Pojęcie ujednoliconego identyfikatora zasobu (z ang. URI, Uniform Resource Locator) znane jest pewnie nielicznym Czytelnikom. Choć dla wielu może to być tylko niewiele mówiący zbiór słów, to z ideą leżącą u podstaw URI mamy do czynienia wielokrotnie każdego dnia. By sprawnie funkcjonować we współczesnym społeczeństwie, musimy bowiem przetwarzać niezliczoną ilość informacji. URI to standard umożliwiajacy jasne i klarowne, a zarazem uniwersalne określanie miejsca występowania jakiejś informacji lub ogólniej mówiąc - zasobu, bez względu na to czy zasób ten znajduje się w sieci czy na komputerze lokalnym. Spikit posiada wbudowaną obsługę takich identyfikatorów, dzięki czemu może ułatwiać Tobie dostęp do wybranych plików lub lokalizacji za pomocą zainstalowanego na komputerze oprogramowania. Sposób postępowania z danym zasobem zależy od powiązanego z nim tzw. schematu. Spikit powierza systemowi operacyjnemu proces uruchomienia aplikacji powiązanej z danym zasobem.
Przykładem najpowszechniejszych zasobów w sieci są strony internetowe, do których dostęp odbywa się zgodnie z protokołem HTTP (lub HTTPS). Programem, który "rozumie" ten protokół i zajmuje się komunikacją z serwerem w sieci w imieniu i na rzecz użytkownika, by pobrać zasób na komputer lokalny i ostatecznie wyświetlić go na ekranie, jest przeglądarka internetowa. Aby przeglądarka wiedziała jak konkretnie potraktować dany zasób, integralną częścią ścieżki do zasobu jest właśnie schemat (w tym przypadku o zbieżnej z protokołem nazwie - choć zupełnie innym znaczeniu - 'http', po której występuje dwukropek).
Możliwości praktycznego wykorzystania URI nie ograniczają się wyłącznie do wskazywania miejsca przechowywania jakiejś informacji. Podczas tworzenia identyfikatora (i gdy jest to przewidziane schematem), możemy określić zarówno parametry ułatwiające dostęp do interesującej nas informacji lub nawet wskazać fragment, którym jesteśmy zainteresowani. Odpowiednio spreparowanym URI, wykorzystującym właściwy schemat, możemy w mgnieniu oka utworzyć szablon wiadomości e‑mail, nawiązać połączenie wideokonferencyjne z użytkownikiem w sieci Skype, połączyć się z serwerem FTP czy nawet przesłać opłatę w kryptowalucie (Bitcoin) na wskazany adres.
Zobacz do czego możesz wykorzystać poszczególne schematy URI na stronie Wikipedii.
tl;dr?
URI to taka elektroniczna wizytówka. Jeśli na wizytówce znajdziemy napis "tel: +48 123 123 123", to fragment "tel" nazwiemy schematem, który informuje nas o tym, co mamy zrobić z następującym po nim ciągiem znaków. Na numer telefonu raczej tradycyjnej kartki pocztowej nie wyślemy, możemy co najwyżej złożyć życzenia telefonicznie ;‑)
Dla każdego coś dobrego
Mnogość możliwych do wykorzystania akcji może z początku przytłaczać, później czujemy lekki niedosyt ("mogłoby być ich więcej..."), lecz po dłuższym zastanowieniu dojdziemy do wniosku, że jest ich dokładnie tyle ile trzeba, aby swobodnie realizować codzienne zadania. Program zadziała tak jak sobie tego zażyczysz, ale im większą wiedzę będziesz posiadał, tym lepsze uzyskasz rezultaty. Spikit pełen jest przy tym uniwersalnych mechanizmów, które możesz wykorzystać na Tobie tylko znany sposób, niekiedy zupełnie odmienny od pierwotnych założeń twórcy (patrz: Spikit w służbie czworonogom ) ;‑) To dobrze, gdy nowoczesne technologie pozwalają nam rozwiązywać problemy albo gdy ułatwiają nam naszą pracę. Ale głosowe uruchamianie programów/skryptów, sterowanie myszką, klawiaturą czy nawet zdolność do głosowego wyszukiwania treści w sieci, a także wbudowana "obsługa" zasobów przez możliwość operowania na URI to nie wszystko... Cortano i Siri - bójcie się!
Nadchodzi Spikit API. Tak to się robi w Polsce.