{"id":1596,"date":"2013-02-05T10:47:35","date_gmt":"2013-02-05T08:47:35","guid":{"rendered":"http:\/\/9v.lt\/blog\/?p=1596"},"modified":"2022-01-19T08:34:41","modified_gmt":"2022-01-19T06:34:41","slug":"lietuviskas-tts-telefonuose","status":"publish","type":"post","link":"https:\/\/9v.lt\/blog\/lietuviskas-tts-telefonuose\/","title":{"rendered":"Lietuvi\u0161kas TTS telefonuose"},"content":{"rendered":"<p>Senokai ka\u017ek\u0105 bera\u0161iau \u012f savo blog&#8217;\u0105, tad \u0161iandien nusprend\u017eiau para\u0161yt apie tok\u012f dalyk\u0105 kaip lietuvi\u0161k\u0105 TTS (Text-to-Speech) telefonuose. \u012evairiausi\u0173 variant\u0173 yra prigaminta, bet va Lietuvi\u0161ko ir n\u0117ra niekur &#8211; egzistuoja tik kiek \u017einau ant Windows sistem\u0173 ka\u017ekokia keista sintez\u0117, ta\u010diau ji veikia.<\/p>\n<p>Egzistuoja tokia svetain\u0117 <a href=\"http:\/\/www.garsiai.lt\/\" target=\"_blank\" rel=\"noopener\">garsiai.lt<\/a>, ai\u0161ku iki tobulumo dar reik padirb\u0117t, o k\u016br\u0117jai arba visi\u0161kai pamir\u0161o arba prarado nor\u0105 dirbti, bet gi kaip beb\u016btu tai yra geriau nei nieko (turb\u016bt?).<\/p>\n<p>garsiai.lt anks\u010diau kaip suprantu buvo <a href=\"http:\/\/www.text-talk.com\/\" target=\"_blank\" rel=\"noopener\">text-talk.com<\/a> kur ra\u0161oma kad telefonas gali kalb\u0117ti, bet paspaudus mygtuk\u0105 i\u0161bandyti, ra\u0161o kad tokia paslauga kol kas neteikiama&#8230; \u012fdomu ar ji kada nors buvo teikiama?<br \/>\n<!--more--><br \/>\nLabiau ap\u017ei\u016br\u0117jus garsiai.lt pagalvojau kad gal\u0117\u010diau tai \u012ftaisyti \u012f Android telefonus kaip papildom\u0105 funkcij\u0105 program\u0117l\u0117se. Ai\u0161ku tam b\u016bt\u0173 reikalingas internetas&#8230; Bet manau kad \u0161iek tiek pasistengus tai b\u016bt\u0173 galima perdaryti \u012f Lietuvi\u0161k\u0105 TTS kuriam nereikia interneto (jeigu k\u016br\u0117jai tai skaito para\u0161ykit man, gal susitarsim :))<\/p>\n<p>Beje lyg yra ka\u017ekoks IE8 &#8220;papildukas&#8221; (ech tie lietuvi\u0161ki terminai :D) kur\u012f vos ne vos pavykus \u012fsidiegti teko i\u0161kart pa\u0161alinti, kadangi jis bevertis mano manymu (kas \u0161iais laikais naudoja IE???). Galvojau palengvinsiu tolimesn\u012f darb\u0105.<\/p>\n<p>Na, o dabar apie \u0161ios paslaugos \u012ftaisym\u0105 telefonuose &#8211; tai buvo gan paprasta, \u017eemiau pateiksiu teorij\u0105, kuri\u0105 galima pritaikyti bet kokiai programavimo kalbai. Mano pavyzdys bus Java kalboje ir duosiu veikian\u010di\u0105 Android program\u0117l\u0119 kaip &#8220;proof of concept&#8221;.<\/p>\n<p>garsiai.lt (toliau tiesiog Svetain\u0117) naudoja flash objekt\u0105 kaip grotuv\u0105 kuris i\u0161siun\u010dia ir priima u\u017eklaus\u0105. I\u0161siuntus u\u017eklaus\u0105 (ji yra i\u0161siun\u010diama \u012f voice.text-talk.com) kur yra sugeneruojamas garsinis failas pagal i\u0161si\u0173st\u0105 tekst\u0105 Base64 formatu ir u\u017eklausa gra\u017eina failo buvimo viet\u0105 kur yra skaitomas failas.<br \/>\nViskas atrodo taip:<br \/>\n<code>Flash objektas -> u\u017eklausa \u012f voice.text-talk.com -> Flash objektas<\/code><\/p>\n<p>Pati u\u017eklausa kuri\u0105 i\u0161siun\u010dia atrodo va taip:<br \/>\n<code>engine=mbr&tone=TONAS&time=TIME&text=Base64(TEKSTAS)&delay=0&key=&face=m1&speed=GREITIS&voice=lt2<\/code><br \/>\nDabar paai\u0161kinsiu kas k\u0105 rei\u0161kia:<\/p>\n<ul>\n<li><code>tone=%s<\/code> &#8211; kalb\u0117jimo tonas. Yra reguliuojamas skai\u010diais intervale [-24;24]<\/li>\n<li><code>time=%s<\/code> &#8211; u\u017eklausos data milisekund\u0117mis nuo epochos. Kiek pasteb\u0117jau tai neturi \u012ftakos, tad galima si\u0173sti tiesiog 0.<\/li>\n<li><code>text=%s<\/code> &#8211; tekstas Base64 formatu (URL friendly encoding)<\/li>\n<li><code>speed=%s<\/code> &#8211; kalb\u0117jimo greitis. Reguliuojamas skai\u010diais intervale [-10;10]<\/li>\n<\/ul>\n<p>Tokia suformuota u\u017eklausa yra siun\u010diama \u012f <code>http:\/\/www.garsiai.lt\/synthesize\/<\/code><\/p>\n<p>Tad Java kalboje tokios u\u017eklausos i\u0161siuntimas atrodytu taip:<\/p>\n<pre lang=\"java\">\r\nfinal ByteArrayOutputStream bais = new ByteArrayOutputStream();\r\ntry {\r\n\tURL url = new URL(reqUrl); \r\n\tHttpURLConnection connection = (HttpURLConnection)url.openConnection();           \r\n\tconnection.setDoOutput(true);\r\n\tconnection.setDoInput(true);\r\n\tconnection.setInstanceFollowRedirects(false); \r\n\tconnection.setRequestMethod(\"POST\"); \r\n\tconnection.setRequestProperty(\"Content-Type\", \"application\/x-www-form-urlencoded\"); \r\n\tconnection.setRequestProperty(\"charset\", \"utf-8\");\r\n\tconnection.setRequestProperty(\"Content-Length\", \"\" + Integer.toString(params[0].getBytes().length));\r\n\tconnection.setUseCaches(false);\r\n\t\r\n\tDataOutputStream outStream = new DataOutputStream(connection.getOutputStream());\r\n\toutStream.writeBytes(params[0]);\r\n\toutStream.flush();\r\n\toutStream.close();\r\n\t\r\n\tInputStream is = null;\r\n\tis = connection.getInputStream();\r\n\tbyte[] byteChunk = new byte[4096];\r\n\tint n;\r\n\r\n\twhile ( (n = is.read(byteChunk)) > 0 ) {\r\n\t\tbais.write(byteChunk, 0, n);\r\n\t}\r\n\tis.close();\r\n\t\r\n} catch (Exception e) {\r\n\te.printStackTrace();\r\n}\r\n        String garsas = new String(bais.toByteArray());\r\n<\/pre>\n<p>Pavyzdin\u0119 program\u0117l\u0119 galima i\u0161bandyti parsisiuntus i\u0161 \u010dia: <a href=\"http:\/\/9v.lt\/projects\/android\/LTTSPvz\/LTTSPvz.apk\" target=\"_blank\" rel=\"noopener\">LTTSPvz.apk<\/a> (jei tingisi kelti per USB, tai <a href=\"http:\/\/9v.lt\/projects\/android\/LTTSPvz\/qr.png\" target=\"_blank\"  rel=\"wpdevart_lightbox noopener\" >\u010dia<\/a> yra QR kodas :))<\/p>\n<p>Vis\u0105 projekt\u0105 daryt\u0105 su Eclipse galima parsisi\u0173sti i\u0161 \u010dia: <a href=\"http:\/\/9v.lt\/projects\/android\/LTTSPvz\/LTTSPvz.zip\" target=\"_blank\" rel=\"noopener\">LTTSPvz.zip<\/a><\/p>\n<p>Tai tiek \u017eini\u0173 \u0161iam kartui. Tikiuosi kam nors pravers mano atradimai, nors \u017einoma garsiai.lt sintezei dar reikia darbo iki tobulumo, bet tai jau gera prad\u017eia, o gera prad\u017eia &#8211; pus\u0117 darbo!<\/p>\n<p>Beje \u010dia \u017eemiau yra demonstracinis filmukas \u0161ios program\u0117l\u0117s:<\/p>\n<p><iframe loading=\"lazy\" title=\"LTTSPvz demo\" width=\"810\" height=\"608\" src=\"https:\/\/www.youtube.com\/embed\/9YYXB0I_dUE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Senokai ka\u017ek\u0105 bera\u0161iau \u012f savo blog&#8217;\u0105, tad \u0161iandien nusprend\u017eiau para\u0161yt apie tok\u012f dalyk\u0105 kaip lietuvi\u0161k\u0105<\/p>\n","protected":false},"author":2,"featured_media":1637,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7,5],"tags":[135,860,859,858],"class_list":["post-1596","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ltu","category-my-tutos","tag-android","tag-lietuviskas","tag-sinteze","tag-tts"],"_links":{"self":[{"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/posts\/1596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/comments?post=1596"}],"version-history":[{"count":0,"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/posts\/1596\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/media\/1637"}],"wp:attachment":[{"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/media?parent=1596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/categories?post=1596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/9v.lt\/blog\/wp-json\/wp\/v2\/tags?post=1596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}