Niech się stanie kod, czyli rzecz o programowaniu głosem

Co jakiś czas można natrafić na artykuły wieszczące zmierzch stacji roboczych i laptopów oraz zwrot większości ich dotychczasowych użytkowników ku tabletom i innym urządzeniom dotykowym, pozbawionym takich zbędnych dodatków jak np. klawiatura i mysz. Zawsze gdy czytam tego rodzaju wiadomości, myślę sobie: „hola, hola, ale przecież grono osób intensywnie wykorzystujących standardowe klawiatury jest całkiem spore, a póki co nie zdobyły popularności żadne sensowne rozwiązania alternatywne”. Wybiegając jednak myślami w przyszłość potrafię wyobrazić sobie zdecydowaną redukcję użycia klawiatur w momencie gdy dojrzeje zestaw technologii znany pod nazwą sterowania za pomocą głosu.

Czy przyszłość jest głosowa?

Nie ma się przecież co oszukiwać, że użytkownicy dokonają całkowitej migracji z pełnowymiarowych klawiatur na malutkie, przez co często po prostu niewygodne, klawiatury smartfonów i tabletów. Czy jakikolwiek programista potrafi sobie zwizualizować jak wyglądałoby w takich warunkach rzeźbienie kodu? Fizyczna klawiatura, mimo że jest chyba najbardziej archaicznym z wykorzystywanych wciąż urządzeń wejściowych, wciąż pozostaje niezastąpiona. Wynalazki pokroju wirtualnych klawiatur (np. wyświetlanych na dowolnej płaskiej powierzchni, zob. zdjęcie poniżej) też nie upowszechniły się, bo jednak wygoda bezwzrokowego stukania w klawisze ukryte na półce pod biurkiem, mając przed sobą dwa lub trzy panoramiczne monitory jest nieporównywalna z wszystkimi innymi dostępnymi rozwiązaniami.

Wirtualna klawiatura (źródło: [1])

Czy zatem zmianą, którą przyniesie nam przyszłość jest wejście do mainstreamu sterowania za pomocą głosu? Sądzę, że jeśli działanie tej technologii osiągnie odpowiedni poziom niezawodności, pozwalający na przykład w całości stworzyć pisarzowi książkę (uwzględniając przy tym głosowe poruszanie się po tekście, poprawianie błędów, dokonywanie zmian i wstawianie znaków interpunkcyjnych w różnych miejscach), to jest to jak najbardziej możliwy scenariusz.

Programowanie przy użyciu głosu to jednak zagadnienie znacznie ciekawsze niż zwykłe dyktowanie tekstu. Po pierwsze kod źródłowy jest tekstem trudniejszym do przepisywania „ze słuchu” niż tekst literacki – zawiera różne rodzaje nawiasów, wcięcia na odpowiednich poziomach i wykorzystuje dość dużo znaków interpunkcyjnych. Po drugie bardzo istotna jest tu dokładność. LIterówka w kodzie, np. w nazwie zdefiniowanej już wcześniej zmiennej może mieć konsekwencje o wiele poważniejsze niż zgryźliwy uśmiech czytelnika – kompilator po prostu odmówi dalszego przetwarzania danych wejściowych.

Oznacza to, że wyzwania stojące przed twórcami środowisk programistycznych przeznaczonych do głosowego dyktowania kodu są całkiem zaawansowane. Można tu dostrzec ogromne pole do różnego rodzaju ułatwień i innowacyjnych rozwiązań, poczynając od prostego podpowiadania składni (bez którego nie wyobrażamy sobie przecież programowania, a gdy zamiast klawiatury używamy głosu, to musi się ono odbywać w jakiś inny sposób), aż po realizowane na wybranym poziomie dokładności poprawianie na bieżąco mówionego kodu. Powstaje też pytanie co sprawdzi się lepiej – dyktowanie kodu źródłowego słowo po słowie („if lewy nawias znak większości pięć prawy nawias…”), czy używanie bardziej zaawansowanych konstrukcji, przypominających raczej język naturalny? Np. „instrukcja warunkowa z warunkiem x większe od pięć i ciałem wywołaj funkcję pomoc„, czy nawet „jeśli x większe od pięć, to wywołaj funkcję pomoc„?

Wrażenia użytkowników

