Teza doctorat (pdf) - Universitatea Tehnică

Teza doctorat (pdf) - Universitatea Tehnică Teza doctorat (pdf) - Universitatea Tehnică

users.utcluj.ro
from users.utcluj.ro More from this publisher
15.06.2013 Views

Cap. 7. Proiectarea sistemului de sinteză de voce în limba română funcţie de caracteristicile unităţii lingvistice: lungime, context şi accentuare (a se vedea paragraful 6.4.7). Pot exista următoarele situaţii: - Unitatea este regăsită identic în baza de date vocală, din punct de vedere fonetic, contextual şi prozodic. În acest caz unitatea se reţine ca atare pentru a fi înglobată în textul sintetizat. - Unitatea este regăsită fonetic, dar nu prozodic sau contextual. Se preferă, în acest caz, construirea acesteia din subunităţi sau foneme separate, care să respecte în primul rând prozodia cerută (unitate accentuată sau neaccentuată), şi apoi, dacă este posibil, contextul specificat. - Unitatea nu este regăsită fonetic în baza de date. Şi în acest caz ea va fi construită pe baza subunităţilor componente, găsite în baza de date. f) Îmbinarea unităţilor: unităţile acustice găsite în baza vocală prin algoritmul expus mai sus se vor concatena pentru a genera semnalul de ieşire. Concatenarea se face ţinând cont de pauza dintre cuvinte, pauză care se va ajusta în funcţie de ritmul necesar pentru vorbire. g) Ultima fază este cea de sinteză propriu-zisă, în care formele de undă corespunzătoare textului de la intrare (generate în etapa precedentă) vor fi redate sonor prin intermediul plăcii audio a calculatorului. 7.4. Algoritmul de implementare al conversiei text-voce În acest paragraf este prezentat algoritmul de implementare al procesului on-line al sistemului: conversia text-voce. Algoritmul porneşte de la un text sursă trecut prin fazele de preprocesare şi corectare ortografică, realizând următoarele acţiuni: analiza lingvistică în scopul determinării silabelor, analiza prozodică pentru determinarea accentelor, potrivirea unităţilor şi sinteza de voce. Algoritmul general este prezentat în diagrama 1. La început, parserul de text apelează analizorul lexical (denumit Silabe_Lex) pentru determinarea silabelor, respectiv a separatorilor. Cele două tipuri de unităţi lexicale sunt procesate de către subrutinele Procesare_Silabă, respectiv Procesare_Separator. Silabele urmate de un separator sunt grupate pentru a forma un cuvânt. Cuvântul curent este prelucrat mai departe în subrutina Procesare_Cuvânt, mai multe cuvinte formând o propoziţie. După fiecare cuvânt regăsit de la intrare, se apelează analizorul lexical pentru determinarea accentelor, adică a silabei accentuate din cuvânt. Apoi subrutina Potrivire_unităţi realizează funcţia de punere în corespondenţă între unităţile regăsite din textul de la intrare şi unităţile acustice memorate în baza de date. Potrivirea se face la nivelul silabelor pentru fiecare cuvânt din propoziţie. În urma acestei operaţiuni rezultă un fişier de tip wave care este sintetizat prin intermediul subrutinei Rostire. Algoritmul de parcurgere a intrării este ilustrat în diagrama 2. Se iniţializează mai întâi stream-ul de intrare – textul care trebuie sintetizat (funcţia Init_Stream). Apoi se apelează analizorul lexical yylex( ) pentru despărţirea în silabe. Analizorul returnează fie o silabă, fie un separator, fie caracterul sfârşit de fişier, dacă s-a ajuns la sfârşitul stream-ului de intrare. Silaba se tratează în procedura Procesare_Silabă, iar separatorul în procedura Procesare_Separator, ambele figurate în diagrama 3. 254

Cap. 7. Proiectarea sistemului de sinteză de voce în limba română Procedura Procesare_Silabă adaugă silaba la cuvântul curent ( Adaugă_Silabă), şi apoi construieşte structura în memorie a cuvântului prin Construieşte_Cuvânt. Tot aici se face şi eliminarea cratimei din cuvânt, în vederea rostirii (căutarea în baza de date se face după o silabă care nu trebuie să conţină cratimă). Subrutina Procesare_Separator este apelată atunci când analizorul întâlneşte un separator în stream-ul de intrare. Aceasta înseamnă că s-a terminat de citit un cuvânt şi, dacă separatorul este terminator de propoziţie, s-a încheiat şi propoziţia curentă. Cuvântul este prelucrat şi analizat din punct de vedere al prozodiei (accentelor) în procedura Procesare_Cuvânt. Apoi se adaugă cuvântul împreună cu structura de silabe şi accente în propoziţia curentă din memorie (procedura Adaugă_Cuvânt). Urmează adăugarea în structură a separatorului, care va indica în momentul rostirii pauza dintre cuvinte, respectiv de la sfârşitul propoziţiei. Se testează în continuare dacă separatorul este un terminator de propoziţie. În caz afirmativ, se apelează procedura Potriveşte_Unităţi, care are rolul de a căuta şi identifica unităţile acustice din baza de date din care se va construi forma de undă corespunzătoare cuvintelor din propoziţie. Apoi se rosteşte propoziţia în subrutina Rosteşte_Propoziţie. Potrivirea silabelor din cuvânt cu unităţile acustice se face în funcţie de accentuarea silabei (dacă silaba este accentuată sau nu) şi după locul silabei în cadrul cuvântului (dacă silaba este în mijlocul sau la finalul cuvântului). Căutarea în baza de date ţine cont şi de numărul de litere componente ale silabei. Dacă silaba nu este regăsită ca atare în baza de date, atunci forma de undă se construieşte pe baza fonemelor şi silabelor cu un număr mai mic de litere ce intră în componenţa silabei iniţiale. Aşa cum am amintit anterior, pot exista următoarele situaţii: 1. Silaba dorită este regăsită identic în baza de date vocală, atât din punct de vedere fonetic, cât şi din punct de vedere prozodic. În acest caz silaba se reţine ca atare pentru a fi înglobată în cuvântul de sintetizat. 2. Silaba este regăsită fonetic, dar nu şi prozodic. Se preferă în acest caz constituirea acesteia din silabe şi foneme mai scurte, care să respecte prozodia cerută (silabă accentuată sau neaccentuată). 3. Silaba nu este regăsită fonetic în baza de date. Şi în acest caz silaba va fi compusă pe baza fonemelor separate extrase din baza de date. Formele de undă corespunzătoare silabelor sunt concatenate, iar rostirea propoziţiei se va realiza prin apelul funcţiei API Windows PlaySound( ). Procesarea unui cuvânt din punct de vedere al prozodiei (accentelor) se face în procedura Procesare_Cuvânt, ilustrată în diagrama 4. Aici se verifică mai întâi terminaţia cuvântului pentru a se determina dacă este vorba despre un substantiv care a fost declinat (‚băiatul’, ‚băieţilor’, etc.). În acest caz se elimină terminaţia (prin diminuarea numărului de litere componente ale cuvântului cu lungimea terminaţiei) şi se apelează analizorul lexical pentru determinarea silabei accentuate yyCuvântLex( ). La ieşirea din analizor, subrutina Pune_Accent restaurează numărul de litere şi actualizează poziţia accentului (în Actualizează_Accent). 255

