Sissejuhatus

Kõnele on kõnetuvastusteenus Androidi rakendustele, mis võimaldab kõne abil sooritada infootsingut, kirjutada e-kirju ja märkmeid, anda käske jne.

  • Paljudes Androidi rakendustes on tekstikastid, millele vajutades avaneb klaviatuurirakendus. Kõnele sisaldab endas klaviatuurirakendust, mis võimaldab kõnesisendit.

  • Paljudes Androidi rakendustes on väike mikrofoninupp, millele vajutades eeldab rakendus kasutajalt mõnesekundilist kõnejuppi, mis automaatselt tekstiks teisendatakse. See mikrofoninupp on tihti seotud Androidi avatud kõnetuvastusliidesega, läbi mille on võimalik kasutada ka Kõnele poolt pakutud tuvastust.

  • Kui käivitada Kõnele otse, st mitte läbi teise rakenduse, siis suunatakse tuvastatud tekst (vaikimisi) edasi veebiotsingumootorile, või soovi korral (ümberkirjutusreeglite abil) nt kodurobotile.

Kõnele kasutab kõne tekstiks teisendamiseks ehk transkribeerimiseks TTÜ Küberneetika Instituudi foneetika ja kõnetehnoloogia laboris välja töötatud serveripõhist kõnetuvastustarkvara, mis on maailmas hetkel ainus, mis sisendina eesti keelt toetab. Samuti toetab see grammatikapõhist kõnetuvastust, lubades kasutajal täpselt defineerida, milliseid sõnu ja lauseid ta erinevates rakendustes kasutab.

Kuna Kõnele kasutab tööks veebiserverit, peab olema nutiseadmes internetiühendus sisse lülitatud. Sõltuvalt mobiilioperaatori teenusepaketist võib interneti kasutamise hind sõltuda andmemahtudest. Seega tasub teada, et pooleminutise kõne transkribeerimiseks laaditakse serverisse umbes 1 MB jagu andmeid. Wifivõrkudes on Kõnele kasutuskiirus tüüpiliselt oluliselt parem kui 3G jms võrkudes.

Järgnev juhend kirjeldab Kõnele seadistamist ja kasutamist eestikeelse kasutajaliidesega Android v5 (Lollipop) ja uuemates seadmetes. Androidi kasutajaliidese tõlge ja struktuur on seadmeti ja versiooniti mõnevõrra erinev, kuid mitte oluliselt.

Demovideod

  • Esimene video näitab (1) kõnepõhist veebiotsingut; (2) kõneklaviatuuri sisse lülitamist ja sellega kirja kirjutamist; (3) aadressiotsingut kaardirakenduses; (4) Kõnele konfigureerimist Androidi vaikimisi kõnetuvastajaks, ja selle kasutamist Google Translate rakenduses; (5) tõlkegrammatika omistamist Wolfram Alpha rakendusele, ja selles mõõtühikuteisendamist; (6) Arvutaja rakenduse kasutamist (vahelduseks inglise keeles) äratuskella seadmiseks. Video on tehtud Kõnele versiooniga 0.8.56, uuemates versioonides on kasutajaliides natuke muutunud. (Samuti, Arvutaja rakendust toetav teenus on praeguseks aegunud ning pole sellisel kujul enam kasutatav.)

  • Teine video näitab Kõnele paigaldamist Android v11 nutitelefoni, kus rakendusele mikrofoni kasutamise õiguse andmine on keerukam, ning kõnetuvastuskomponent tuleb paigaldada eraldi rakendusena Kõnele service. Video on tehtud Kõnele beetaversiooniga v1.7.42, teistes versioonides on kasutajaliides natukene teistsugune.

  • Kolmas video näitab Kõnele v1.7.xx lisatud nuppude funktsionaalsust: (1) mikrofoninupu svapidele saab ümberkirjutusreeglite läbi käske omistada; (2) sisselülitatud ümberkirjutusreeglid kuvatakse nuppudena, ja nii saab näiteks ise teha kalkulaatorirakenduse; (3) tekstikastis kopeeritud tekst salvestub tabelisse nimega “#c” (clipboard), ja nii saab hiljem pikemaid ja/või korduvaid tekste ühe nupuvajutusega taassisestada.

Kõnele kui iseseisev rakendus

Vajutades Kõnele käivitusikoonile (launcher icon) avaneb mikrofoninupuga paneel. Nupule vajutades teisendab Kõnele sisendkõne tekstiks ning edastab selle edasi seadme veebibrauserile.

Ekraanipilt: käivitusikoon. Ekraanipilt: mikrofoninupuga paneel. Ekraanipilt: lindistamine ja transkribeerimine. Ekraanipilt: transkribeerimine peale lindistamise lõppu. Ekraanipilt: valik tuvastustulemusi. Ekraanipilt: tuvastustulemus veebiotsinguna.

Ümberkirjutusreeglid võimaldavad tuvastustulemust muuta ning avada see muus rakenduses kui veebibrauser. Näiteks lisab järgmine reegel transkriptsioonile sõne , Estonia ning avab tulemuse kaardirakenduses.

Utterance<HT>Command<HT>Arg1<NL>
(.*)<HT>activity<HT>{"action":"android.intent.action.VIEW", "data":"geo:0,0?q=$1, Estonia"}

Antud juhul on reeglil kolm komponenti: regulaaravaldis, mis vastab lausungile (nt (.*) vastab suvalisele lausungile); käsk, mis käivitab rakenduse (activity) ning käsu argument (JSON struktuuriga kirjeldatud Androidi Intent, mis viitab $1 abil kasutaja sisendile). Komponente eraldab tabulaator (ülal tähistatud kui <HT>). Reeglifaili read on eraldatud reavahetusega (ülal tähistatud kui <NL>) ning esimene rida on päis. Ümberkirjutusreegleid käsitleb pikemalt eraldi peatükk.

Kõnele seadistamine

Ekraanipilt: seadistamine.

Mikrofoninupuga paneeli ülemises paremas nurgas on nupp, mis viib Kõnele seadetesse. Need võimaldavad Kõnele kasutajaliidest (st klaviatuuri ja otsingupaneeli) ja töökäiku erinevatel viisidel suunata, määrates nt

  • milliseid tuvastusteenusi ja -keeli kasutatakse;
  • kas/kuidas rakendada tuvastustulemusele tõlkegrammatikaid ja ümberkirjutusreegleid (vt allpool);
  • kas lindistamine algab automaatselt või peale nupule vajutamist.