Odłóżmy jednak na bok moje prywatne dywagacje i spójrzmy jak technologia programowania głosowego prezentuje się na dzień dzisiejszy. W ostatnie wakacje natrafiłem na artykuł „Speaking in code: how to program by voice” dostępny na stronie internetowej magazynu Nature [2]. Autorka opisuje tam przede wszystkim przypadki osób, które zwróciły się ku kodowaniu głosem za sprawą swoich problemów zdrowotnych, takich jak RSI. Sytuacja życiowa po prostu wymusiła na nich zmianę sposobu pracy i wcale nie była to taka łatwa zmiana. Okazuje się, że rozpoczęcie programowania głosowego często bywa trudne i frustrujące. Ludzie potrzebowali nawet miesiąca lub dwóch, aby poczuć się w miarę komfortowo przy pisaniu programów głosem.

Bohaterowie artykułu dostrzegają też pewne wady wynikające z zastąpienia klawiatury głosem. Niektórzy z nich wyrażają tęsknotę za kodowaniem w ciszy lub przy dźwięku muzyki, albo po prostu swobodą gadania do siebie, włącznie z przeklinaniem na nieposłuszne oprogramowanie. Zwracają też uwagę na fakt, że omawiane aplikacje działają gorzej jeśli użytkownik posługuje się językiem angielskim z akcentem innym niż amerykańskim. Wydaje się jednak, że w oczach przedstawionych w artykule osób przeważają plusy programowania głosowego. Jedna z nich stwierdza nawet, że gdyby zdrowie znów pozwalało jej na używanie klawiatury, to i tak pozostała by przy kodowaniu przy pomocy głosu. Jedną z niewątpliwych zalet jest też możliwość wygodnego rozłożenia się przy biurku z nogami na blacie zamiast garbienia się nad klawiaturą.

Jeśli jesteście zainteresowani zobaczeniem jak programowanie głosowe wygląda w praktyce, to polecam obejrzeć nagranie z konferencji PyCon US 2013, na którym Tavis Rudd pokazuje swój setup oraz prezentuje swoją rozmowę z komputerem. Podobno wystąpienie to zainspirowało wiele osób, ukazując, że bez rąk też da się wydajnie programować:

Czego zatem potrzeba, aby rozpocząć zabawę z głosowym pisaniem kodu? Myślę, że podstawowa lista powinna wyglądać tak:

  • mikrofon
  • silnik rozpoznawania mowy
  • platforma do programowania głosowego
  • edytor/IDE

Oczywiście niektóre z powyższych rozwiązań można ze sobą łączyć, np. w postaci programu, który jest platformą do programowania przy pomocy głosu, ale implementuje też sam mechanizm rozpoznawania mowy, albo aplikacji, która zawiera w sobie dwa ostatnie z wymienionych tu elementów. Co do zasady można jednak uznać, że zazwyczaj występuje taki własnie podział.

Od razu przyznam się, że sam jeszcze nie wypróbowałem w praktyce programowania przy pomocy mowy i niniejszy artykuł jest jedynie zapisem mojego zdobywania wiedzy w zakresie samej teorii. Pisząc o konkretnych rozwiązaniach, będę zatem opierał się na opiniach innych, a nie własnym doświadczeniu. Jeśli mieliście już styczność z głosowym tworzeniem kodu, to zachęcam Was, abyście podzielili się swoimi opiniami, radami itd.

Dostępne rozwiązania

Ekspertem od hardware’u nie jestem, więc na razie powstrzymam się od rozprawiania o mikrofonach, które nadają się do programowania mową. Jedyne co mogę powiedzieć, to że w trakcie przymierzania się do korzystania z silników rozpoznawania mowy, spróbowałem przemawiać do komputera przy użyciu wbudowanego w mojego laptopa mikrofonu, a także za pośrednictwem mikrofonu zintegrowanego z słuchawkami (w cenie <100PLN) i wiem już, że na pewno nie tędy droga. Chcąc na poważnie programować w ten sposób po prostu trzeba wyposażyć się w bardziej poważny sprzęt w postaci niezależnego mikrofonu (widać to zresztą gdy zobaczy się jak wyglądają stanowiska developerów, zawodowo dyktujących kod źródłowy).

