2010 m. lapkričio 10 d., trečiadienis

Kompiuterinė lingvistika: balso sintezė iš teksto (1)

ĮŽANGA

Viena iš, mano nuomone, įdomių kompiuterijos sričių yra kompiuterinė lingvistika. Tačiau, kas tai yra? Pagal mokymo programos aprašą (tokia programa yra KTU), studentas, baigęs kompiuterinę lingvistiką gali dirbti kalbos analizės ir apdorojimo, elektroninės leidybos, darbo su informacinėmis kalbos, šnekos ir teksto technologijomis srityse. O jeigu konkrečiau, tai kalbos signalų apdorojimas, kalbos sintezė ir atpažinimas, mašininė sintaksinė analizė, mašininis vertimas, tekstynų apdorojimas, skiemenavimas ir žodžių kėlimas, rašybos tikrinimas, automatinis santraukos sudarymas, pagalbinės vertimo priemonės (žinoma, visam tam, be informatikos, reikia fonologijos, fonetikos, morfologijos, kirčiavimo, transkribavimo ir kitų filologijos sričių išmanymo).

Kadangi ši sritis man yra įdomi, tai taip jau nutiko, kad ir bakalauro ir magistro baigiamuosius darbus rašiau apie balso sintezę iš teksto (vadovas - dr. P. Kasparaitis). Vienas iš darbo rezultatų - signalo formavimo modulis (kas tai yra, bus aprašyta šioje įrašų serijoje). O kažkurios (ne naujausios) versijos sintezuotos kalbos galite pasiklausyti čia: „Labas, mielasis dienoraščio skaitytojau“.

Tad šiame įraše pradėsiu pasakoti apie balso sintezę iš teksto. Kadangi teksto žada būti daug, tai visas pasakojimas bus išskirstytas per kelis blogo įrašus. Šis įrašas bus nedidelis, bet kiti, tikėtina, bus ilgesni

ĮVADAS

Vienas iš požymių, kuo žmogus skiriasi nuo kitų gyvūnų, yra artikuliuota kalba. Ši savybė kartu su abstrakčiu mąstymu, žmogiška kultūra bei socialiniais ypatumais lėmė dabartinį žmonių paplitimą bei pasiektą išsimokslinimo lygį. Žmogui kalba – svarbiausia bendravimo priemonė. Dabar, esant kompiuteriams, telekomunikacijoms ir internetui, ypač daug socialinių procesų vyksta virtualioje erdvėje. Žmonės vis daugiau ir daugiau laiko praleidžia prie kompiuterių ir interneto, bendravimas tampa daugiau tekstinis nei balsinis. Žinoma, didėjant ryšio pralaidumams balso komunikacijos (pavyzdžiui, Skype) populiarėja, tačiau dauguma informacijos vis tiek lieka tekstinė.

Žmonės atsisako pagrindinės savo bendravimo priemonės tam, kad galėtų patogiau atlikti kitas užduotis. Tačiau ar tikrai būtina atsisakyti? Juk projektai, skatinantys balso komunikacijas, sudaro galimybę ir bando sugrąžinti tai, ką žmonės iš savęs atėmė priimdami kompiuterių bei interneto privalumus.

Vienas iš būdų diegti balsinę kalbą kompiuteriuose – tiesiog „išmokyti“ kompiuterius bendrauti mums natūraliausia bendravimo priemone. Kalbos atpažinimo bei sintezės sistemos – tai pirmasis žingsnis to link.

Akivaizdu, kad kai kuriose srityse yra ypač sunku apsieiti be kalbos sintezatorių (tokiose, kaip akliesiems skirtose sistemose), būtent dėl to aktualu ir verta tyrinėti šią sritį bei tobulinti metodus, įrankius bei programinę įrangą, skirtą sintezuoti balsą iš teksto. Pastaraisiais metais kompiuterių skaičiavimo pajėgumai bei atminties talpa išaugo tiek, kad dažniausiai tai nėra ribojantis veiksnys, kuris lemia kalbos sintezės kokybę. Tačiau kalbos sintezatoriai vis dar nėra masiškai naudojami ir paplitę įvairiose srityse būtent dėl to, kad sintezuotos kalbos kokybė vis dar nėra pakankamai gera. Todėl daugelio kalbų sintezatorius nuolat stengiamasi tobulinti, gerinant jų sintezės kokybę.