Cap. 7. Proiectarea sistemului de sinteză de voce în limba română<br />

Procedura Procesare_Silabă adaugă silaba la cuvântul curent ( Adaugă_Silabă), şi apoi<br />

construieşte structura în memorie a cuvântului prin Construieşte_Cuvânt. Tot aici se face şi<br />

eliminarea cratimei din cuvânt, în vederea rostirii (căutarea în baza de date se face după o silabă<br />

care nu trebuie să conţină cratimă).<br />

Subrutina Procesare_Separator este apelată atunci când analizorul întâlneşte un separator<br />

în stream-ul de intrare. Aceasta înseamnă că s-a terminat de citit un cuvânt şi, dacă separatorul<br />

este terminator de propoziţie, s-a încheiat şi propoziţia curentă. Cuvântul este prelucrat şi<br />

analizat din punct de vedere al prozodiei (accentelor) în procedura Procesare_Cuvânt. Apoi se<br />

adaugă cuvântul împreună cu structura de silabe şi accente în propoziţia curentă din memorie<br />

(procedura Adaugă_Cuvânt). Urmează adăugarea în structură a separatorului, care va indica în<br />

momentul rostirii pauza dintre cuvinte, respectiv de la sfârşitul propoziţiei.<br />

Se testează în continuare dacă separatorul este un terminator de propoziţie. În caz<br />

afirmativ, se apelează procedura Potriveşte_Unităţi, care are rolul de a căuta şi identifica<br />

unităţile acustice din baza de date din care se va construi forma de undă corespunzătoare<br />

cuvintelor din propoziţie. Apoi se rosteşte propoziţia în subrutina Rosteşte_Propoziţie.<br />

Potrivirea silabelor din cuvânt cu unităţile acustice se face în funcţie de accentuarea<br />

silabei (dacă silaba este accentuată sau nu) şi după locul silabei în cadrul cuvântului (dacă silaba<br />

este în mijlocul sau la finalul cuvântului). Căutarea în baza de date ţine cont şi de numărul de<br />

litere componente ale silabei. Dacă silaba nu este regăsită ca atare în baza de date, atunci forma<br />

de undă se construieşte pe baza fonemelor şi silabelor cu un număr mai mic de litere ce intră în<br />

componenţa silabei iniţiale. Aşa cum am amintit anterior, pot exista următoarele situaţii:<br />

1. Silaba dorită este regăsită identic în baza de date vocală, atât din punct de vedere<br />

fonetic, cât şi din punct de vedere prozodic. În acest caz silaba se reţine ca atare pentru a fi<br />

înglobată în cuvântul de sintetizat.<br />

2. Silaba este regăsită fonetic, dar nu şi prozodic. Se preferă în acest caz constituirea<br />

acesteia din silabe şi foneme mai scurte, care să respecte prozodia cerută (silabă accentuată sau<br />

neaccentuată).<br />

3. Silaba nu este regăsită fonetic în baza de date. Şi în acest caz silaba va fi compusă pe<br />

baza fonemelor separate extrase din baza de date.<br />

Formele de undă corespunzătoare silabelor sunt concatenate, iar rostirea propoziţiei se va<br />

realiza prin apelul funcţiei API Windows PlaySound( ).<br />

Procesarea unui cuvânt din punct de vedere al prozodiei (accentelor) se face în procedura<br />

Procesare_Cuvânt, ilustrată în diagrama 4. Aici se verifică mai întâi terminaţia cuvântului pentru<br />

a se determina dacă este vorba despre un substantiv care a fost declinat (‚băiatul’, ‚băieţilor’,<br />

etc.). În acest caz se elimină terminaţia (prin diminuarea numărului de litere componente ale<br />

cuvântului cu lungimea terminaţiei) şi se apelează analizorul lexical pentru determinarea silabei<br />

accentuate yyCuvântLex( ). La ieşirea din analizor, subrutina Pune_Accent restaurează numărul<br />

de litere şi actualizează poziţia accentului (în Actualizează_Accent).<br />

255

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!