Govornik, je vmesnik za uporabnike, ki omogoča enostavno sintetiziranje besedila v govor. Več o njem si lahko preberete tukaj.
Torej Govornik je del sintetizatorja za slovenski jezik. Za dejansko sintetiziranje uporablja odprtokoden programski paket MaryTTS. Z njim sva s prijateljem naredila glasove, ki jih lahko uporabite, prav tako pa za sintetiziranje uporablja spletni strežnik v tem programskem paketu.
Iskanje napak v MaryTTS sintetizatorju
Najprej sem se vprašal, zakaj sintetizator veliko besed narobe naglasi. Zakaj so naglasi največji problem? MaryTTS sintetizator deluje na podlagi leksikona, ki vsebuje seznam besed in njihovih izgovorjav. Tukaj se je predvsem pojavil problem, kako narediti takšen leksikon. Ker sva se s prijateljem strinjala, da nisva prva, ki bi to potrebovala, sva začela iskati odgovore na internetu. Po nekaj časa in pomoči profesorjev, sva našla leksikon SloLeks (uporabila sva 2.0). Napisala sva program v C# jeziku, ki iz tega slovarja (1,4 GB) samo izpiše vse besede in njihove izgovorjave, kar pa je okrog 2.800.000 besed. Te besede sva nato uporabila v MaryTTS NLP komponenti (Natural Language Processing), ki je uporabljen pri obdelavi besedila.
Vendar kot si lahko predstavljate, se že tukaj pojavijo težave z besedami, ki so večpomenske saj imajo isti zapis, vendar se drugače izgovorijo/naglasijo. Primer stavka: gori na gori gori. NLP nima pojma, kaj je pomen teh besed. Zato poišče v slovarju prvo ujemanje in ga uporabi. Torej to je ena izmed težav.
Prav tako ta sintetizator ne zna brati števil in posebnih znakov, saj koda za to ni bila implementirana v NLP komponento. Ker je meni veliko bližji programski jezik C#, sem se odločil izpopolniti in napisati program, ki bi naredil vse potrebno na strani C# in potem prevedel kodo v Javo.
Kako narediti učinkovitejši sintetizator
Med branjem literature sem naletel na zelo zanimivo knjigo: Samodejno tvorjenje govora iz besedil avtorice Jerneje Žganec Gros v kateri je predstavljen postopek izdelave sintetizatorja govora. Navodil sem se do neke mere držal predvsem za predobdelavo besedila.
Torej sintetizator mora opraviti 5 glavnih korakov:
- Slovnična analiza vhodnega besedila
- Nadomeščanje simbolov, števk in kratic z besedami
- Grafemsko-fonemska pretvorba (s slovničnimi pravili in bazo znanih besed),
- Določanje prozodičnih parametrov
- Sintetiziranje govornega signala
Govornik prevzame delo točk od 1,2, 3; 4 in 5 pa prepusti MaryTTS programski kodi.
Glavni koraki
Prvega koraka se nisem še lotil na začetku.
Pretvarjanje števil
Kot prvo sem se lotil pisanja C# knjižnice za pretvarjanje števil v besede. (Na koncu sem ugotovil, da je bil to eden izmed večjih zalogajev). Rezultat te knjižnice lahko tudi preizkusite tukaj. Pri programiranju so se pojavile predvsem težave s poimenovanjem imen velikih števil. Knjižnica omogoča pretvarjanja števil, ki so krajša od 72 mest. Če pa je število večje, pa ga pretvori v potenco števila 10 in napiše izgovor le tega. Torej zgornja omejitev števila je deset na število dolgo 72 mest.
Pretvarjanje kratic
Nato sem se lotil pisanja knjižnic za pretvarjanje kratic. Knjižnica za kratice je precej enostavna. Za uporabo zahteva datoteko kratice.txt, katera je razvrščena po dolžini kratice od najdaljše do najkrajše. Knjižnica na poseben način pregleda besedilo za vse te kratice in jih zamenja z primernimi vpisi (trenutno se sklanjanje kratic ne izvaja. Samo zamenja kratico z njeno osnovno obliko. Primer: itd. -> in tako dalje.
Pretvarjanje simbolov
Kot zadnji del v 2. koraku sem se lotil pisanja knjižnice za pretvarjanje simbolov v besede. Za delovanje potrebuje datoteko simboli.txt, ki vsebuje simbole razvrščene po dolžini od najmanjšega do največjega. Prav tako kot pri kraticah zamenja vse simbole z besedami (tiste, ki so pri govori pomembni) primer: 45 % – petinštirideset odstotkov.
Slovnična analiza besedila
V 3. koraku sem se vprašal, kako naj sintetizator ve, katero izgovorjavo naj uporabi. Med ponovnim branjem diplomske naloge sem dojel, da eBralec vsaki besedi dejansko določi oblikoskladenjsko oznako (besedna vrsta, število, sklon idr.). Prav tako pa navezovanje ene besede na drugo.
Že kar nekaj mesecev nazaj pa sem našel zelo zanimiv program imenovan Označevalnik, ki besedam določi lemo (to je beseda v svoji osnovni obliki: računalnika -> računalnik) in oblikoskladenjsko oznako. Program mi je bil izjemno zanimiv že kar nekaj časa nazaj, vendar ga nisem popolnoma razumel. Sedaj mi je pa jasno za kaj se uporablja. Prav tako pa sem ugotovil, da je program odprtokoden in javno dosegljiv tukaj, saj ga sedaj lahko dejansko uporabim v mojih programih. Po nekaj urah raziskovanja knjižnic sem napisal svoj demo, ki je besedilu določil enake podatke kot spletna stran.
Odločil sem se napisati svojo knjižnico, ki bo dobila vhodno besedilo in poiskala pravilno izgovorjavo tem besedam. Vendar po nekajurnem razmisleku sem prišel do odločitve, da v mojem primeru leme besedi ni potrebno določiti, zato sem iz kode izbrisal vse pripadajoče dele ki besedam določajo lemo (v upanju na pohitritev izvajanja).
Torej knjižnica bo besedam v vhodnemu besedilu določila oblikoskladenjsko oznako. Kaj pa sedaj?
Slovar izgovorjav in Označevalnik
SloLeks 2.0 poleg besede vsebuje tudi informacije o lemi, izgovorjavo in oblikoskladenjsko oznako. Zato sem napisal program, ki v MySQL podatkovno bazo shrani besedo, izgovorjavo in oblikoskladenjsko oznako. Postopek iskanja besed in zapisovanja je trajal okrog 24 ur. Ampak po tem je prišlo vprašanje, kako najučinkovitejše najti izgovorjavo besedi? Po nekaj dneh in posvetovanj s profesorjem in prijatelji, smo se odločili da naredimo poskus. Napisal sem 3 načine iskanja podatkov:
- Iskanje po eni datoteki, ki vsebuje vse besede razvrščene po abecedi; v drugi datoteki pa kazalo, kje se začne katera črka
- Iskanje po večih datotekah, katerih ime je prvi dve črki besede
- Iskanje po SQLite podatkovni bazi z indeksom na stolpec beseda.
Potrudil sem se napisati najbolj kompaktne in hitre metode za brskanje in tole so rezultati (čas v ms):
Kot lahko vidimo, je bila SQLite baza najbolj učinkovitejša v vseh treh primerih. Zato smo se skupaj izbrali SQLite.
Torej sledil je nov program, ki iz MySQL podatkovne baze naredi SQLite podatkovno bazo z indeksom. (Po prvi izvedbi procesa sem ugotovil veliko napako pri iskanju po podatkovni bazi. Nekatere besede so se začele z veliko začetnico in jih je bilo potrebno odpraviti. Zaradi hitrosti se odločil, narediti SQLite bazo še enkrat vendar tokrat tako, da so besede napisane z malimi črkami). Proces je trajal približno 18 ur. SQLite baza pa je velika 270 MB.
Napisal sem knjižnico, ki vhodnemu besedilu določi oblikoskladenjsko oznako, nato pa vsaki besedi najde pravo izgovorjavo v podatkovni bazi. Če besedi ne najde izgovorjave v bazi, ji ročno določi izgovorjavo (šumnike zamenja z njihovim znakom za izgovor, in črkam e določi ozek glas, o pa ozek o).Vse skupaj pa na to obdela metoda, ki naredi XML v formatu MaryTTS sintetizatorja za izgovorjavo besed.
Vse skupaj pa se na to pošlje MaryTTS sintetizatorju, ki vrne wav datoteko ki jo program nato avtomatsko prebere.
Rezultat
Rezultat vseh teh delov je program Govornik, ki združuje vse te knjižnice skupaj v program, ki je enostaven za uporabo.
Koraki, ki jih Govornik izvede:
- Zamenja vse kratice s besedami
- Zamenja vse simbole s besedami
- Poišče datume in jih pretvori v osnovno obliko
- Pretvori števila v besede
- Označi besedilo
- Poišče izgovorjavo besedam
- Sestavi XML
- Pošlje XML MaryTTS sintetizatorju
- Sintetizator vrne odgovor
- Govornik predvaja zvok.
Testiranje
Testiranja še nisem izvajal saj je bil sedaj cilj narediti delujoč program. Bom pa posodobil ta članek z novimi informacijami.