Dabar naudojami lietuvių kalbos sintezatoriai remiasi garsų jungimo metodu (pavyzdžiui, UAB „Etalinkas“ sukurtas sintezatorius [Eta10] bei VU sukurtas sintezatorius „Aistis“). Vienas iš tokių metodų – jungti difonus, pavyzdžiui, viena lietuvių kalbos difonų duomenų bazė yra aprašyta [Kas05]. Šiuo metodu realizuoti sintezatoriai susideda iš trijų pagrindinių modulių (visi trys moduliai išsamiai aprašyti 2.2 poskyryje).

Tobulinant kiekvieną modulį atskirai galima gauti geresnius visos balso sintezės sistemos rezultatus, t. y. geresnės kokybės sintezuotą kalbą.

1. KALBOS IŠGAVIMAS

Kad suprastumėme kai kurių sintezės sistemų veikimo ypatumus, panagrinėkime žmogaus kalbos traktą bei jo ypatumus. Šiame skyriuje nesistengiama pateikti išsamaus ir visiškai tikslaus paaiškinimo, kaip žmogus išgauna kalbą – čia tik supažindinama su pagrindiniais kalbos atsiradimo žmogaus kalbos trakte ypatumais.

Supaprastintai žvelgiant į žmogaus kalbos išgavimo organus ir jų vaizdą, galima apibendrintai teigti, kad:

  • plaučiai veikia kaip energijos šaltinis;
  • kai balso stygos būna įtemptos, tai jos virpa ir generuoja tam tikro dažnio bangas, ir taip atsiranda skardus garsas;
  • visos kitos ertmės ir kalbos padargai (nosies, burnos, ryklės ertmės, liežuvis, dantys, lūpos) veikia kaip tam tikras muzikos instrumentas, leidžiantis sukurti bei modifikuoti garsą.

Taigi, skirtingų formų kalbos traktas keičia garsą (t. y., pro jį einančią garso bangą). Viena iš svarbiausių yra burnos ertmė. Keisdami jos formą bei tūrį, išgauname įvairius garsus. Nosies ertmė ypač svarbi išgaunant nosinius garsus (pavyzdžiui, n ir m, kuriuos išgaunant oras išeina pro nosį). Iš viso to galime susidaryti supaprastintą modelį (1 pav.).

1 pav. Supaprastintas žmogaus kalbos trakto modelis

Taigi, įtemptos balso stygos generuoja periodines tam tikro dažnio bangas, kurios naudojamos išgauti skardžiuosius garsus, o duslieji garsai gaunami iš panašaus į triukšmą garso.

TĘSINYS BUS :)

Kitame įraše pasistengsime bendrai apžvelgti kalbos sintezės iš teksto sistemas – jų pritaikymo sritis, naudojimą bei skirstymą. Taip pat pateiksime kelias bendras sintezatorių schemas bei paanalizuosime vienos iš jų sudedamąsias dalis. Tad iki kito karto!

LITERATŪRA

[Eta10] UAB „Etalinkas“. Lietuvių kalbos sintezatorius. [Žiūrėta 2010-05-08]. Prieiga per Internetą.

[Kas05] P. Kasparaitis. Diphone Databases for Lithuanian Text-to-Speech Synthesis. Informatica, 16(2), 2005, pp. 193-202.

2010 m. spalio 26 d., antradienis

Programos kūrimas greitai, vizualiai ir daugeliui platformų? Taip.

Taigi, kaip anksčiau žadėjau, trumpai papasakosiu, ką ir kaip naudoju KZod žodyno kūrime. Trys pagrindiniai dalykai:
  1. pačios programos kūrimas;
  2. žinyno kūrimas;
  3. diegimo paketų kūrimas.