Kõnele kaudu saab põhimõtteliselt kasutada kõiki seadmes olevaid kõnetuvastusteenusi, aga eriti on testitud kolme (eesti keele toetusega) teenust:

  • Kõnele teenus. Teenus tagastab tuvastustulemuse juba rääkimise ajal, ega sea sisendkõne pikkusele mingit piirangut. Kasutab serverit tarkvaraga http://github.com/alumae/kaldi-gstreamer-server, mis on vaba lähtekoodiga ja seega võib teenuse installeerida suurema kiiruse ja privaatsuse huvides kohtvõrku (vt peatükk Tuvastusserver koduvõrgus). Teenust sisaldav rakendus tuleb paigaldada eraldi.
  • “kiire tuvastusega” teenus. Sama, mis “Kõnele teenus”, aga installeerub Kõnele osana, st paigaldamine on lihtsam. Kahjuks pole kasutatav Android v11-12 seadmetes.
  • “grammatikatoega” teenus (kasutab serverit tarkvaraga http://github.com/alumae/ruby-pocketsphinx-server) lubab sisendkõnele omistada tõlkegrammatikaid, kuid on aeglasem ja sisendkõne pikkus ei tohi ületada 30 sekundit. Hetkel puudub selle tarkvara toetusega avalik server, st kasutamiseks tuleb paigaldada oma server.

Kui valitud on mitu keelt/teenust, siis on Kõnele mikrofoninupu juures lisaks keele/teenuse vahetamise nupp:

  • lühike vajus lülitab järgmisele keelele/teenusele,
  • pikk vajutus kuvab kõik võimalikud keeled/teenused, võimaldades valikut muuta.

Otsingupaneeli jaoks välja valitud keeled/teenused on saadaval ka otselinkidena (app shortcuts), alates Android v7.1. Otselingid avanevad kui näppu pikemalt Kõnele käivitusikoonil hoida, samuti võib otselingi teha ikooniks. Otselingi kaudu Kõnele käivitamisel, algab kõnetuvastus koheselt väljavalitud keeles/teenuses. See võimaldab mugavalt/kiiresti sooritada veebiotsingut erinevates keeltes. Järgmine video näitab veebiotsingu sooritamist eesti- ja siis ingliskeelse kõne abil, rakenduses “Niagara Launcher”, mis avab otselinkide paneeli, kui rakenduse ikoonil svaipida.

Ekraanivideo: otselingid.

Otselink on lihtne näide, kuidas käivitada Kõnele otsingupaneel sisendparameetritega, mille väärtused erinevad nendest, mis seadetes kirjas. Kõnele toetab palju erinevaid sisendparameeterid (nn EXTRA), mis võimaldavad teistel rakendustel (nt Tasker, vt eraldi peatükk) Kõnelega otse suhelda. Toetatud EXTRAte kohta vt täpsemalt Developer’s Guide.

Lisaks Kõnele oma seadetele, on Kõnelet võimalik konfigureerida kolmes Androidi süsteemses menüüs:

  • Androidi klaviatuuriseaded
  • Androidi kõnetuvastusteenuste seaded
  • Androidi kõnetuvastusrakenduste vaikeväärtused

Neist tuleb juttu allpool.

Kõnele klaviatuurirakendusena

Paljudes Androidi rakendustes on tekstikastid, millele vajutades avaneb klaviatuurirakendus, nn sisestusmeetod, inglise keeles “input method editor (IME)”. Kõnele sisaldab endas sellist klaviatuurirakendust, kuid erinevalt traditsioonilisest tähtede ja numbritega klahvistikust on Kõnele klaviatuuril ainult paar klahvi, ning kogu tekstisisestus toimub kõne abil.

Ekraanipilt: klaviatuur ja otsingurida. Ekraanipilt: klaviatuur ja märkmerakendus.

Seadistamine

Kõnele klaviatuuri kasutamiseks tuleb see ennem sisse lülitada Androidi süsteemses virtuaalklaviatuurimenüüs. Kui Kõnele klaviatuur pole sisse lülitatud, siis on Kõnele seadetes, esimesel kohal, ka otselink sellesse menüüsse.

Ekraanipilt: otselink klaviatuuri sisselülitamise menüüsse.

Androidi seadete hierarhias asub vastav menüü üsna sügaval, ning lisaks erineb selle asukoht Androidi versiooniti:

  • v5: Keeled ja sisestamine -> Klaviatuur ja sisestusmeetodid
  • v6-?: Täpsemad seaded -> Keel ja klahvistik -> Virtuaalne klaviatuur
  • v11-12: Süsteem -> Keeled ja sisend -> Ekraanil kuvatav klaviatuur -> Ekraanil kuvatavate klaviatuuride haldamine

Järgnevad ekraanipildid näitavad klaviatuuri seadistamist Androidis v5.

Ekraanipilt: Androidi sisestusmeetodite seadistamine. Ekraanipilt: Androidi vaikeklaviatuuri muutmine. Ekraanipilt: nimekiri sisselülitatud klaviatuuridest. Ekraanipilt: klaviatuuri sisselülitamine. Ekraanipilt: Kõnele on määratud vaikeklaviatuuriks.

Kasutamine

Kõiki sisselülitatud klaviatuure on võimalik paralleelselt kasutada — tekstikastile klikkides kuvatakse vaikeklaviatuur (“praegune klaviatuur”), kuid ekraani alumises nurgas asuva klaviatuurinupu (põhinuppude Back, Home, Recent apps kõrval) läbi saab seda jooksvalt muuta. Kõnele klaviatuuri ongi mõistlik kasutada paralleelselt mõne “tavaklaviatuuriga” (nt Gboard, Swype, SwiftKey, SlideIT). Kõnetuvastuse abil tekstide dikteerimine sobib peamiselt olukordadesse, kus keskkond on vaikne ja privaatne, ja tekst ei pea olema keeleliselt täiesti perfektne. Sellistes olukordades on kõnetuvastuse kasutamine reeglina kiirem ja loomulikum ning lisaks võtab kõneklaviatuur ekraanil vähem ruumi. Muudes olukordades võib ümber lülitada teisele klaviatuurile. Mõned klaviatuurid (nt FlorisBoard, ja Kõnele ise) võimaldavad klaviatuurivahetust ainult ühe (lühikese) nupuvajutusega. Nt, vajutades maakera-ikooni X klaviatuuril vahetub klaviatuur Kõnele vastu; vajutades klaviatuuri-ikooni Kõnele klaviatuuril, vahetub klaviatuur tagasi X klaviatuurile. Selles rotatsioonis võib osaleda ka rohkem klaviatuure, kui nad samamoodi vastavat Androidi klaviatuurivahetusliidest toetavad.

Ekraanipilt: traditsiooniline klaviatuur katab pool märkmerakendusest.

Kahetsusväärselt on selliste “koostööaltite” klaviatuuride hulk viimasel ajal vähenenud, nt Gboard, OpenBoard, jne. enam kiiret ümbervahetust “eelmisele” või “järgmisele” klaviatuurile ei võimalda, st maakera-ikoonile tuleb vajutada pikalt (või süsteemsele klaviatuurikoonile lühikeselt), pärast mida kuvatakse kõikide klaviatuuride valikumenüü.

Omadused

Klaviatuuripaneelil on 3 režiimi, mille vahel saab valida paneeli horisontaalselt väiksemaks ja suuremaks venitades. Paneeli kõrgus on jääb seotuks rakendusega.

  1. Keskmine (vaikimisi): mikrofoninupp ja kustutamisnupp. Vajutus mikrofoninupule käivitab/lõpetab/katkestab kõnetuvastuse. Lisaks toetab mikrofoninupp svaipimist ja pikalt/topelt vajutamist, mida saab kasutajadefineertud operatsioonidega siduda, vt Lausung kui nupuvajutus. Kustutamisnupp kustutab kursorist vasakul oleva sümboli või praeguse tekstivaliku.

  2. Väike: ainult nurganuppudega paneel. Ekraanipilt: ainult nurganupudega paneel.

  3. Suur: lausunginuppudega paneel, vt Lausung kui nupuvajutus. Ekraanipilt: lausunginuppudega paneel.

Paneeli nurganupud on kõikides režiimides valdavalt samad.

  • Vasak ülemine nurk: klaviatuurinupp:

    • lühike vajutus vahetab eelmisele klaviatuurile,

    • pikk vajutus vahetab järgmisele klaviatuurile.

  • Parem ülemine nurk: tekstivälja tüübist sõltuv “action” nupp, nt

    • otsinguväli: lühike vajutus sooritab otsingu,

    • üherealine tekstiväli (nt pealkirjaväli): lühike vajutus liigutab kursori järgmisele väljale,

    • tavaline mitmerealine tekstiväli: lühike vajutus lisab reavahetuse.

  • Parem alumine nurk (keskmises režiimis puudub): lihtne mikrofoninupp, millega saab kõnetuvastust väikses ja suures režiimis alustada ja lõpetada, kuid mida ei saa keskmise režiimi mikrofoninupule sarnaselt svaipida jms.

  • Vasak alumine nurk: keele/teenuse vahetamise nupp/nupud, mis sõltub aktiveeritud keelte/teenuste arvust:

    • 1 keel/teenus: nupp puudub;

    • 2 keelt/teenust: lühike vajus lülitab teisele keelele/teenusele, pikk vajutus kuvab kõik võimalikud keeled/teenused, võimaldades valikut muuta;

    • 3+ keelt/teenust: iga keele/teenuse jaoks on omaette nupp, millele lühike vajutus teenuse sisse lülitab. Nuppude siltideks on keelte/teenuste lühendid. Nupul pikalt vajutades kuvatakse keele/teenuse täisnimi. Vajutus plussmärgiga nupule kuvab kõik võimalikud keeled/teenused, võimaldades valikut muuta.

Paneeli svaipoperatsioonid on kõikides režiimides samad, kuid keskmises režiimis on nende jaoks rohkem paneelipinda.

  • lühike vajutus tühistab praeguse tekstivaliku,

  • topeltvajutus lisab tühiku,

  • svaip vasakule liigutab kursori vasakule (svaip vasakule üles teeb sama kiiremini),

  • svaip paremale liigutab kursori paremale (svaip paremale alla teeb sama kiiremini),

  • pikk vajutus valib kursori all/kõrval oleva sõna ning siseneb valiku-režiimi, kus svaibid muudavad valiku ulatust,

  • pidev vajutus klaviatuuri vasakule äärele liigutab kursorit vasakule,

  • pidev vajutus klaviatuuri paremale äärele liigutab kursorit paremale.

Kõnele kutsumine teistest rakendustest

Koos kasutajaliidesega

Mõnes rakenduses (nt Google Keep) on mikrofoninupp, millele vajutades kutsutakse välja kõnetuvastusteenust pakkuv rakendus, koos oma kasutajaliidesega (nn RecognizerIntent). Kõnele puhul on selleks ülal kirjeldatud mikrofoninupuga paneel. Teisest rakendusest välja kutsutuna ei edastata Kõnele tuvastustulemust veebibrauserile, vaid tagastab kutsuvale rakendusele (nt Google Keep), mis siis sellega edasi toimetab.

Kui seadmes on mitu erinevat kõnetuvastusteenust (üheks on tavaliselt Google’i rakendus), siis palub Android kõigepealt valida, millist neist kasutada. Valitud teenuse võib määrata ka vaikimisi valikuks (ALATI).

Ekraanipilt: mikrofoninupuga märkmerakendus. Ekraanipilt: tuvastusteenust pakkuvate rakenduste valik. Ekraanipilt: Kõnele otsingupaneel märkmerakendusele tuvastusteenuse pakkujana.

Juhul kui valikuvõimalust ei tekkinud, st valikudialoogiakent ei kuvatud ning kohe käivitus nt Google’i rakendus, siis järelikult oli see määratud vaikimisi tuvastajaks. Sellise vaikeväärtuse saab eemaldad nõnda:

  • Minge Seaded -> Rakendused
  • Valige tab Kõik
  • Otsige nimekirjast üles “Google’i rakendus”
  • Vajutage nupule Kustuta vaikeväärtused

Taustateenusena

Androidi rakendused võivad kõnetuvastusteenuse välja kutsuda ka taustateenusena, st ilma kasutajaliideseta. Nõnda toimivad paljud mikrofoninupuga klaviatuurirakendused ning intelligentsed abilised, mis hoolitsevad ise kogu kasutajaliidese eest (mikrofoninupp, helisignaalid, VU-meeter, veateadete kuvamine jms). Selliselt kutsutavad teenused on kirjas süsteemses Häälsisend-menüüs, kus üks neist on alati seatud vaikimisi teenuseks. (Android v4-5: Seaded -> Keeled ja sisestamine -> Kõne -> Häälsisend; Android v6-7: Seaded -> Rakendused -> Rakenduste seadistamine (hammasrattaikoon) -> Vaikerakendused -> Abirakendus ja häälsisend -> Häälsisend; Kõnele seadetes on ka otsetee Kõnetuvastusteenused (süsteemsed seaded).)

Ekraanipilt: nimekiri paigaldatud tuvastusteenustest.

Ühe Kõnele teenustest võib seada vaikimisi teenuseks. See ei garanteeri küll kahjuks, et kõik rakendused hakkavad nüüd kõnetuvastuseks Kõnelet kasutama, sest paljud neist ignoreerivad kasutajamääratud vaikeväärtust ja kasutavad endiselt nt Google’i teenust. Selline on olukord paljude klaviatuurirakendustega, milles oleva mikrofoninupu vajutamine käivitab Google’i kõnetuvastusteenuse, ning seda muuta pole võimalik. Üheks erandiks on SlideIT Keyboard, mida saab konfigureerida Kõnelet kasutama. Hea ülevaade parimatest klaviatuurirakendustest (eesti keeles kirjutamise seisukohast) on ajakirjas [digi] 5/2014.

Huvitav olukord on Google’i tõlkerakendusega (Google Translate), mis kasutab kõnetuvastuseks üldiselt Google’i tuvastajat, kuid keelte jaoks, mida see ei toeta (nt eesti keel) kasutab vaikimisi määratud kõnetuvastusteenust. Seega saab Kõnele ja Google’i tõlkerakendusega teha kõnest-kõnesse tõlget eesti keelest paljudesse teistesse keeltesse. (Alates dets. 2018 enam ei toimi, sest Google (arvab, et) oskab ise eestikeelset kõne tuvastada, ning Translate pole seega teistele tuvastajatele avatud. Lahenduseks võib olla Google’i tuvastaja telefonist eemaldamine. Samuti toimib endiselt teksti sisestamine Kõnele klaviatuuri abil.)

Android v6 on lisanud nn “Abirakenduse” mõiste, kuid kui abirakenduseks on valitud Google’i rakendus, siis valikut Häälsisend ei kuvata, ning Kõnele rakendust vaikimisi teenuseks seada ei saa. Üheks kahetsusväärseks tagajärjeks on see, et nüüd puudub võimalus korraga kasutada funktsionaalsust “Google Assistant” ja eestikeelset kõnesisendit rakenduses Google Translate. (Vt ka vearaporteid 200494 ja 200496.)

Ümberkirjutusreeglid

Ümberkirjutusreeglid on Kõnele kasutaja poolt loodavad reeglid tuvastusteenuse poolt tagastatud transkriptsiooni jooksvaks muutmiseks, ja sellele käskude rakendamiseks. Vaata/paigalda ümberkirjutusreegleid.

Ümberkirjutusreeglid võimaldavad

  • sisestada halvasti tuvastatavaid sõnu (nt pärisnimesid), ja parandada muid tuvastaja võimalikke puudujääke (autopunktsiooni puudumine, emotikonide toe puudumine, jms);
  • sisestada tekste, mis ei kipu meelde jääma, või mida ei taha tuvastajale avaldada (nt telefoninumbrid, aadressid, kontonumbrid);
  • sisestada korduma kippuvaid pikemaid tekste;
  • käivitada teisi Androidi rakendusi;
  • rakendada tekstitoimetuskäske juba sisestatud teksti muutmiseks.

Kõnele laeb ümberkirjutusreeglid lihtsast tabelikujulisest tekstifailist, nn TSV-failist, kus veerueraldajaks on tabulaator ja reaeraldajaks reavahetussümbol. Kõnele toetab järgmisi veerge (muid ignoreerib):

  • Utterance Regulaaravaldis kõnesisendi tuvastamiseks, st lausungimuster, millele vastab üks või rohkem võimalikku kõnesisendit. Võib sisaldada alamgruppe (nn capturing group), mis on tähistatud sulgudega () ja viiteid nendele (tähistatud \1, \2, …).
  • Replacement Asendustekst. Võib sisaldada viiteid Utterance gruppidele (tähistatud $1, $2, …).
  • Locale Regulaaravaldis keele/riigi (nn locale) kirjeldusega (nt et, en-US).
  • Service Regulaaravaldis tuvastusteenuse Java klassi nime kirjeldusega.
  • App Regulaaravaldis rakenduse paki nime kirjeldusega, milles Kõnelet kasutatakse.
  • Comment Rida kirjeldav kommentaar.

Igale reale vastab üks reegel, ning ridade järjekord määrab reeglite rakendamise järjekorra. Nõnda saavad allpool olevad reeglid ära kasutada eelnevate reeglite ümberkirjutusi. Veergude järjekord pole oluline. Kohustuslik veerg on ainult Utterance. Kui Replacement puudub, siis on asendustekst alati tühisõne. Veerud Locale, Service ja App määravad, millise keele, tuvastusteenuse, ja rakenduse puhul on reegel aktiivne. Kõik regulaaravaldised on Java regulaaravaldised. Põhjalik regulaaravaldiste õpetus on nt http://www.regular-expressions.info.

Veergude tüübid on määratud esimesse ritta (nn päisesse) kirjutatud ingliskeelse märksõnaga (“Utterance”, “Replacement”, jne). Kui päis puudub (st esimene rida ei sisalda kohustusliku veeru nime “Utterance”), siis arvestatakse ainult tabeli esimest kahte veergu ning interpreteeritakse neid kui Utterance ja Replacement veerge. Kui tabelil on ainult üks veerg, siis on Replacement alati tühisõne. Seega, kõige lihtsam tabel koosneb ainult ühest sümbolist, nt a (kustuta kõik “a” tähed).

Näide. Lihtne (eestikeelne) ümberkirjutusreegel. Küsimärk lausungimustris määrab igaks juhuks, et tühik on lausungis valikuline. Nõnda ei sõltu reegli rakendmine sellest, kuidas tuvastaja sõnu kokku/lahku kirjutab.

  • Locale = et
  • Utterance = minu lemmik ?matemaatiku ?nimi
  • Replacement = Srinivasa Ramanujan

Näide. Pikema teksti sisestamine. Märgid ^ ja $ nõuavad, et lausung vastaks mustrile algusest lõpuni. Asendustekstis olevad \n märgid tähistavad reavahetust, ning nurksulud on lisatud selleks, et hiljem oleks lihtsam tekstis veel täitmist vajavate osade juurde navigeerida (nt käsuga “vali klambrid”).

  • Locale = et
  • Utterance = ^vastuse vorm müügipakkumisele$
  • Replacement = Lugupeetud []\n\nTäname Teid, et vastasite meie pakkumisele.\n\nLugupidamisega\nHeikki Papper\nmüügijuht

Näide. Keelest sõltumatu reegel, mis tuvastab lausungis kahe järjestikuse sõna kordumise (nt “eks ole eks ole”), ja eemaldab korduse. Muster [^ ]+ [^ ]+ kirjeldab ühte tühikut sisaldavat sõne (st kahte sõna) ja sulud selle ümber teevad ta viidatavaks \1 ja $1 abil.

  • Utterance = ([^ ]+ [^ ]+) \1
  • Replacement = $1

Käsud

Käskude sidumiseks lausungiga tuleb kasutada kuni kolme lisaveergu:

  • Command Käsu nimi (ingliskeelne märksõna).
  • Arg1 Käsu esimene argument (valikuline).
  • Arg2 Käsu teine argument (valikuline).

Argumendid võivad sisaldada viiteid Utterance gruppidele ($1, $2, …).

Näide. Eestikeelne kõnekäsk (nt ärata mind kell 8 0 5 mine tööle) äratuskella helisema panemiseks. Reegel eraldab lausungist vajalikud argumendid (tundide arv 8, minutite arv 5, täpsustav kommentaar mine tööle) ning loob nende põhjal JSON-struktuuri. Käsk activity püüab interpreteerida seda struktuuri kui Androidi Intent kirjeldust. Kui see õnnestub, siis püüab leida Intent‘ile vastava rakenduse ning selle käivitada.

  • Locale = et
  • Utterance = ^ärata mind(?: palun)? kell (\d+) (?:0 )?(\d+)\s*(.*)$
  • Command = activity
  • Arg1 =
         {
             "action": "android.intent.action.SET_ALARM",
             "extras": {
                 "android.intent.extra.alarm.HOUR": $1,
                 "android.intent.extra.alarm.MINUTES": $2,
                 "android.intent.extra.alarm.MESSAGE": "$3",
                 "android.intent.extra.alarm.SKIP_UI": true
             }
         }

(Loetavuse huvides on Arg1 näites kasutatud reavahetusi. Reeglitabelis eraldab reavahetus reegleid, seega ei tohi ükski tabelilahter reavahetussümbolit sisaldada.)

Tekstitoimetuskäsud

Tekstitoimetuskäsud on käsud, mida saab kasutada ainult koos Kõnele klaviatuuriga. Need võimaldavad toimetada juba olemasolevat teksti käed vabalt (st ainult kõne abil), nt kursori liigutamist teksti sees ja väljade vahel (nt selectReBefore, keyUp, imeActionNext), sõnade/lausete valimist ja asendamist (nt select, selectReAfter, replace), operatsioone valikuga (nt replaceSel), lõika/kleebi/kopeeri operatsioone, Androidi IME käske (nt imeActionSend). Enamikku käskudest on võimalik tagasi võtta (undo), mitu korda rakendada (apply), ja isegi kombineerida (combine). Argumendid võivad viidata parasjagu aktiivse valiku sisule funktsiooniga @sel(). Kursoriliigutamiskäskude puhul, mille argumendiks on regulaaravaldis (..Re..), määrab selle esimene alamgrupp kursori uue asukoha. Vt ka kõikide tekstitoimetuskäskude nimekiri.

Näide. (Eestikeelne) kõnekäsk lisamaks valitud tekstilõigu ümber nurksulud. Muid sõnu väljundisse ei lisata, kuna Replacement on tühisõne.

  • Locale = et
  • Utterance = lisa ?klambrid
  • Replacement =
  • Command = replaceSel
  • Arg1 = [@sel()]

Näide. (Eestikeelne) kõnekäsk “saatmisnupu” vajutamiseks Google’i rakendustes Hangouts (mille pakinimi sisaldab sõne “talk”) ja Allo (“fireball”). Lausungimuster sisaldab suvalist teksti .*, mida eraldab käsust saada ära sõnapiir \b. Ennem käsu (imeActionSend) täitmist lisatakse tekst väljundisse.

  • Locale = et
  • App = google.*(talk|fireball)
  • Utterance = (.*)\bsaada ära
  • Replacement = $1
  • Command = imeActionSend

Näide. (Eestikeelne) kõnekäsk, mis rakendab lausele vastavat mustrit (st sõne, mis algab ja lõpeb lauselõpumärgiga) kursorile järgnevale tekstile, ning liigutab kursori mustri teise esinemise keskele (pärast lauselõpu märki ja valikulist tühikut).

  • Locale = et
  • Utterance = mine ülejärgmise lause algusesse
  • Command = selectReAfter
  • Arg1 = [.?!]\\s*()[^.?!]+[.?!]
  • Arg2 = 2

Lausung kui nupuvajutus

(Alates Kõnele v1.7.28)

Mõningaid toimingud on mõistlikum kõneliidese asemel nuppudele vajutades läbi viia (klaveri mängimine, liftis korruse valimine, jms). Lisaks eelkirjeldatud nuppudele (“action” nupp, kustutamisnupp, …) ja kursori liigutamisele Kõnele paneelil, toetab Kõnele puutetundlikust veel kahel moel, mis on mõlemad tihedalt reeglistikega seotud.

Esiteks genereerib Kõnele mikrofoninupp lausungeid kujul nt K6_Y_BTN_MIC_RIGHT, kui seda svaipida (UP, DOWN, LEFT, RIGHT), kahekordselt vajutada (DOUBLETAP), või pikalt vajutada (LONGPRESS). Samuti sõltub genereeritud lausung nupu olekust: kollane (Y) või punane (R). Reeglid võimaldavad (juba eelkirjeldatud moel) siduda käske selliste mikrofoninupupuudutustega.

Näide. Paremele svaip postitab sõnumirakenduses tekstiväljal parasjagu oleva teksti.

  • App = (talk|fireball|teams)
  • Utterance = ^K6_._BTN_MIC_RIGHT$
  • Command = imeActionSend

Teiseks on võimalik kõiki aktiivseid reegleid nuppudena kuvada. Ühest küljest annab see parema ülevaate, millised reeglid on antud kontekstis (rakenduses, keeles, teenuses) aktiivsed. Kuid lisaks saab nüüd reegleid nupuvajutusega käivitada. Ning võib disainida reeglistikke, mida polegi plaanis kõne abil käivitada (PIN-koodi sisestamispaneel, lemmik emotikonid, kalkulaator, jms). Lisaveerg Label määrab nupu ikooni.

Näide. Nupp emotikoni sisestamiseks.

  • Utterance = ^button_001$
  • Command = replaceSel
  • Arg1 = 🙂
  • Label = 🙂

Nupud laotakse ekraanile kolmes veerus ja iga reeglistik on eraldi tabis. Allolev ekraanipilt näitab võimalikku kalkulaatoridisaini.

Ekraanipilt: klahvistik Kalkulaator.

Reeglite tegemine ja paigaldamine

Reeglifaili loomiseks ja salvestamiseks sobib iga tabelarvutusprogramm. Nt Google’i Arvutustabelid (Google Sheets) võimaldab selliseid tabeleid luua nii lauaarvutis kui ka mobiiliseadmes, ning siis erinevate seadmete ja kasutajate vahel TSV-kujul jagada. Faili laadimiseks Kõnele rakendusse on erinevaid võimalusi:

  • Kõnele menüüvalik “Ümberkirjutusreeglid” avab nimekirja olemasolevatest reeglistikest. Seal on Lisa-nupp (plussmärk ringi sees), mis avab failibrauseri, mille abil tuleb soovitava TSV-faili juurde navigeerida ning sellele klikkida. Reeglifail peab sel juhul seadme failide hulgas juba olema.
  • Veebibrauseris klikkida TSV-laiendiga veebilingile (proovi nt seda linki), mille tulemusena fail seadmesse laaditakse, ja avaneb võimalus sellele klikkida ja see Kõneles avada. See protsess on erinevates brauserites mõnevõrra erinev.
  • Veebibrauseris klikkida k6-prefiksiga lingile (proovi nt PAIGALDA-linki sellel lehel). Sel juhul on kogu tabel salvestatud lingi sisse ning veebibrauser annab selle klikkimisel kohe edasi Kõnelele. Paigaldamiseks on see viis kõige lihtsam, aga reeglifaili loomisel lisandub k6-lingiks tegemise samm (nt Pythonis: 'k6://' + base64.urlsafe_b64encode( faili_sisu )).
  • Juhul kui tabelarvutusrakenduses (Google Sheets, Microsoft Excel, …) on failijagamismenüü, kus saab tabeli eelnevalt teisendada TSV-kujule (kõigis kahjuks pole), siis saab tulemuse otse jagada Kõnelega. See on kõige lihtsam viis, juhul kui reegleid on vaja pidevalt (endal) muuta.
  • Kõnele seadete muutmine Kõnele alamrakendusega GetPutPreferenceActivity, nt ADB abil (vt näidet siin). See sobib olukordadesse, kus on vaja paigaldada/uuendada korraga mitut reeglifaili. Samuti on see hetkel ainuvõimalik meetod nutikellal ja Android Things seadmetel.

Reeglifaili kasutamiseks tuleb see eelnevalt aktiveerida. Kui mitu faili on aktiivsed, siis neid rakendatakse tähestikujärjekorras.

Järgnevad ekraanipildid näitavad faili jagamist rakenduses Google’i Arvutustabelid, menüüde “Jagamine ja eksportimine” ja “Saada koopia” abil.

Ekraanipilt: ümberkirjutusreeglid tabelarvutusrakenduses. Ekraanipilt: ümberkirjutusreeglite jagamine menüüvalikuga 'Jagamine ja eksportimine'. Ekraanipilt: ümberkirjutusreeglite jagamine menüüvalikuga 'Saada koopia'. Ekraanipilt: ümberkirjutusreeglite teisendamine TSV-formaati. Ekraanipilt: ümberkirjutusreeglite importimine Kõnele rakendusse. Ekraanipilt: imporditud ümberkirjutusreeglite nimekiri.

Reeglid kui liides dialoogisüsteemile

Olgugi, et ümberkirjutusreeglite abil saab luua lihtsamaid dialoogisüsteeme, on reaalsete süsteemide (allpool “robot”) loomisel mõtekam kasutada siiski võimsamaid vahendeid loomuliku keele töötluseks ning suhtluseks teiste seadmetega. Sellisel juhul oleks Kõnele lihtsalt transkriptsiooniteenuse pakkuja, st robot ei peaks oskama ise kõne tuvastada.

Järgmine reegel (mille peaks salvestama reeglistikku nimega “Robot”) saadab fraasiga “hei Robot” algava päringu edasi kohtvõrku installeeritud veebiliidesega robotile:

  • Utterance = ^hei Robot (.+)$
  • Command = activity
  • Arg1 =
    {
      "component": "ee.ioc.phon.android.speak/.activity.FetchUrlActivity",
        "data": "http://192.168.0.11:8000/?lang=et-EE&q=$1",
        "extras": {
          "ee.ioc.phon.android.extra.RESULT_LAUNCH_AS_ACTIVITY": true
        }
    }

Nt kui kasutaja ütleb “hei Robot mängi Ivo Linnat”, siis jõuab robotile päring “mängi Ivo Linnat”, mida robot peab ise edasi analüüsima ja sellele seejärel kuidagi reageerima.

Juhul kui robot tahab küsida jätkuküsimusi, siis peaks ta päringule vastama umbes sellise JSON struktuuriga.

{
"component": "ee.ioc.phon.android.speak/.activity.SpeechActionActivity",
"extras": {
    "ee.ioc.phon.android.extra.VOICE_PROMPT": "Mis laulu?",
    "android.speech.extra.MAX_RESULTS": 1,
    "android.speech.extra.LANGUAGE": "et-EE",
    "ee.ioc.phon.android.extra.AUTO_START": true,
    "ee.ioc.phon.android.extra.RESULT_UTTERANCE": "(.+)",
    "ee.ioc.phon.android.extra.RESULT_REPLACEMENT": "hei Robot $1",
    "ee.ioc.phon.android.extra.RESULT_REWRITES": ["Robot"]
  }
}

Kõnele komponent FetchUrlActivity käivitab sellise vastuse peale Kõnele otsingupaneeli, mis ütleb läbi Androidi kõnesüntesaatori “Mis laulu?”, lindistab kasutaja kõnesisendi, ning lisab transkriptsioonile prefiksi “hei Robot”, tagades nõnda, et tulemus saadetakse jälle roboti veebiliidesele.

Nõnda on võimalik pikem käed-vaba dialoog robotiga, kus Kõnele roll on olla lihtsalt kõnetuvastaja, ning muud ülesanded (nt loomuliku keele analüüs, eelneva dialoogi mäletamine, teadmised kasutaja profiilist, suhtlemine teiste seadmetega) on roboti kanda.

Grammatikapõhine kõnetuvastus

(Eeldab grammatikatoega teenuse kasutamist)

Kõnele võimaldab igale Androidi rakendustele, mis on Kõnele vähemalt ühe korra välja kutsunud omistada tõlkegrammatika. Grammatika omistamisel rakendusele on sisuliselt kaks funktsiooni:

  • deklareerimine, et ainult teatud laused ja sõnavara omab vastava rakenduse kontekstis mõtet, nt mõõtühikute teisendamise rakendus võiks toetada fraase nagu “kaks meetrit jalgades” kuid peaks välistama fraasid nagu “mis ilm on tartus” või “kolm meetrit ruutmeetrites” (viimane kasutab küll õiget sõnavara, kuid teeb seda semantiliselt valel moel). Kui kõnetuvastusserverile sel viisil grammatika esitada, siis on väiksem tõenäosus, et tuvastamisel tehakse viga;
  • tuvastustulemuse “tõlkimine” kujule, mis sobib vastavale rakendusele paremini, nt mõõtühikute teisendamise rakendused eeldavad tüüpiliselt inglise keelest, numbritest ja SI ühikutest/prefiksitest koosnevat sisendit, st “convert 100 m/s to km/h”, mitte eestikeelset “kui palju on sada meetrit sekundis kilomeetrites tunnis”.

Sellised grammatikad ei kata loomulikku keelt (nt eesti keelt) tervikuna, vaid ainult selle mingit piiratud alamosa. Nt lauseid mõõtühikute või valuutade teisendamise kohta, aritmeetika avaldiste keelt, aadressipäringute keelt jne.

Iga grammatika on esitatud HTTP-veebiaadressina (nt http://kaljurand.github.com/Grammars/grammars/pgf/Action.pgf), mis tuleb eelnevalt serveris registreerida. Kõnele seadetes, menüüs “Grammatikad” on loend juba registreeritud grammatikatest. Grammatika omistamiseks rakendusele tuleb sellele “Rakendused” loendis pikalt vajutada (long tap).

Vaatleme näitena grammatikapõhist tuvastust rakenduse Google Now otsingureal. See rakendus võimaldab loomulikus keeles antud sisendi põhjal teha erinevaid toimingud (äratuskella helisema panemine, aadressiotsing, mõõtühikute teisendamine, jms), kuid eesti keelt sisendina ei toeta, st eestikeelse sisendi puhul sooritatakse pelgalt veebiotsing. Sisendi saab anda otse kõne abil, kuid sel juhul oskab Google Now kasutada ainult Google’i kõnetuvastajat. Õnneks on sisend võimalik ka klaviatuurilt ning kasutada võib ükskõik millist klaviatuuri, sh ka Kõnele kõneklaviatuuri. Järgmised pildid näitavad valuuta konverteerimist, kus sisend (“kaksteist tuhat kolmsada nelikümmend viis norra krooni eurodes”) jooksvalt Google Now-le arusaadavale kujule (“convert 12345 NOK to EUR”) teisendatakse.

Ekraanipilt: dikteerimine otsingureal. Ekraanipilt: transkriptsioon on teisendatud formaalseks avaldiseks. Ekraanipilt: avaldisele vastav Google'i otsingutulemus.

Selleks, et see nii töötaks peab kõneklaviatuuril olema sisse lülitatud “eesti keel/grammatikatoega”. Samuti, peab Google Now rakendusele (“com.google.android.googlequicksearchbox”) omistama Action-grammatika. (Seda omistust kasutab ainult grammatikatoega teenus, muude teenuste puhul seda ignoreeritakse.)

Ekraanipilt: Kõnele seaded. Ekraanipilt: Kõnele teenuste ja keelte valik. Ekraanipilt: nimekiri rakendustest ja nendele vastavatest grammatikatest.

Olemasolevate grammatikate kohta on võimalik lugeda aadressil http://kaljurand.github.io/Grammars/ ning nende registreerimine ja kasutamine grammatikatoega serveris on kirjeldatud lehel http://bark.phon.ioc.ee/speech-api/v1. Vt ka rakendust Arvutaja, mis kasutab Kõnelet grammatikatoega kõnetuvastajana.

Kõnele nutikellal

Ekraanipilt: Kõnele nutikella klaviatuurina.

(Eksperimentaalne)

Kõnele toimib peaaegu kogu oma võimaluste ulatuses ka nutikellal, kuigi selle kasutajaliidest pole nutikella väiksele ekraanile veel kohandatud. Paigaldamist, seadistamist ja peamiseid kasutusnäiteid kirjeldab (inglise keeles)

https://github.com/Kaljurand/K6nele/tree/master/docs/android_wear.

(Hetkel pole võimalik Kõnelet otse Google Play poest kellale paigalda, selleks tuleb kasutada ADB programmi.)

Kõnele ja Android Things

Ekraanipilt: riistvara: Raspberry Pi, mikrofon, kõlar, monitor (valikuline)

(Eksperimentaalne)

Kõnele toimib ka Android Things platvormil, nt Raspberry Pi riistvaral. Paigaldamist, seadistamist ja peamiseid kasutusnäiteid kirjeldab (inglise keeles)

https://github.com/Kaljurand/K6nele/tree/master/docs/android_things.

Kõnele ja Tasker

(Eksperimentaalne)

Rakendus Tasker võimaldab erinevaid nutiseadmetoiminguid automatiseerida. Järgnevalt mõned Taskeri käsud (nn “task”), mis käivitavad Kõnele otsingupaneeli, kuid defineerivad üle mõned selle sisendparameetritest (nn EXTRA). Käskude importimiseks Taskerisse (vajalik v5.5+) tuleb klikkida allolevatele linkidele.

  • K6 autostart käivitab Kõnele EXTRAga AUTO_START=true, st sisendkõne lindistamine algab automaatselt.
  • K6 send käivitab Kõnele EXTRAtega AUTO_START=true, MAX_RESULTS=1, RESULT_REWRITES="Send", st lindistamine algab automaatselt, tagastatakse ainult üks transkriptsioon, ning sellele rakendatakse ümberkirjutusreeglistikku “Send”.
  • K6 lights käivitab Kõnele EXTRAtega AUTO_START=true, MAX_RESULTS=1, RESULT_REWRITES=["Lights","Lights.Hue"] ja PROMPT="💡", kuid vajab lisaks Taskerile selle pluginit IntentTask, et kasutada rohkem kui 3 EXTRAt ja mitut ümberkirjutustabelit.

(Selliste, taskertask-protokolliga linkide klikkimiseks e-kirjas või sotsiaalmeedias võib olla vajalik teisendada nad kujule, mis algab protokolliga “http(s)”, nt https://tinyurl.com/y773oej9.)

Käskude käivitamiseks on mitmeid võimalusi, nt võib Taskeris defineerida käsu käivitamistingimused (nn “profile”) või teisendada käsk Androidi rakenduseks, või käivitada see lihtsalt Taskeri kasutajaliidese vahendusel.

Tuvastusserver koduvõrgus

Tuvastusserveri kasutamine koduserveris lisab kogu süsteemile privaatsust (sest audio ja selle transkriptsioon ei lahku koduvõrgust) ning võibolla ka kiirust (sõltuvalt koduserveri kiirusest ja välisinterneti aeglusest).

Kõnetuvastusserveritarkvara https://github.com/alumae/kaldi-gstreamer-server koos eesti keele mudelite ja käivitusskriptiga on saadaval Dockeri konteinerina alumae/konele, mis teeb serveri jooksutamise koduarvutis ülilihtsaks. See konteiner toetab nii “grammatikatoega” teenuse HTTP-liidest kui ka “kiire tuvastusega” teenuse WebSocket-liidest (esimesel juhul küll GF grammatikaid tegelikult toetamata).

Alustuseks on vaja ~3 GB kõvakettaruumi ning Dockeri infrastruktuuri, mille paigaldamisjuhend nt Ubuntu Linuxile on https://docs.docker.com/install/linux/docker-ce/ubuntu/. Seejärel saab teenuse paigaldada käsuga

$ docker pull alumae/konele

Käsu täitmine võtab mõnevõrra aega, sõltuvalt internetiühenduse ja arvuti kiirusest.

Teenuse käivitamiseks pordil 8080 (kasutada võib ka mõnd muud porti) tuleb anda käsk

$ docker run -p 8080:80 -e num_workers=1 alumae/konele

Jooksva teenuse testimiseks võib nt curl programmiga laadida sellesse mõne audiofaili:

$ curl -T lause.ogg http://localhost:8080/client/dynamic/recognize
{"status": 0, "hypotheses": [{"utterance": "see on mingi suvaline lause"}], "id": "265...fea"}

Teenuse logi seire:

# Uuri välja konteineri nimi ja sisene sellesse:
$ docker ps
$ docker exec -it <nimi> bash

# Seal jälgi kahte logifaili:
tail -f master.log worker.log

Käivitatud teenuse kasutamiseks Kõnele rakenduses tuleb menüüs “Kõnetuvastusteenused” ära muuta üks või mõlemad kaks serveriaadressi. Teenuste aadressid sõltuvad koduserveri IP aadressist kohtvõrgus. Nt juhul, kui serveriaadress on 192.168.0.38 ja teenus sai käivitatud pordil 8080 tuleb Kõnele teenuste aadressid muuta kujule:

  • “grammatikatoega”: http://192.168.0.38:8080/client/dynamic/recognize
  • “kiire tuvastusega”: ws://192.168.0.38:8080/client/ws/speech

Koduserveri IP aadressi teadasaamiseks võib külastada koduruuteri konfigureerimislehekülge, tihti aadressil http://192.168.0.1. Samuti on Kõnele menüüs WebSocket-aadress (alates Kõnele v1.6.84) võimalik otsida nutiseadmega samas võrgus olevaid seadmeid, ning kontrollida, kas neis jookseb kaldi-gstreamer-server. Nt teade “2 vaba slotti” teenuse aadressikasti all tähendab, et teenus töötab ning võimaldab hetkel maksimaalselt kahte samaaegset tuvastussessiooni.

Ekraanipilt: tuvastusserveri aadressi määramine.

Käivitades Kõnele läbi teise rakenduse (nt Tasker, Android Debug Bridge, omatehtud rakendus, või Kõnele ümberkirjutusreeglid), saab serveriaadressi üle defineerida ka EXTRAga ee.ioc.phon.android.extra.SERVER_URL.

Veaolukorrad

Kõnele kasutamine ebaõnnestub järgmistes olukordades:

  • võrguühendus serverini puudub või on liiga aeglane;
  • server ei tööta või on ülekoormatud;
  • rakendusel pole ligipääsu mikrofonile, sest mõni teine rakendus parasjagu lindistab.

Nendes olukordades väljastab Kõnele vastava veateate. Muud sorti vead palun raporteerida aadressil http://github.com/Kaljurand/K6nele/issues või kirjutades kaljurand+k6nele@gmail.com.

Tagasiside sellele juhendile palun jätta allolevasse kasti.