Jeśli chodzi o silniki rozpoznawania mowy, to zapewne większość osób miało już mniejsze bądź większe doświadczenie z nimi. Są one już od dłuższego czasu dostępne w naszych smartfonach i to zazwyczaj w postaci oprogramowania robiącego znacznie więcej niż samo rozpoznawanie mowy, gdyż zajmuje się ono również przetwarzaniem usłyszanego tekstu, aby zrozumieć jego sens (chodzi oczywiście o wirtualnych asystentów). Istnieją więc produkty rozwijane przez Google (Google Assistant, Google Cloud Speech-to-Text API), Apple (Apple Siri, Apple Speech API) czy Microsoft (Microsoft Cortana, Windows Speech Recognition). Zapewne rozwiązania wszystkich tych firm nadają się (z mniejszym lub większym wysiłkiem) do integracji z platformami do programowania głosowego, niemniej produkty od Google oraz Apple raczej nie są powszechnie wykorzystywane w tym celu (przynajmniej obecnie).

Rozwijany przez Microsoft silnik ma tę zaletę, że domyślnie dołączany jest wraz z najnowszymi wersjami systemu operacyjnego Windows, a zatem nie trzeba za niego dodatkowo płacić. Kilkukrotnie spotkałem się z opinią, że jest to drugie najlepsze jakościowo rozwiązanie jeśli chodzi o programowanie głosowe. Działa dość przyzwoicie, ale zdarzają się potknięcia i nieporozumienia przy słuchaniu ludzkiego głosu. Kto więc jest królem wśród silników rozpoznawania mowy? Wygląda na to, że na chwilę obecną nie ma żadnych wątpliwości co do tego, że najbardziej dojrzałym i najlepszym produktem w tej kategorii jest Dragon NaturallySpeaking. Trochę odstraszać może niestety jego cena, gdyż w wersji Home kosztuje aż 150$, przy czym niedostępny jest żaden trial, więc chcąc jedynie wypróbować Dragona trzeba normalnie go zakupić, a następnie skorzystać z możliwości 30-dniowego zwrotu. Wiele osób twierdzi, że Dragon NaturallySpeaking jest wart swojej ceny, ale sam nie odpowiem jeszcze na pytanie czy jest tak w rzeczywistości. Jeśli jesteście natomiast zwolennikami wolnego i otwartego oprogramowania, to warty uwagi jest podobno silnik rozpoznawania mowy o nazwie Kaldi

Ok, załóżmy, że jesteśmy już wyposażeni w dobrej jakości mikrofon oraz najczęściej polecany silnik rozpoznawania mowy, jakim jest Dragon NaturallySpeaking. Czy w końcu możemy zacząć programować? Oczywiście można spróbować to zrobić – Dragon pozwoli na to, by za pomocą głosu otwierać zainstalowane aplikacje (np. nasze ulubione IDE) i wpisywać do nich tekst. Mogę się jednak założyć, że napisanie w ten sposób jakiegokolwiek programu będzie na tyle trudne i uciążliwe, że szybko się poddacie. Potrzeba tu jeszcze bowiem bardzo ważnego klocka tej całej układanki – czegoś, co niejako połączy możliwości oprogramowania rozpoznającego mowę z edytorem, w którym tworzymy kod źródłowy. Tym czymś są platformy do programowania głosowego i akurat w tej kategorii wybór jest już całkiem spory:

  • Vocola (Voice Command Language) – język, służący do definiowania poleceń głosowych. Jest bezpłatny i występuje zarówno w wersji wspierającej Dragon NaturallySpeaking, jak i takiej, która obsługuje Windows Speech Recognition.
  • Dragonfly – pythonowy framework, pozwalający mapować komendy głosowe na wykonywane akcje. Podobnie jak Vocola wspiera oba najpopularniejsze silniki rozpoznawania mowy.
  • VoiceCode.io – komercyjna platforma do programowania głosowego dostępna wyłącznie na systemy Mac.
  • Talon – oprogramowanie dedykowane jedynie dla macOS (aczkolwiek wsparcie dla Linuksa i Windowsa jest zapowiadane na przyszłość), skupiające się na całości rozwiązań związanych z obsługa komputera bez użycia rąk – czyli nie tylko wykorzystaniem mowy, ale też np. eye-trackingiem. Jest oparte na Pythonie.
  • Aenea – narzędzie, które sprawia, że Dragonfly może wysyłać akcje z jednego komputera na drugi. Aenea wykorzystywana jest najczęściej do uruchomienia Dragon NaturallySpeaking na wirtualnej maszynie z Windowsem (bo tylko tę platformę systemową obsługuje ów silnik) i przesyłania akcji na system-hosta, którym jest Linux i na którym odbywa się development.
  • Silvius – open-sourcowy system do programowania przy pomocy głosu. Nie wymaga instalacji serwera na swoim lokalnym komputerze – użytkownik może pobrać jedynie klienta, który łączy się ze zdalnym serwerem, zajmującym się przetwarzaniem głosu. Silvius bazuje na darmowym silniku rozpoznawania mowy Kaldi.