Tad čia šiuos dalykus ir pabandysime apžvelgti.

Pačios programos kūrimas

2002, kai pradėjau kurti KZod žodyną naudojau Delphi dėl to, kad buvo ypač patogu kurti vartotojo aplinką, plius Object Pascal kalba mažai mokančiam programuoti buvo patraukli dėl to, kad galima buvo apsieiti be rodyklių ir kitų sudėtingesnių dalykų (tačiau juos galima naudoti, jeigu nori).

Apie 2006 metais nusprendžiau, kad verta programą perkelti į Linux OS. Tada reikėjo tikrai nedaug pakeitimų, kad pavyktų sukompiliuoti programą su Kylix ir šiokia tokia (nebaigta) žodyno versija veikė! Tačiau jau tada Kylix buvo beveik pasenęs, tad tai neteikė daug vilčių.

Kita alternatyva, kurią bandžiau jau 2006 metais, tai buvo Free Pascal kompiliatorius su Lazarus integruotąja kūrimo aplinka. Tada vizualioji dalis veikė, pavadinkime, prastai. Tačiau jau apie 2008 m. pabandęs iš naujo, buvau nustebintas didelio kokybės pagerėjimo ir tais pačiais metais turėjau veikiančią žodyno versiją, kuri buvo sukompiliuota su Free Pascal.

Tad iš tiesų, kas yra Lazarus ir kuo jis geras? Keli punktai (tikrai ne visi svarbiausi :) ):

  • spartaus kūrimo aplinka (angl. RAD - Rapid Application Development);
  • vizualaus, komponentinio kūrimo aplinka;
  • atviro kodo - reiškia gali pats susitvarkyti ar pakeisti dalykus, kurie tau nepatinka;
  • skirta daugeliui platformų;
  • gaunama sukompiliuota savoji (angl. native) programa.

O kas svarbiausia - užtenka turėti vieną išeities tekstą ir gali susikompiliuoti savąsias programas Windows, Linux (GTK1&2, QT) ir OSX (ir dar kelioms) operacinėms sistemoms.

Tikrai! Naujausia KZod žodyno versija turi ~14 000 gryno kodo eilučių (išties, nedaug) ir IFDEF'ai naudojami vos poroje vietų, t. y. ten kur yra kodas, skirtas reaguoti į iškarpinę. Ir visa tai be problemų susikompiliuoja Windows, Linux ir OSX operacinėse sistemose. Windows ir Linux ekrano vaizdai yra senesniame mano pranešime, o OSX čia:

KZod OSX sistemoje

Verta pastebėti, kad čia ne naujausia žodyno versija, tačiau tai dėl laiko trūkumo ir techninės įrangos neturėjimo (kas nors norite atiduoti ar paskolinti Mac'ą?).

Kartais vis atsiranda kas nors, kas sako, kad verta perrašyti visą žodyną su C/C++/C# - galiu pasakyti tik tiek: neverta! Naudos negausiu, o palaikymas ir naujų dalykų programavimas užtruks ilgiau.

Žinyno kūrimas

Taigi, jau turime programos failus, tačiau neatsiejama dalis yra programos žinynas. Html ar pdf formato žinynas yra būtinas, tačiau nėra pakankamas, nes tikrai nėra patogus! Paieška, indeksas, straipsnių susiejimas su programos elementais - visų šių savybių negali patogiai užtikrinti html ar pdf formato dokumentacija.

Kaip tik su tokia pačia problema susidūrė ir Lazarus programavimo aplinkos kūrėjai. Jie, po diskusijų, nusprendė naudoti chm formatą. Nors jis ir nėra oficialiai dokumentuotas, tačiau yra pakankamai neoficialių išsamių formato aprašų. Problema buvo ta, kad Linux sistemoje nėra pakankamai išvystytų chm žiūryklių (angl. viewer). Ir taip po kelių mėnesių atsirado LHelp programa, kuri visose platformose veikia ir atrodo taip pat. Palaiko indeksus, pilno teksto paiešką ir t. t.

Tad žinyno problema man išsisprendė iki atsirandant trečiai žodyno versijai :) Tiesa, teko pačiam susiprogramuoti chm „gamintoją“, nes esantys Windows sistemoms nepalaiko UTF8, o esantis su Lazarus pavyzdinis chm „gamintojas“ šiek tiek labai nepabaigtas :) Tiesa, mano irgi yra ypač paprastas, tačiau šiek tiek patogesnis:

