Senokai kažką berašiau į savo blog’ą, tad šiandien nusprendžiau parašyt apie tokį dalyką kaip lietuvišką TTS (Text-to-Speech) telefonuose. Įvairiausių variantų yra prigaminta, bet va Lietuviško ir nėra niekur – egzistuoja tik kiek žinau ant Windows sistemų kažkokia keista sintezė, tačiau ji veikia.
Egzistuoja tokia svetainė garsiai.lt, aišku iki tobulumo dar reik padirbėt, o kūrėjai arba visiškai pamiršo arba prarado norą dirbti, bet gi kaip bebūtu tai yra geriau nei nieko (turbūt?).
garsiai.lt anksčiau kaip suprantu buvo text-talk.com kur rašoma kad telefonas gali kalbėti, bet paspaudus mygtuką išbandyti, rašo kad tokia paslauga kol kas neteikiama… įdomu ar ji kada nors buvo teikiama?
Labiau apžiūrėjus garsiai.lt pagalvojau kad galėčiau tai įtaisyti į Android telefonus kaip papildomą funkciją programėlėse. Aišku tam būtų reikalingas internetas… Bet manau kad šiek tiek pasistengus tai būtų galima perdaryti į Lietuvišką TTS kuriam nereikia interneto (jeigu kūrėjai tai skaito parašykit man, gal susitarsim :))
Beje lyg yra kažkoks IE8 “papildukas” (ech tie lietuviški terminai :D) kurį vos ne vos pavykus įsidiegti teko iškart pašalinti, kadangi jis bevertis mano manymu (kas šiais laikais naudoja IE???). Galvojau palengvinsiu tolimesnį darbą.
Na, o dabar apie šios paslaugos įtaisymą telefonuose – tai buvo gan paprasta, žemiau pateiksiu teoriją, kurią galima pritaikyti bet kokiai programavimo kalbai. Mano pavyzdys bus Java kalboje ir duosiu veikiančią Android programėlę kaip “proof of concept”.
garsiai.lt (toliau tiesiog Svetainė) naudoja flash objektą kaip grotuvą kuris išsiunčia ir priima užklausą. Išsiuntus užklausą (ji yra išsiunčiama į voice.text-talk.com) kur yra sugeneruojamas garsinis failas pagal išsiųstą tekstą Base64 formatu ir užklausa gražina failo buvimo vietą kur yra skaitomas failas.
Viskas atrodo taip:
Flash objektas -> užklausa į voice.text-talk.com -> Flash objektas
Pati užklausa kurią išsiunčia atrodo va taip:
engine=mbr&tone=TONAS&time=TIME&text=Base64(TEKSTAS)&delay=0&key=&face=m1&speed=GREITIS&voice=lt2
Dabar paaiškinsiu kas ką reiškia:
tone=%s
– kalbėjimo tonas. Yra reguliuojamas skaičiais intervale [-24;24]time=%s
– užklausos data milisekundėmis nuo epochos. Kiek pastebėjau tai neturi įtakos, tad galima siųsti tiesiog 0.text=%s
– tekstas Base64 formatu (URL friendly encoding)speed=%s
– kalbėjimo greitis. Reguliuojamas skaičiais intervale [-10;10]
Tokia suformuota užklausa yra siunčiama į http://www.garsiai.lt/synthesize/
Tad Java kalboje tokios užklausos išsiuntimas atrodytu taip:
final ByteArrayOutputStream bais = new ByteArrayOutputStream(); try { URL url = new URL(reqUrl); HttpURLConnection connection = (HttpURLConnection)url.openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setInstanceFollowRedirects(false); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("charset", "utf-8"); connection.setRequestProperty("Content-Length", "" + Integer.toString(params[0].getBytes().length)); connection.setUseCaches(false); DataOutputStream outStream = new DataOutputStream(connection.getOutputStream()); outStream.writeBytes(params[0]); outStream.flush(); outStream.close(); InputStream is = null; is = connection.getInputStream(); byte[] byteChunk = new byte[4096]; int n; while ( (n = is.read(byteChunk)) > 0 ) { bais.write(byteChunk, 0, n); } is.close(); } catch (Exception e) { e.printStackTrace(); } String garsas = new String(bais.toByteArray());
Pavyzdinę programėlę galima išbandyti parsisiuntus iš čia: LTTSPvz.apk (jei tingisi kelti per USB, tai čia yra QR kodas :))
Visą projektą darytą su Eclipse galima parsisiųsti iš čia: LTTSPvz.zip
Tai tiek žinių šiam kartui. Tikiuosi kam nors pravers mano atradimai, nors žinoma garsiai.lt sintezei dar reikia darbo iki tobulumo, bet tai jau gera pradžia, o gera pradžia – pusė darbo!
Beje čia žemiau yra demonstracinis filmukas šios programėlės: