Röstkodning – En teknisk djupdykning med Martin

Martin - Inte längre datorvidrörare

Det har snart gått ett år sedan jag slutade använda tangentbordet för att programmera. Numera använder jag röststyrning för att interagera med datorn. Det var både ett svårt och ett lätt val att göra denna ändring: Ett svårt val då det är en enorm omställning och har en inlärningskurva likt en vertikal vägg men också ett lätt val då jag helt enkelt hamnade i en situation där jag inte hade något annat alternativ som inte riskerade min fysiska hälsa.

Ledhälsa

Av och till har jag haft problem med smärta i handleden. Detta påverkar mig i mitt arbete då det är svårt att programmera när man får ont av att använda tangentbordet, men det påverkar vardagen också. Saker man tar för givet att de är lätta att göra är plötsligt inte längre det. Saker som att bära något i handen, laga mat, cykla – plötsligt blir de saker man drar sig för att göra för att man har ont.

Med hjälp av fysioterapi och styrkeövningar fick jag smärtan att gå bort, men ett par år senare kom den tillbaka efter att jag överansträngt handleden i samband med ett arbete i lägenheten.

Jag bestämde mig att jag behövde göra en ändring för att minska hur mycket jag anstränger min handled på jobbet, så jag började titta efter alternativ. Jag hittade ganska snart ett program som heter Talon.

Talon

Talon är ett program som lyssnar efter röstinput i datorns mikrofon och utför kommandon på datorn baserat på vad man säger. Det kan vara saker som att diktera text, fokusera olika applikationer, scrolla i fönster, stänga och öppna flikar. Talon är extremt konfigurerbart och det är lätt att definiera sina egna kommandon via python-filer som Talon läser in. När man börjar med Talon rekommenderas man att ladda hem den så kallade Community-konfigurationen. Detta är en kodbas med python-filer som definierar de grundläggande kommandon man kan tänkas behöva för alla saker man vill kunna göra med datorn.

Community-konfigurationen kommer med en samling standardkommandon för att redigera text och kod. Det finns kommandon som go word rightclear linecopy word som man kan använda i en texteditor för att redigera kod. Ett problem man ställs inför med dessa kommandon är att de bara agerar på text där texteditorns pekare står. Det krävs därmed att man säger en hel del kommandon för att flytta sig runt mellan raderna och orden i källkoden man redigerar för att sedan utföra den redigering man vill göra. Med tangentbord och mus går detta ganska snabbt då det är bara att klicka där man vill redigera, med vim-kommandon (som jag använde innan jag började med Talon) kan man göra dessa förflyttingar ganska snabbt bara genom ett fåtal knapptryckningar. Det är här Cursorless kommer in och gör ens röststyrning till ett verktyg som (med lite övning) kan utklassa tangentbordet.

Cursorless

Cursorless är dels en samling python-filer som Talon läser in så att man som användare kan använda de röstkommandon som styr Cursorless, dels är det en plugin till ens texteditor. För tillfället finns denna plugin bara för VSCode, men teamet bakom Cursorless arbetar idogt med att generalisera dess arkitektur så att andra editors i framtiden också ska kunna användas med Cursorless. Idén med Cursorless är att varje ord som går att läsa i de filer man har öppna i sin editor ska kunna refereras till med max tre stavelser. Den åstadkommer detta genom att få din editor att se ut som platsen för någon sorts konfettirelaterad olycka.

Varje ord i källkoden tilldelas en hatt som står över ett av tecknen i det ordet. Varje ord går därmed att referera till genom att säga formen på hatten, färgen på hatten och det fonetiska namnet på bokstaven som hatten står över. Tillsammans bildar dessa tre ordets så kallade mål. Till exempel så har bokstaven g i ordet global en röd cirkel över sig och kan därmed refereras till genom att säga red gust. (gust är det fonetiska namnet på bokstaven g när man använder Community-konfigurationen.) Den runda hattformen har inget namn, så det utelämnas. På samma sätt kan man referera till ordet subprocess genom att säga fox sun. (fox är formen på hatten, sun är det fonetiska ordet för s och den grå färgen har inget namn så det utelämnas.) Som sista exempel så kan man referera till vänsterparantesen efter action_class på första raden genom att säga blue curve paren. (Hatten har både en färg och form.)

De vanligaste Cursorless-kommandon man använder är av formen {action} {mål}. Till exempel chuck red gustchuck i detta fallet är det talade ordet för att ta bort, och red gust är det vi vill ta bort. I exemplet ovan så skulle detta innebära att ordet global tas bort. Exempel på andra actions är bring ... to ... (skriv över ett mål med ett annat), pre (placera pekaren innan målet så att du kan skriva ny text där), define (navigera till definitonen av målet). Listan är mer än 50 actions lång, men man behöver bara använda sig av en handfull av dem i normala fall för att göra de mest vanliga redigeringarna.

Den stora styrkan hos Cursorless visar sig när man börjar diskutera vad Cursorless callar för scopes. Med hjälp av scopes kan du utvidga varje mål till att innefatta syntaktiska element som målet ingår i. Till exempel så refererar red fine till ordet if i exemplet. Genom att säga chuck if state red fine tar man inte bara bort ordet if utan hela if-satsen. chuck arg green odd kommer ta bort hela argumentet actions.user.clear_subtitles på näst sista raden även om green odd bara refererar till ordet actionschuck arg green odd and its previous arg åstadkommer samma sak men tar även bort argumentet innan. Det är nu som man börjar inse att Cursorless inte bara är några korta kommandon för att redigera ord, Cursorless i sig är ett domänspecifikt talat programmeringsspråk för att modellera källkodsredigering. Detta öppnar upp för ett helt annat tankesätt kring själva handlingen att redigera källkod, och det är något som jag numera finner mig själv sakna när jag inte har tillgång till Cursorless och röstprogrammering.

Som sista exempel på hur uttrycksfullt Cursorless kan vara har vi följande två kodrader:

Vi vill ta bort variablen foo och istället infoga dess värde direkt in i anropet till quux. Detta är genomförbart med att enbart ange ett enda specifikt mål, i det här fallet använder vi målet bat (fonetiska bokstaven b) som refererar till ordet bar i startexemplet. Resten av vår redigering sköts av scopes (valuename och line i detta fallet), instanser (som tillåter oss att referera till andra instanser av samma ord) och speciella markörer som source, som refererar till källan för den senaste gången vi kopierat något. Hela denna redigering kan vi utföra genom att säga:

bring value bat to next instance its name then chuck line source

Till en början kan sådana komplicerade kommandon vara svåra att att komma på och använda, men med övning så blir till och med detta en naturlig del av ens verktygslåda.

För vem är detta?

Mitt mål med denna introduktion till röstkodning är inte att alla som läser den omedelbart ska skaffa sig en mikrofon och börja röstkoda. Resan jag gjort är lång, det är mycket energi som lagts ner för att komma hit, mycket frustration och många irritationsmoment att ta sig förbi för att vänja sig med röststyrning. Men om du känner att något av detta passar in på dig, så tycker jag att du borde ge det ett försök.

  • Du har ont i lederna när du jobbar.
  • Du har begränsad användningsförmåga av armar och händer.
  • Du vill minska risken för problem med belastningsskador från användande av tangentbord och mus.
  • Du vill verkligen prova på att använda Cursorless.

Kom ihåg att dessa verktyg finns och att det är fullt möjligt att programmera i samma kapacitet utan tangentbord. Kanske du kommer bege dig ut på samma resa någon dag?

Jag önskar dig lycka till!
Martin
BIT ADDICT