Maniškis chm „gamintojas“

Tad nors dar ir nėra paruošti KZod žodyno pagalbos failai, bet visa, ko reikia (išskyrus pačius tekstus), jau yra.

Diegimo paketų kūrimas

Kiekviena rimta programinė įranga pateikiama kaip diegimo paketas. Taip yra dėl to, kad šis diegimo paketas ne tik sukopijuoja failus į reikiamas vietas, bet sutvarko ir įvairius kitus reikalingus dalykus (pvz., sukuria nuorodas, įrašo reikiamą informaciją į registrus ar kitur).

Lygiai taip pat, kaip su programos kūrimu - turi vieną išeities tekstą ir iš jo susikompiliuoji visoms sistemoms - norėjosi daryti ir su diegimo paketų kūrimu. Šiek tiek paieškojus internete aptikau InstallJammer projektą, kuris būtent tam ir skirtas!

Taip pat dar turėjau kelis (pagrindinius) pageidavimus:

  • turi būti kuriami paketai Windows, Linux ir OSX sistemoms;
  • turi būti galima pasirinkti diegiamus komponentus;
  • turi būti galima įdiegti „ant viršaus“ neribotą kiekį kartų ir naujesni failai (pagal diegimo programoje nurodytus versijų numerius) turi perrašyti senesnius;
  • turi būti palaikomas daugiakalbiškumas.

Deja, šis projektas nėra toks stabilus ir taip dažnai atnaujinamas, kaip norėtųsi... 1.2 versija neturėjo kelių dalykų, kurių man norėjosi, o 1.3 versija turėjo nemažai netikėtų ir nepageidautinų savybių :) (aka angl. bug). Šiaip ar taip, pramokęs tcl skriptų kalbą ir po ~20 val. gryno darbo sugebėjau turėti pageidaujamą diegimo paketą Windows sistemai.

Tiesa, Linux ar OSX diegimo paketų dar nebandžiau, bet problemų (tikiuosi) nebus.

2010 m. spalio 23 d., šeštadienis

KZod - programavimas kaip hobi

Taigi, praėjus dvejiems metams pagaliau pabandysiu ką nors papasakoti :)

KZod - vienas iš mano projektų, kurį kažkas iš tiesų naudoja!

Iš pradžių šiek tiek statistikos:

  • nuo ~2004 metų programą atsisiuntė 315 616 kartus (čia neįskaičiuoti atsisiuntimai iš tiesioginės nuorodos, t. y. kai siunčiamasi per visokius download.com ir kitus psl.);
  • iš aukštesnio skaičiaus 12 695 atsisiuntimai Linux OS (verta pastebėti, kad Linux OS versija nėra tokia išbaigta, kaip Windows versija...).

Tada išeina, kad per dieną vidutiniškai programa atsisiunčiama 136 kartus. Visgi tikrai bent kažkas ją naudoja!

Keista, nes Donate! mygtuką per apie ketverius metus paspaudė tik trys žmonės :)

Šiaip ar taip - tas nemažas atsisiuntimų skaičius motyvuoja kartais prisėsti ir kažką naujo paprogramuoti šiam žodynui.

Tad nuo pirmosios trečios kartos (v3) programos beta versijos, kurią pirmą kartą viešai paskelbiau 2008 metų rugsėjį, praėjus nemažam laiko tarpui jau yra trečioji beta - išties realiai mąstant, pilnu etatu, užtektų poros mėnesių ir būtų viskas baigta, bet...