Większość z powyższych platform jest language-agnostic, co oznacza, że działają one niezależnie od docelowego języka programowania. Pozwalają też na sporą dowolność w zakresie wyboru IDE/edytora.

Slap slap dash hello world

Najwyższy czas przejść do spraw bardziej technicznych i opowiedzieć trochę o tych dziwnych językach, skrótach i odgłosach, które wykorzystywane są do głosowej komunikacji z komputerem. Jeśli przynajmniej fragmentarycznie obejrzeliście video zamieszczone w pierwszej części tego artykułu, to być może zauważyliście, że występujący tam Tavis Rudd korzysta z zestawu w postaci Dragon NaturallySpeaking + zdefiniowana gramatyka w Dragonfly + spersonalizowany wedle własnych potrzeb edytor emacs. Rozmawiając z komputerem, Tavis nie przemawia żadnymi poetyckimi tekstami ani nie konstruuje pełnych zdań, prosząc, aby powstała pętla, czy wyrażenie warunkowe. Zamiast tego używa krótkich, jednosylabowych zbitek literowych, które prędzej można by żartobliwie nazwać pochrumkiwaniem.

Idea jest prosta – akcjom i symbolom innym niż alfanumeryczne należy przypisać krótkie wyrazy, najlepiej niewystępujące w języku angielskim lub rzadko się w nim pojawiające. W ten sposób Tavis skontruował większość używanych przez siebie poleceń, np.:

  • slap – nowa linia
  • dash some variable – tekst z pauzami, np. some-variable
  • scratch – backspace
  • late/rate – lewy/prawy nawias
  • ghin (od beginning) – skocz na początek, np. ghin word – początek wyrazu, ghin line – początek linii
  • aipper (od uppercase) – napisz wyraz wielkimi literami

Oczywiście każdy programista, który używa głosu do kodowania, tworzy swoje własne mapowania, będące dla niego najwygodniejsze, najłatwiejsze do zapamiętania czy najbardziej naturalne. Warto jednak przejrzeć wcześniej sposoby innych i zainspirować się co przydatniejszymi skrótami.

Warto też wspomnieć, że m.in. VoiceCode i Talon nie dokonują przetwarzania mowy (jak np. Google Assistant) tylko używają dokładnie tego, co powie użytkownik (lub bardziej precyzyjnie – tego, co zrozumieją jako powiedziane przez użytkownika), z tego też względu osoby bez typowego amerykańskiego akcentu mogą mieć, przynajmniej początkowo, problem z byciem odpowiednio zrozumianym przez program. Samo rozpoznawanie głosu jest natomiast ciągłe, co oznacza że programując nie trzeba robić żadnych pauz, aby oprogramowanie przetworzyło jakąś część powiedzianego tekstu.

Jeśli artykuł wzbudził Wasze zainteresowanie tematyką programowania przy pomocy głosu, to zachęcam do odwiedzania linków znajdujących się poniżej, które zawierają sporo przydatnych informacji dla początkujących. Liczę też, że ci, którzy podejmą się tego wyzwania, podzielą się później swoimi doświadczeniami. 😉 Na koniec zapraszam zaś do zapoznania się z jeszcze jednym przykładem kodowania mową, tym razem z użyciem open-sourcowych narzędzi:

Źródła

  1. Wikimedia Commons, autor: Piotr Waglowski
  2. Speaking in code: how to program by voice, A. Nowogrodzki
  3. Dragon NaturallySpeaking
  4. Kaldi – dokumentacja
  5. Vocola – oficjalna strona
  6. VoiceCode.io – dokumentacja
  7. Dragonfly framework
  8. Talon – oficjalna strona
  9. Aenea – GitHub
  10. Silvius
  11. FAQ on programming by voice
  12. ShortTalk: Dictation Made Rewarding
  13. State of Voice Coding — 2017