Taigi, trumpai pristatant naujausią beta versiją, reikėtų pasakyti, kad čia atsižvelgta į daugmaž visus anksčiau gautus patarimus ir pastabas (išskyrus programos interfeiso detalių vietos keitimą). Visgi verta pastebėti, kad čia dar trūksta tokių dalykų:

  • Jeigu įdiegiami iš pradžių ne visi žodynai, tai po to papildomai diegiant žodynus - jie neatsiranda programoje.
  • Nėra angliškų trumpų patarimų.
  • Nėra pagalbos failų.
  • Interneto reikalaujančios funkcijos (ieškoti žodžio internete, žiūrėti naujienas) gali veikti nestabiliai jeigu kompiuteris atjungtas nuo interneto.
  • Taip pat keisis „Apie“ dialogo išdėstymas.
  • Šį kartą Linux versijos nėra (dėl laiko trūkumo - neturėjau kada ištestuoti ir supakuoti).

Taip pat šiame pakete galite rasti 12 žodynų:

  • anglų-lietuvių (25000), lietuvių-anglų (11500);
  • rusų-lietuvių (18800); lietuvių-rusų (28500);
  • prancūzų-lietuvių (18400); lietuvių-prancūzų (9200);
  • vokiečių-lietuvių (4600); lietuvių-vokiečių (3700);
  • lenkų-lietuvių (18700); lietuvių-lenkų (18700);
  • esperanto-lietuvių (8800); lietuvių-esperanto (10100).

Tiems, kas nepatingės patestuoti, ir išsakyti, būsiu dėkingas už visas pastabas, pasiūlymus ir komentarus.

Nelikite abejingi - paremkite šį projektą! (sąskaita ARBA PayPal: www.dict.lt „Donate“ mygtukas)

Artimiausiuose planuose - Linux versija, po to - Mac OSX versija, dar vėliau - žodynų kūrimas ir redagavimas. Deja, negaliu apibrėžti savaitėmis, kiek tie „artimiausi planai“ gali trukti. Galiu tik pažadėti, kad kiekvieni paaukoti 5 Lt „privers“ mane per per artimiausias dienas skirti bent 1 valandą šiam projektui ;)

Kitą kartą papasakosiu kaip ir su kuo visa tai kurta!

Programą atsisiųsti galite iš čia.

Pavyzdiniai ekrano vaizdai:

Windows 7 sistemoje
Windows XP sistemoje

2008 m. rugsėjo 21 d., sekmadienis

Ir apie ką mes čia?

Taigi, jau kelintą kartą vis pagalvoju, kad gal visai ir sugebėčiau rašyti dienoraštį. Ir štai jo užuomazga.

Ko aš tikiuosi, o gal tiksliau, ko galite jūs tikėtis? Pabandykim pamąstyti. Visgi turbūt galiu pažadėti nereguliarių ir neaiškaus naudingumo įrašų:

  • kartais savo vykdomų projektų aprašymų ar apžvalgų;
  • kartais neaiškios kokybės kūrybos;
  • kartais istorijų iš kelionių;
  • kartais pamąstymų ar tiesiog pastabų apie tai, kas vyksta aplinkui;
  • o kartais tiesiog kažko, kas iškrenta iš visai bet kokio konteksto.

Na štai, pažadėjau nieko nežadėdamas ir dabar turėčiau jaustis laimingas, bet visgi... visgi manau, kad dienoraštis, tiksliau viešas dienoraštis, turi suteikti naudos (naudos plačiąja prasme - žiniomis, dvasiai ar gal kartais net materialios naudos) visiems jį skaitantiems, tad labai tikiuosi, kad šis įrašas yra pirmasis ir kartu paskutinis. Pirmasis tuo, kad juo pasižadu čia rašyti, o paskutinis, nes tikiuosi, kad visi kiti bus turtingesni savo turiniu.

Ačiū tiems, kas perskaitėte viską.