Studiul Interfetei Microsoft Sapi, Sdk. Comenzi Vocale, Text To Speech, Dictare Si Trimitere E Mail
CUPRINS
Introducere
Prezentarea temei
Lucrarea de față iși propune să prezinte principalele aspete teoretice și practice în legătură cu procesarea vorbirii adică recunoașterea vorbirii și sinteza vocală.
Motivatia alegerii temei
Principala motivație a fost să realizez o aplicație care să folosească tehnologiile procesării vorbirii cu ajutorul namespace-ului System.Speech. care folosește versiunea de SAPI pentru Desktop .
Motivul alegerii acestei teme derivǎ din dorinta de documentare cu privire la tehnologia de recunoaștere a vorbirii care este una din tehnologiile din inginerie cu o creștere foarte rapidă. Ea are o serie de aplicații din diferite domenii și oferă beneficii potențiale. Aproape 20 % din populația lumii suferă de diferite dizabilități; multe dintre ele sunt de vedere sau de imposibilitatea de a folosi mâinile în mod eficient. În aceste cazuri speciale, sistemele de recunoaștere a vorbirii pot oferi un ajutor semnificativ pentru ei, astfel încât aceștia pot împărtăși informatii cu alți oameni prin intermediul calculatorului.
Sumar
Lucrarea este împărțită în două părți principale : prima parte – considerații teoretice iar a doua – rezolvarea temei de proiect ;
În prima parte a lucrării am vorbit despre studiile realizate asupra cercetăriolor din domeniul procesării vorbirii, în principal asupra produselor cu interactivitate vocală apărute pe plan international; a fost făcută o sinteză a situației interne și internaționale în domeniul sistemelor și aplicațiilor de procesare a vorbirii.
După aceea, am prezentat cercetările efectuate asupra metodelor de prelucrare și analiză a semnalului vocal, dar și asupra metodelor de codare în vederea transmiterii datelor audio la distanță. În cadrul metodelor de prelucrare a semnalului vocal am discutat despre tehnica modulării impulsurilor în cod (PCM), Standarul MPEG iar în cadrul metodelor de analiză despre Analiza în domeniul timp și Analiza în domeniul frecvență a semnalului vocal. Următorul obiectiv a fost prezentarea cercetărilor asupra metodelor de sinteză și recunoaștere a vocii. Am expus metodele de sinteză în domeniul timp și în domeniul frecvență. Apoi am evidențiat avantajele dar și dificultățile întâmpinate în procesul recunoașterii vorbirii, am clasificat aceste sisteme și am arătat cateva aplicații care folosesc recunoașterea vocală.
Apoi am vorbit despre caracteristicile unui sistem text-to-speech dar și etapele procesuale ale sintezei TTS. În a doua parte am evidențiat mediile de dezvoltare și tehnologiile folosite în aplicația pe care am creat-o(Net Framework, C#, Speech SAPI,ș.a.). Apoi am descris aplicația care este formată din 4 sub-aplicații care utilizează clasa Speech și anume : Text to Speech, Speech to Text, trimitere E-Mail și comenzi vocale.
Partea I – cosideratii teoretice
I. Studii asupra realizărilor în domeniul procesării vorbirii pe plan național și internațional
Procesarea vorbirii este un domeniu care a evoluat destul de mult in ultimii ani pe plan național și internațional. Problema recunoașterii vorbirii continue (Continuous Speech Recognition) este o problemă departe de a fi rezolvată, cu toate că în domeniul recunoaterii automate a vorbirii (Automatic Speech Recognition) s-au atins rezultate impresionante în ultimii ani.
Odată cu creșterea performanțelor sistemelor de calcul, utilizatorii au acum la îndemână o gamă largă de aplicații începând de la dictarea automată și introducerea de date cu ajutorul vocii, până la servicii interactive de tip cerere-răspuns care solicită un dialog între calculator și operatorul uman. Aplicațiile dedicate persoanelor cu handicap sau deficiențe de vedere sau de vorbire sunt tot mai solicitate, pentru ca și aceste persoane trebuie să beneficieze de o integrare socială cât mai apropiată de standardele la care se află ceilalți membrii ai societății [7], [10].
Procesarea vorbirii cuprinde două domenii de abordare : recunoașterea vorbirii și sinteza vocală.
Recunoașterea vorbirii (speech-to-text) este procesul de identificare a cuvintelor și de ințelegere a mesajului interlocutorului. Acest proces implică următoarele etape: capturarea și digitizarea semnalului vocal, scindarea lui în unități sonore, apoi construirea cuvintelor din aceste unități, și trimiterea textului recunoscut spre aplicație [8].
Arhitectura software utilizată în aplicațiile de recunoastere a vorbirii cuprinde două componente: componenta acustică și componenta lingvistică.
Modulul acustic analizează sunetele vocii, elimină zgomotul de fond, reduce datele la un spectru de frecvente si convertește sunetele in foneme.
Modulul lingvistic analizează conținutul vorbirii și compară combinațiile de foneme cu cuvintele dintr-un vocabular și decide apoi care a fost propozitia sau comanda rostita de vorbitor.
Recunoașterea vorbirii este realizată de o componentă software numită motor de recunoaștere a vorbirii (Speech Recognition Engine SRE). Motoarele de recunoastere a vorbirii suportă două moduri de lucru: dictarea, în care utilizatorul introduce date vorbind direct spre calculator, și comanda(controlul), în care utilizatorul transmite comenzi prin vorbire. De obicei, recunoașterea vorbirii este utilizată pentru a eficientiza utilizarea unor aplicații, sau pentru a accesa anumite funcționalități mai rapid în defavoarea celorlalte dispozitive de intrare.
Aplicațiile care pot fi benefice de pe urma folosirii recunoașterii vorbirii sunt cele în care utilizatorul este nevoit să folosească cât mai puțin mâinile, de exemplu : un șofer care poate schimba melodia, clima și să fie atent la drum în același timp.
Sinteza de voce este procesul invers recunoașterii vorbirii și constă în recompunerea vocii de către sistemul de calcul. Sinteza de voce este strins legată de procesul conversiei unui text in limbaj vorbit, numit text-to-speech. In cadrul acestui proces, are loc o analiză lingvistică a textului pentru a-l separa în unități lexicale (cuvinte, silabe și foneme), apoi unitățile lexicale sunt convertite in semnale sonore care sunt combinate in final pentru a genera vorbirea continua [11],[5].
Situația internă și internațională în domeniul sistemelor de procesare a vorbirii
Situația internă
In țara noastră, interesul pentru prelucrarea automată a vocii s-a manifestat începând de câteva zeci de ani, iar studiile au devenit sistematice dupa 1980. Au fost organizate colective de cercetare in marile Universități, exemple fiind Bucuresti, Cluj, Iași, Timisoara. Ariile de interes ale specialistilor români cuprind domenii ca: recunoașterea automată a vorbirii, recunoașterea și identificarea vorbitorului, sinteza de voce, codificarea vorbirii, procesarea limbajului natural [1].
Există și câteva cursuri de tehnologia vorbirii și procesarea semnalului vocal, cum ar fi cele susținute de prof. Corneliu Burileanu la Facultatea de Electronică și Telecomunicații din Politehnica București, prof. Horia-Nicolai Teodorescu in cadrul Facultății de Electronică și Telecomunicatii a Universitatii Tehnice Gh. Asachi din Iași, Marian Boldea – la Universitatea Politehnica Timișoara, Mircea Giurgiu in cadrul Facultății de Electronică și Telecomunicații a Universității Tehnice din Cluj dar și alții.
Deși s-au obținut rezultate bune în domeniul fiecărui colectiv de cercetare în parte, totuși nu s-a realizat o unificare a eforturilor care să ducă la realizarea unor produse bazate pe tehnologia vorbirii conforme cu standardele internationale, care să poată fi integrate in aplicații software de sine-stătătoare. Este de notat ca in acest moment nu există nici un motor de sinteză pentru limba română care să respecte standardul text-to-speech stipulat de Microsoft – SAPI 5.1 [6]. Piața românească este incă in așteptarea unor aplicații viabile de recunoaștere și sinteză de voce specializate pentru limba română.
Situația pe plan internațional
Pe plan internațional cercetările în domeniul tehnologiei vorbirii au avut avantajul sponsorizării de catre unele companii care urmăresc dezvoltarea unor categorii de produse care să le asigure profituri substanțiale și poziții de lideri pe piață.
Cu câțiva ani in urmă, produsele ce implementau tehnologia vorbirii erau foarte scumpe, erau dificil de utilizat și prezentau o acuratețe scăzută. Însă creșterea performantei sistemelor de calcul și găsirea unor noi metode de abordare au dus la creșterea calitatii acestor produse. De exemplu, în domeniul recunoașterii vocii, de la o rată medie de recunoastere de sub 85% pe care o prezentau primele aplicații, s-a ajuns acum la o rata de peste 95%. La început, dura câteva ore pentru ca sistemul să se acomodeze cu vorbitorul, acum s-a ajuns la un timp de cateva minute, cu rezultate superioare [3].
Compania Microsoft și-a introdus tehnologiile vocale ca seturi API (Application Programming Interface) și unelte pentru dezvoltarea de aplicatii, dand posibilitatea programatorilor să inglobeze aceste tehnologii în interfețele bazate pe voce ale viitorului.
Prima versiune de SAPI a fost lansată în 1995, și a fost susținut pe Windows 95 și Windows NT 3.51 . Această versiune a fost una „low-level” în recunoaterii vorbirii continue.
Astfel, incepând din anul 2000, Microsoft livrează un SDK – Speech SDK 5.0 (Software Developer Kit) special conceput pentru dezvoltatorii de software– actualmente ajuns la versiunea 5.4. Din anul 2004, Microsoft mai ofera o unealtă de dezvoltare ce poate fi utilizată alături de SAPI 5.2, numită Microsoft Speech Server. Acesta este o extensie a platformei ASP.NET pentru accesarea prin voce a unei game largi de dispozitive. Dezvoltatorii de aplicații pot astfel îmbina tehnologia Web, serviciile de procesare a vocii și abilitățile de telefonie mobilă.
În domeniul recunoașterii de voce trebuie amintite marile companii IBM, Lernout & Hauspie, Apple si Philips. Acestea ofera pachete cu funcții vocale de bază sau versiuni mai sofisticate, cu preturi mai mari. Pachetele de software pentru recunoașterea vorbirii se adaptează la utilizatorul individual, în funcție de voce, timbru si accent [3] .
Dintre aplicațiile care implementează tehnologia vorbirii la nivel desktop se pot aminti: Dragon Naturally Speaking al firmei Lernout & Hauspie, care ofera module de dictare automata si comanda aplicațiilor prin voce; Sonic Extractor de la Digital Syphon – oferă suport pentru 22 de limbi, se concentrează pe telefonie și televiziune; Tazti – folosește comenzi vocale pentru jocuri pe calculator și aplicații.
Concluzii asupra situației actuale
Deși cercetările din ultimele decenii si-au adus o contributie importantă în tehnologia sintezei și recunoașterii vorbirii, totuși mai sunt de rezolvat unele aspecte ce țin de performanta aplicatiilor și implementarea unor metode mai adecvate pentru analiza și sinteza vorbirii naturale, cum ar fi: recunoașterea vorbirii in condiții reale nerestricționate, recunoașterea fără ambiguități a semanticii vorbirii umane directe .
In ceea ce privește aplicațiile pentru persoane defavorizate, procesarea vorbirii ocupă un loc important în asistența acordată persoanelor nevazatoare și a celor cu deficiente de vorbire [7],[10]. In Anglia există implementate sisteme complete de sinteza de voce pentru nevazatori ce pornesc de la achiziția de texte prin camera video, recunoașterea textului și rostirea acestuia prin voce sintetizată. La noi in țară nu există asemenea sisteme adaptate special pentru persoanele defavorizate, iar cele implementate pe baza unor programe străine suferă din cauza inadaptabilității acestora la specificul limbii române.
II. Metode actuale de procesare și analiză a semnalului vocal
Prelucrarea și analiza semnalului vocal constituie etapele premergătoare în abordarea sintezei și recunoașterii de voce. Prelucrarea numerică a semnalului vocal cuprinde toate metodele de operare directă asupra semnalului, în special metode de filtrare, codificare și compresie.
2.1 Metode de prelucrare numerică a semnalului vocal
Prelucrarea semnalului vocal începe cu achiziția semnalului de la o sursă, cum ar fi microfonul sau aparatura electronică de înregistrare. Achiziția presupune conversia digitală a semnalului analogic iar apoi filtrarea sa pentru a elimina zgomotul de achiziție. Conversia analog-digitală a semnalului presupune un anumit mod de reprezentare a semnalului în format numeric. Stabilirea unui astfel de mod de reprezentare digitală se numește codarea semnalului.
Cea mai utilizată tehnică folosită în codarea semnalului vocal este tehnica modulării impulsurilor în cod (PCM – Pulse Code Modulation ). Folosind codarea PCM, fiecare eșantion al semnalului este cuantizat(i se atribuie o valoare numerică) independent de celelalte eșantioane. Astfel, un codor PCM determină nivelul de cuantizare al fiecărui eșantion fără să țină cont de nivelul eșantioanelor precedente, iar apoi atribuie acestui nivel de cuantizare un cod binar, ce reprezintă forma codată a semnalului. Ϊn tehnica PCM există diferite moduri de cuantizare a valorii fiecărui eșantion și de asociere a cuvintelor de cod pentru un nivel de cuantizare. Cele mai uzuale tehnici folosite sunt codarea liniară și codarea logaritmică.
Standardul MPEG (Moving Picture Expert Group) este cel mai cunoscut standard de compresie a semnalului audio, oferind o calitate superioară a sunetului. Standardul a fost utilizat pentru compresia sunetului pentru televiziunea digitală.
Se combina in fluxul de date atât semnalul video cât și cel audio, permițând o căutare rapidă înainte și înapoi, pentu aplicații video fiind indispensabil să putem avea acces într-o maniera aleatoare la oricare din imaginile comprimate. MPEG-audio este alcătuit dintr-o familie de trei scheme de codare și compresie. Ele se numesc MPEG-audio nivelul 1, nivelul 2 și nivelul 3.
Algoritmul de compresie MPEG oferă o calitate mai bună a sunetului și rate de compresie mai mari decât tehnicile de codare adaptive.
Algoritmul MPEG-audio este împărțit în mai multe etape :
Semnalul audio este convertit în domeniul frecvență, iar spectrul este divizat în 32 de subbenzi separate ;
Pentru fiecare subbandă se calculează amplitudinea semnalului audio și se determină nivelul zgomotului prin folosirea unui model psihoacustic. Funcția acestui model este de a analiza semnalul de intrare audio cu scopul localizării zgomotului de cuantizare în spectrul frecvență, pentru a putea fi apoi mascat.
În final, fiecare subbandă este cuantizată funcție de nivelul zgomotului de cuantizare din interiorul benzii respective
2.2. Metode de analiză a semnalului vocal
În funcție de domeniul de analiză, se disting două moduri în care se poate face analiza semnalului vocal: în domeniul timp și în domeniul frecvență. Analiza în domeniul timp presupune determinarea proprietăților semnalului vocal din cercetarea formei de undă a semnalului. Analiza în domeniul frecvență presupune determinarea spectrului de frecvențe a semnalului și stabilirea parametrilor doriți pe baza formei spectrale.
2.2.1. Analiza în domeniul timp a semnalului vocal
Prin analizarea directă a formei de undă a semnalului se pot extrage următorii parametrii: amplitudinea medie și maximă, energia semnalului vocal, numărul de treceri prin zero și frecvența fundamentală.
Amplitudinea semnalului ne dă informații despre prezența (absența) semnalului vocal, despre faptul că semnalul este sonor sau nesonor pe segmentul considerat. În cazul sunetelor nesonore (zgomote) amplitudinea este redusă în timp ce în cazul sonor amplitudinea este mare.
Amplitudinea medie pentru N eșantioane se calculează astfel:
, (2.2)
unde: x(m) este eșantionul curent al semnalului vocal, iar
w(n-m) este fereastra utilizată în segmentul considerat.
Energia semnalului este utilă în determinarea caracteristicilor de putere transportată a semnalului vocal. Pentru un semnal cu valoare medie nulă, energia pe termen scurt se definește astfel [4]:
. (2.3)
Segmentele sonore (vocalele) au o energie medie ridicată, pe când consoanele au energie scăzută.
Numărul trecerilor prin zero este util pentru determinarea caracteristicilor de frecvență în interiorul unui segment de timp. Numărul trecerilor prin zero se calculează astfel :
, (2.4)
unde sgn(n) este funcția semn:
. (2.5)
Numărul trecerilor prin zero este o caracteristică ce se folosește în recunoașterea vorbirii, precum și în determinarea caracterului sonor/nesonor. În interiorul segmentelor nesonore, numărul de treceri prin zero este mai ridicat, iar in segmentele sonore parametrul este mai redus.
Frecvența fundamentală este un parametru important utilizat în sinteza și recunoașterea vorbirii. Frecvența fundamentală corespunde cu periodicitatea semnalului vocal. Determinarea acestui parametru nu se poate face întotdeauna cu exactitate, din cauza variabilități semnalului vocal chiar pe porțiuni scurte de timp. Rostirea vocalelor prezintă o frecvență fundamentală ce poate fi determinată, pe când consoanele nu au frecvență fundamentală.
2.2.2. Analiza în domeniul frecvență a semnalului vocal
Principalele metode folosite în cadrul analizei în domeniul frecvență sunt [4]: analiza prin banc de filtre, analiza Fourier, analiza LPC, analiza cepstrală și analiza perceptuală.
Analiza prin banc de filtre digitale are ca scop descompunerea semnalului în benzi de frecvență și determinarea ponderii componentelor din aceste benzi în semnalul inițial.
Analiza Fourier este cea mai răspândită metodă de analiză a semnalului vocal – oferă imaginea completă a componentelor semnalului pe scara frecvenței, rezultând astfel spectrul de frecvențe asociat. Analiza Fourier se bazează pe proprietatea unui semnal periodic de a putea fi descompus în componente sinusoidale.
Această metodă de analiză se bazează pe calculul transformatei Fourier discrete, de forma:
, k = 1,2,…,N , (2.6)
unde: x(n) reprezintă eșantioanele de semnal,
X(k) este valoarea componentei k din spectrul de frecvențe,
N este numărul de eșantioane considerate, iar j este unitatea imaginară.
Calculul se face în domeniul complex, rezultând pentru fiecare componentă X(k) două valori reale corespondente:
modulul sau amplitudinea: Ak= |X(k)| , respectiv
faza: φk=arg(X(k)).
În practică se folosește mai mult spectrul amplitudinilor, pentru ca urechea umană e mai puțin sensibilă la spectrul de faze al unui semnal vocal.
Pentru rapidizare sunt disponibili diverși algoritmi, dintre care cei mai cunoscuți sunt FFT („Fast Fourier Transform”- Transformata Fourier Rapidă) cu decimare în frecvență sau decimare în timp. Algoritmul FFT se bazează pe calculul recursiv al valorilor spectrale [8] și reduce complexitatea algoritmului.
III. Metode de sinteză și recunoaștere a vocii
3.1. Sinteza vorbirii
Sinteza semnalului vocal se referă la generarea automată a semnalului vocal artificial. În ultimii ani această tehnologie a fost implementată pentru mai multe limbi.
În funcție de domeniul de analiză, metodele de sinteză se împart în două categorii:
metode de sinteză în domeniul timp
metode de sinteză în domeniul frecvență
Metodele de sinteză în domeniul timp realizează concatenarea formelor de undă stocate în baza de date vocală.
Cele mai rudimentare sintetizatoare bazate pe aceste metode nu folosesc parametrizarea unităților acustice, utilizând direct forma de undă a semnalului în domeniul timp.
Principalul avantaj al acestor metode este reprezentat de calitatea aproape naturală a vocii sintetizate. Dintre dezavantaje putem vorbi despre faptul că o cantitate importantă de resurse este folosită în procesul memorării formelor de undă, dar și unele dificultăți legate de modificarea prozodiei vorbirii.
Cele mai cunoscute metode în domeniul timp sunt:
– metoda PSOLA, ce folosește principiul compunerii de segmente care se întrepătrund
– metoda bazată pe corpus, ce folosește o bază de date de dimensiuni considerabile având ca scop producerea unei vorbiri de calitate cât mai naturală.
Metodele de sinteză în domeniul frecvență realizează sinteza vocală bazată pe parametrii acustici generați în urma aproximării unor caracteristici spectrale din domeniul frecvență. Pentru a realiza sinteza unui text, prima oară se generează parametrii acustici corespunzători rostirii, iar după acees sunt generate formele de undă ale semnalului vocal [1].
In faza de analiză a sintezei din domeniul frecvență, unitățile acustice separate din rostirea preliminară sunt parametrizate în funcție de caracteristicile spectrale ale semnalului vocal. Parametrii sunt înregistrați într-o baza de date și indexați în scopul unei regăsiri imediate.
In faza de sinteză, unitățile lexicale (silabe, cuvinte, foneme) din textul de sintetizat sunt transformate în secvențe de parametrii regăsiți din baza de date parametrizată. Parametrii acustici sunt prelucrați în funcție de prozodia cerută, iar cu ajutorul acestora vor fi generate formele de undă corespondente.
Avantajul principal al metodelor bazate pe sinteza în domeniul frecvență constă în posibilitatea realizării cu ușurință a aspectelor de prozodie (accent, ritm, intonație) prin calculul și generarea corespunzătoare a parametrilor acustici și spectrali. Un alt avantaj important, rezultă din faptul că în baza de date se păstrează nu formele de undă, ci și parametrii acustici, ceea ce duce la o mare economie de resurse.
Ca dezavantaj trebuie să amintim faptul că parametrizarea rostirii de la intrare în faza de analiză duce la aproximarea semnalului vocal și în faza de reconstrucție a semnalului rezultată va avea o calitate ‚sintetică’, depărtându-se de vorbirea naturală.
Metode care utilizează analiza semnalului vocal în domeniul frecvență :
metoda de sinteză prin predicție liniară (LPC) – ce utilizează o serie de parametrii pentru generarea semnalului vocal numiți coeficienți de predicție;
metoda de sinteză formantică
3.2. Recunoașterea vorbirii
Recunoașterea vorbirii este procesul de extragere automată a informației lingvistice conținută de o undă vocală folosind calculatoare sau circuite electronice. Informația lingvistică, cea mai importantă informație din semnalul vocal. Într-un sens mai larg, recunoașterea vorbirii include și recunoașterea vorbitorului, ceea ce implică extragerea informațiilor individuale caracteristice persoanei care vorbește.
Metodele de recunoaștere automată a vorbirii sunt studiate de multă vreme, cu scopul de a realiza sisteme de interacțiune om-mașină.
3.2.1. Avantajele și dificultățile în procesul recunoașterii vorbirii
Dispozitivele care realizează recunoașterea vorbirii au patru avantaje :
Comanda vocală este ușor de realizat, nu implică eforturi deosebite, cum este cazul scrisului sau lucrului cu butoane.
Vocea introduce informațiile de trei până la patru ori mai repede decât mașinile de scris și de opt până la zece ori mai repede decât scrisul de mână.
Informația poate fi introdusă chiar și când utilizatorul se mișcă sau face alte activități
Costurile introducerii informației sunt mici, deoarece implică folosirea unui microfon sau telefon. Mai mult, pentru o comandă de la distanță se pot folosi rețelele telefonice existente sau Internetul.
Dificultățile întâmpinate în procesul recunoașterii vorbirii sunt:
a.)Probleme legate de coarticulare.
Spectrul unui fonem într-o propoziție sau într-un cuvânt este influențat de fonemele vecine ca o consecință a coarticulării. Această problemă poate fi evitată în cazul recunoașterii de cuvinte izolate folosind cuvinte ca unități lingvistice de bază, performanțele recunoașterii continue depind de gradul de rezolvare al acestui obstacol. Dificultățile sunt date de omisiunile din vorbire, cauzate de o rostire rapidă.
b.)Dificultăți în segmentare.
Spectrul semnalului vocal se schimbă continuu de la o fonemă la alta datorită interacțiunilor dintre ele. Este dificil de determinat marginile fonemei, cu toate că consoanele nesonore pot fi segmentate destul de ușor pe baza variației spectrale, nu același lucru se poate spune și despre sunetele sonore.
c.)Caracteristicile individuale și alți factori care cauzează variabilitatea semnalului vocal.
Caracteristicile acustice variază de la vorbitor la vorbitor chiar și în cazul aceluiași cuvânt rostit; pe de altă parte, fonemele diferite rostite de vorbitori diferiți pot avea același spectru. Zgomotul sau sistemele de transmisiuni afectează de asemenea caracteristicile fizice ale vocii.
d.) Cunoștințe lingvistice insuficiente.
Caracteristicile fizice ale semnalului vocal de cele mai multe ori nu conțin suficientă informație fonetică în și despre ele. Vorbirea în propoziții se bazează pe anumite reguli sintactice pe baza cărora ascultătorul poate prezice următorul cuvânt. Ceea ce se știe în momentul actual legat de structura lingvistică a rostirilor nu ne permite să modelăm mecanismul de folosire a constrângerilor lingvistice în perceperea vorbirii.
3.2.2. Clasificarea sistemelor de recunoaștere a vorbirii
Recunoașterea vorbirii se clasifică în recunoaștere de cuvinte izolate, caz în care sunt identificate cuvinte rostite individual, și recunoaștere continuă, în care sunt recunoscute secvențe rostite în mod continuu. Recunoașterea vorbirii continue se împarte la rândul ei în două părți: transcriere și înțelegere.
Recunoașterea de cuvinte izolate are ca scop recunoașterea fiecărui cuvânt rostit, iar recunoașterea continuă a vorbirii urmărește înțelegerea sensului propozițiilor.
Pe de altă parte, recunoașterea vorbirii continue se poate clasifica în recunoaștere dependentă de vorbitor și recunoaștere independentă de vorbitor.În primul caz, , modelele sunt altele pentru fiecare vorbitor iar sistemele din a doua categorie pot recunoaște rostiri ale oricărei persoane.
Ca și modele se poate utiliza o gamă largă de unități lingvistice, de la foneme până la cuvinte. Când sunt folosite cuvintele, semnalul de intrare digitizat este comparat cu fiecare din referințe, până când este găsită una care se potrivește. Algoritmii bazați pe foneme în schimb, analizează intrarea ca pe un șir de sunete pe care îl convertesc în cuvinte cu ajutorul unui dicționar bazat pe pronunție.
Atunci când vorbim de cuvinte ca unități lingvistice de bază procentul de recunoaștere este ridicat deoarece este eliminată problema coarticulării între cuvinte. Un vocabular mare necesită multă memorie și multe calcule, făcând antrenarea destul de dificilă. De asemenea, cuvintele ca unități lingvistice, nu pot rezolva problema coarticulării în cazul vorbirii continue.
Alegerea celor mai potrivite unități lingvistice pentru recunoașterea vorbirii depinde de tipul recunoașterii (dacă e recunoaștere de cuvinte izolate sau de vorbire continuă) și de mărimea vocabularului.
3.2.3. Recunoașterea continuă a vorbirii
Cele mai complexe sisteme de recunoaștere sunt cele care realizează recunoașterea continuă a vorbirii. Utilizatorul rostește un mesaj, iar sistemul trebuie să fie capabil să îl înțeleagă. Printre problemele greu de rezolvat amintim : funcționarea în condiții de zgomot, determinarea capetelor rostirii (vorbitorul vorbind într-o manieră liberă, fără constrângeri) sau efectele datorate coarticulării.
Procesul de recunoaștere a vorbirii are la bază o căutare al cărei scop este găsirea unei secvențe de cuvinte care are probabilitatea cea mai mare de a fi generat semnalul vocal de la intrarea sistemului. Căutarea se face pe baza așa numitelor ”surse de cunoștințe”. Acestea pot fi: un dicționar care conține cuvintele care pot fi recunoscute, un model lingvistic, care atașează o probabilitate fiecărei secvențe de cuvinte și un model acustic, care modelează relația dintre vectorii de parametri și foneme.
Figura 3.2.1. Structura unui sistem de recunoaștere a vorbirii.
Procesul de recunoaștere poate fi modelat ca un sistem de comunicație și este împărțit în patru etape (Figura 3.2.1): generare text, producere vorbire, procesare acustică și decodare lingvistică. Vorbitorul este un traductor care transformă în vorbire textul gândurilor pe care intenționează să le comunice interlocutorilor.
Gândurile sunt, din punctulul de vedere al sistemului de comunicație, sursa de informație. Secvența de date se transmite pe un canal. În cazul sistemului de recunoaștere, canalul acustic este format din partea de producere a vorbirii și cea de procesare acustică. La intrarea canalului avem secvența de cuvinte W, care la ieșire este convertită în secvența de observații acustice Y, decodată iar apoi în secvența estimată de cuvinte , cu ajutorul decodorului lingvistic. Se poate scrie că
.
3.2.4. Modele Markov cu stări ascunse aplicate în recunoașterea vorbirii
Pentru implementarea recunoașterii vorbirii avem nevoie de un model cu ajutorul căruia să putem descrie condițiile în care se produce vorbirea. Modelul este util pentru procesarea semnalelor (de exemplu eliminarea zgomotului) dar și pentru a identifica sursa care le-a generat; modelele pot rezolva probleme de predicție, recunoaștere sau identificare.
Vorbirea este alcătuită din succesiuni de foneme. Fiecare dintre aceste foneme poate fi privită ca o stare a unui proces. Așadar, succesiunea de foneme este o succesiune de stări.
Vorbirea poate fi descrisă de un model cu mai multe stări. La trecerea dint-o stare în alta se emite un simbol (fonemă). Trecerea dintr-o stare în alta este aleatoare, într-o anumită măsură, deoarece după o fonemă oarecare poate urma o alta dintr-un grup restrâns. Avem de-a face deci cu un model statistic, cunoscut sub denumirea de model Markov.
Modelul Markov ascuns (MMA) este un model probabilistic foarte des utilizat și care duce la rezultate încurajatoare în domeniul recunoaterii vorbirii. Descrierea teoretic a modelului a fost dat de Baum în 1967, dar aplicaiile în domeniul recunoașterii semnalului vocal au apărut numai începând cu anul 1975 și sunt legate de numele lui Baker și Jelinek.
Un MMA conține doua procese :
secvența de stări X a modelului care conține informații privind structura temporală a vorbirii
setul de ieșiri sau simboluri de observații O ale stărilor care modeleză caracterul staționar al vorbirii
Modelul se numește ascuns, deoarece secvența de stări X nu este observabilă în mod direct.
Un MMA poate reprezenta o unitate lingvistică : un cuvânt, un fonem, o propoziție sau o frază. Unitatea lingvistică utilizată pentru recunoașterea vorbirii continue este fonemul. Ea stă la baza vorbirii. Orice cuvânt poate fi format prin concatenarea fonemelor iar orice frază sau propoziie poate fi construită prin înșirarea cuvintelor. Formarea cuvintelor din foneme este constrânsă de lexic, iar formarea propoziiilor din cuvinte este supervizată de reguli gramaticale.
Într-un asemenea sistem, în care avem mai multe modele Markov, câte unul pentru fiecare unitate lingvistică, probabilitatea condiționată ca o secvență de observație O să fie generată de un anumit model M care trece prin secvența de stări X se poate calcula relativ simplu, înmulind probabilitățiile de tranziție și probabilitățiile de apariție a unui simbol.
Într-un MMA însă secvența de stări X nu este cunoscută (de aceea se numește model ascuns). Pentru a calcula în aceste condiții probabilitatea condiționată, ca secvența de simboluri de observație O să fie generată de modelul M, trebuie să însumăm probabilitățiile pentru toate secvențele de stări posibile din model.
Pentru a putea fi utilizate pentru recunoașterea vorbirii trebuie rezolvate trei probleme importante în cazul MMA:
Problema evaluării. Dându-se secvența de observații și un model , care este probabilitatea ?
Problema alegerii secvenței optime de stări. Fiind dată secvența de observații și un model să se determine succesiunea de stări ale modelului care a generat secvența de observații .
Problema antrenării. Presupune ajustarea parametrilor modelului în vederea maximizării probabilității .
Modelele Markov cu stări ascunse pot fi împărțite în modele discrete și modele continue, în funcție de natura observațiilor atașate fiecărei stări.
În cazul Modelului Markov ascuns cu observații discrete, setului de observații i se impun anumite constrângeri : observațiile nu pot lua decât un numr finit de valori discrete : astfel observațiile aprute în mod natural sunt repartizate în setul de observații permise prin metoda cuantizrii vectoriale. Pentru a rezolva problema recunoașterii, trebuie să cunoaștem doar probabilitatea de apariție a simbolurilor pentru fiecare stare a modelului. Aceste probabilități se numesc probabilități de observație.
Implementarea unui model Markov continuu este posibilă folosind ca funcție densitate de probabilitate mixturile Gaussiene, însă numărul necesar de calcule este foarte mare și crește odată cu numrul funcțiilor Gaussiene din componența mixturii.
3.2.5. Aplicații care folosesc recunoașterea vocală
În principiu, orice aplicație care necesită interacțiune cu utilizatorul poate beneficia de o interfață de control vocală. Totuși, aplicațiile de recunoaștere vocală au o aplicabilitate marită înurmătoarele domenii:
Dictare – folosită în contextul domeniilor medicale si de afaceri, unde pot fi folosite un set de vocabulare speciale pentru a mări rata de recunoaștere a sistemului.
Comandă și control – sistemele sunt configurate să execute o anumită acțiune la recunoașterea unui cuvânt (a unei comenzi).
Telefonie – având în vedere că interacțiunea telefonică este in proporție de 90% realizată prin voce, recunoașterea vocală este foarte importantă în acest domeniu (ex: unele sisteme de poștă vocală permit utilizatorilor să vorbească comenzile, în loc să apese tastele telefonului)
Medical(Persoane cu handicap) – multe persoane care nu pot folosi tastatura/mouse-ul din cauza unei boli, pot folosi cu ușurință diferite interfețe vocale (ex: persoane care au auzul deficitar, pot folosi o aplicație pe telefonul mobil care transformă informația vorbită în text)
Aplicații embedded – folosite cu precădere în industria automobilistică, unde utilizatorul trebuie să fie atent la drum, si nu la interfața grafică a computerului de bord.
3.3. Sistemul Text-to-Speech
3.3.1. Caracteristicile unui sistem text-to-speech. Metode de bază folosite.
Sistemul text-to-speech(TTS) este sistemul care asigură realizarea unui proces complet de conversie a unui text în vorbire continuă. În cadrul acestui proces sunt prezente două faze distincte: faza de analiză lingvistică și faza de generare a parametrilor acustici, așa cum putem vedea în figură:
Figura 3.3.1. Sistemul text-to-speech
Analiza lingvistică are ca scop principal identificarea unităților lingvistice din cadrul textului, ca de exemplu : propoziții, cuvinte, silabe, foneme. Generarea parametrilor acustici urmărește extragerea dintr-o bază de date vocală a parametrilor corespunzători unităților lingvistice. Pe baza acestor parametrii, un sintetizor vocal va genera rostirea propriu-zisă.
Există trei metode de bază în sinteza text-to-speech: metoda bazată pe concatenarea formelor de undă, metoda bazată pe analiză-sinteză, și metoda bazată pe reguli [2].
Metoda bazată pe concatenarea formelor de undă, este o metodă simplă care presupune înregistrarea în baza de date vocală a sunetelor înregistrate ca atare (codificate sau nu). Rostirea este generată prin alăturarea înregistrărilor ce corespund unităților lingvistice al textului de sintetizat.
Metoda are ca avantaj calitatea ridicată a vorbirii sintetizate, având rata debitului de date de 64-128 kbit/s (fără codificare). Calitatea rostirii depinde de calitatea unităților acustice stocate în baza de date vocală, precum și de modul de conectare al unităților acustice.
Este dificilă schimbarea trăsăturilor prozodice ale vorbirii: intonație, ritm, accent și timbru.
Figura 3.3.2. Metoda bazată pe concatenarea formelor de undă
In cadrul metodei bazată pe analiză-sinteză, formele de undă preînregistrate sunt schimbate în secvențe de parametrii care se memorează în baza de date vocală. Metoda presupune două faze distincte: faza de analiză și faza de sinteză.
Metoda este ilustrată în figura următoare:
Figura 3.3.3. Metoda bazată pe analiză-sinteză
Analiza se bazează pe un model de producție vocală, care este specific metodei folosite. Astfel, unitățile sonore preînregistrate sunt analizate în concordanță cu acest model de producție vocală, se parametrizează și se înregistrează în baza de date secvența de parametrii corespunzătoare unitaților acustice. Sinteza va rezulta în urma compunerii secvențelor de parametrii caracteristici fiecărei unități.
Rata debitului de date este mult mai redusă, în cazul metodei bazată pe analiză-sinteză datorită avantajului parametrizării, și anume de 2,5-9 kbit/s.
Metoda bazată pe reguli are la intrare o secvență de litere sau simboluri fonematice, un set de parametrii care modelează trăsăturile prozodice ale secvenței și un set de reguli de sinteză fonetice și lingvistice care specifică modalitățile de recompunere a unităților acustice pentru a genera rostirea [2].
Metoda este ilustrată în figura următoare:
Figura 3.3.4. Metoda bazată pe reguli
Se memorează în baza de date parametrii caracteristici pentru unitățile elementare cu care se lucrează (foneme, difoneme, silabe). In faza de sinteză, unitățile se vor concatena pe baza unor reguli de concatenare. Trăsăturile prozodice (amplitudine, tonalitate, durată) se controlează printr-un set de reguli prozodice ce se aplică pentru fiecare unitate în parte.
Calitatea sintezei depinde în acest caz atât de calitatea unităților elementare înregistrate în baza de date, cât și de modul de realizare și performanța regulilor prozodice și de concatenare [2].
3.3.2. Etape procesuale în cadrul sintezei text-to-speech
Etapele procesuale ale sintezei text-to-speech se împart în două categorii [2]:
Analiza textului de la intrare în scopul obținerii unei reprezentări fonetice și prozodice a textului;
Transformarea reprezentării fonetice-prozodice în semnal vocal, pe baza folosirii unor reguli de sinteză.
Analiza textului cuprinde: preprocesarea lingvistică, analiza sintactică și lexicală, transcrierea fonetică și determinarea prozodiei.
Preprocesarea lingvistică este prima etapă în analiza textului de la intrare, aici se urmărește aducerea textului la o formă normalizată. Se refac abrevierile (de exemplu „Dr.” devine „doctor”), se transformă numerele care apar ca cifre în numere exprimate literar și se detectează terminatorii de propoziție, care vor da informații despre tipul propoziției (` . ` ` ? ` `! ` , ce corespund cu o propoziție afirmativă, interogativă, respectiv imperativă).
Analiza sintactică este o fază importantă pentru că aduce textul la o formă corectă din punct de vedere gramatical, se cunoaște faptul că orice greșeală de scriere a unui cuvânt îl poate face greu inteligibil în urma sintezei vocale. Cuvintele sunt confruntate cu modul corect de scriere așa cum apar într-un dicționar, și în cazul limbii române, se verifică corectitudinea inserării diacriticelor (`ă` `î` `ș` `ț`).
Urmează etapa de determinare a unităților lexicale, efectuată prin intermediul unui analizor lexical sau al unui parser. Aici se determină unitățile textuale dorite, cum ar fi: propoziții, cuvinte, silabe, foneme. Dacă de exemplu se dorește regăsirea silabelor din cadrul cuvintelor, analizorul va trebui să fie ghidat de un set de reguli sintactice și de despărțire a cuvintelor în silabe.
Etapa de transcriere fonetică are ca scop realizarea unei transcrieri standardizate a fonemelor din text folosind un set de simboluri fonetice standardizate ( de exemplu grupul `che` va avea transcrierea fonetică [ce]).
Urmează etapa de determinare a prozodiei pentru segmentele vocale analizate. Pe baza unor reguli prozodice specifice limbii, se va determina accentul, intonația și ritmul corect pentru fiecare unitate fonematică. Regulile prozodice se aplică atât la nivelul propozițiilor cât și în interiorul cuvintelor.
Pe lângă prozodia lingvistică, care se determină pe baza analizei lingvistice a textului se ține cont și de prozodia emoțională, pentru a simula stările emoționale pe care le poate avea un vorbitor (bucurie, teamă, liniște, etc.).
După aceste etape de analiză a textului, urmează etapele din faza de sinteză : prima etapă este etapa de generare a parmetrilor acustici pentru sinteză. Pe baza simbolurilor fonematice care provin din etapa de transcriere fonetică și a modificărilor prozodice determinate pe baza regulilor privind intonația și ritmul, se generează secvența de parametrii corespunzătoare textului de sintetizat.
Faza de sinteză propriu-zisă, în care secvențele de parametrii se transformă în forme de undă care pot fi redate sonor prin intermediul unui dispozitiv audio. Constituirea formelor de undă din secvența de parametrii se realizează pe baza unor reguli de sinteză bine determinate.
Etapele procesuale ale sintezei TTS sunt ilustrate în figura următoare:
Figura 3.3.5. Etapele procesuale ale sintezei TTS [2]
Partea II – rezolvarea temei de proiect
Medii de dezvoltare și tehnologii folosite
Platforma .NET
.NET este un cadru (framework) de dezvoltare software unitară care permite realizarea, distribuirea și rularea aplicațiilor-desktop Windows și aplicațiilor WEB.
Tehnologia .NET pune laolaltă mai multe tehnologii (ASP, XML, OOP, SOAP, WDSL) și limbaje de programare (VB, C++, C#, J#) asigurând totodată atât portabilitatea codului compilat între diferite calculatoare cu system Windows,cât și reutilizarea codului în programe, indiferent de limbajul de programare utilizat.
Pentru a dezvolta aplicatii pe platforma .NET este bine sa avem 3 componente esențiale:
• un set de limbaje (C#, Visual Basic .NET, J#, Managed C++, Smalltalk, Perl, Fortran, Cobol, Lisp, Pascal etc),
•un set de medii de dezvoltare (Visual Studio .NET, Visio),
•și o bibliotecă de clase pentru crearea serviciilor Web, aplicațiilor Web și aplicațiilor desktop Windows
.NET Framework
Ajunsă astăzi la versiunea 4.5 este o componentă livrată înpreună cu sistemul de operare Windows, stă la baza tehnologiei .NET este ultima interfață între aplicațiile .NET și sistemul de operare actualmente conține:
Limbajele C#, VB.NET, C++ și J#. Pentru a fi integrate în platforma .NET toate aceste
limbaje respectă niște specificații OOP numite Common Type System (CTS). Ele au ca elemente de bază: clase, interfețe, tipuri valoare și referință, delegări, iar ca mecanisme: moștenire, polimorfism și tratarea excepțiilor.
Platforma comună de executare a programelor numită Common Language Runtime(CLR), utilizată de toate cele 4 limbaje.
Ansamblul de biblioteci necesare în realizarea aplicațiilor desktop sau Web numit Framework Class Library(FCL)
Figura 1. Arhitectura . NET Framework
Limbajul C#
C # este destinat să fie un limbaj de programare simplu, modern, de uz general, orientat-obiect; a fost dezvoltat de o echipă de ingineri de la Microsoft, echipă din care s-a evidențiat Anders Hejlsberg Versiunea cea mai recentă este C # 5.0, care a fost lansat pe 15 august, 2012
C# este un limbaj simplu, cu circa 80 de cuvinte cheie, și 12 tipuri de date predefinite.
El permite programarea structurată, modulară și orientată obiectual, conform perceptelor moderne ale programării profesioniste.
Principiile de bază ale programării pe obiecte (incapsulare, mostenire, polimorfism) sunt elemente fundamentale ale programării C#.
În limbajul moștenește sintaxa și principiile de programare din C++. Sunt o serie de tipuri noi de date sau funcțiuni diferite ale datelor din C++, iar în spiritul realizării unor secvențe de cod sigure, unele funcțiuni au fost adăugate (de exemplu, interfețe și delegări), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate (moștenirea multiplă și pointerii către funcții). Unele funcțiuni (cum ar fi accesul direct la memorie folosind pointeri) au fost păstrate, dar secvențele de cod corespunzătoare se consideră ”nesigure”. [12]
Mediul de dezvoltare utilizat este Microsoft Visual Studio Express versiunea 2012.
Microsoft Speech API sau SAPI(Speech Application Programming Interface)
Este un API dezvoltat de Microsoft pentru a permite utilizarea recunoaștererii vorbirii și sinteza vorbirii în aplicațiile Windows. Aplicațiile care utilizează SAPI includ Microsoft Office , Microsoft Agent și Microsoft Speech Server .
Toate versiunile de API au fost proiectate astfel încât un dezvoltator de software să poată scrie o aplicație pentru a efectua recunoașterea și sinteză vorbirii prin utilizarea unui set standard de interfețe, accesibil dintr-o varietate de limbaje de programare. În plus, este posibil ca o companie să iși producă propriile lor motoare(“engine”) sau să adapteze motoarele existente pentru a lucra cu SAPI în Recunoașterea vorbirii și Text-To-Speech.
În principiu, atât timp cât aceste motoare sunt conforme cu interfețele ele pot fi utilizate în locul motoarelor Microsoft-furnizate. În general, Speech API este o componentă distribuită în mod gratuit, care pot fi livrată cu orice aplicatie Windows care dorește să utilizeze tehnologia de vorbire. Au existat două "familii" principale ale API Microsoft Speech. Versiunile SAPI la 1 la 4 sunt asemănătoare între ele, cu caracteristici suplimentare din fiecare versiune nouă. SAPI 5 totuși a fost o cu totul nouă interfață, lansată în 2000.
În SAPI 5 aplicațiile și motoarele nu comunică direct unele cu altele. În schimb, fiecare vorbeste cu o componentă de execuție (sapi.dll). Există un API implementat prin această componentă care folosește aplicații, și un alt set de interfețe pentru motoare. Următoarele componente sunt printre cele incluse în cele mai multe versiuni ale Speech SDK:
Fișiere API definite – ca C sau C ++ sau fișiere antet.
Componente Runtime – de exemplu sapi.dll.
Panou de control applet – pentru a selecta și configura „speech recognizer si synthesizer” implicit.
Motoare Text-to-Speech în mai multe limbi.
Motoarele de recunoaștere a vorbirii în mai multe limbi.
Componentele redistribuibile
Cod pentru aplicații șablon
Documentație.
Platforma Microsoft Speech constă dintr-un kit de dezvoltare software (SDK), un Runtime, și Runtime folosit pentru limbă (pachete lingvistice care permit recunoașterea vorbirii sau text-to-speech pentru o anumită limbă) pe care le puteți redistribui cu aplicațiile.
SDK și Runtime acceptă în prezent 26 de limbi. Versiunea pachetul lingvistic trebuie să se potrivească cu versiunea Runtime pe care o utilizați.
Microsoft Speech SDK Platform 11 oferă un set complet de instrumente de dezvoltare pentru construirea de aplicații cu control vocal care infulențează motoarele de vorbire Microsoft redistribuibile.
Puteți utiliza tehnologiile și instrumentele în Microsoft Speech Platform SDK 11 pentru a oferi aplicațiilor capacitatea de a recunoaște cuvintele rostite (de recunoaștere a vorbirii) și pentru a genera vorbirea sintetizată (text-to-speech). Folosind acest SDK, puteți oferi utilizatorilor o modalitate eficientă și naturală de a interacționa cu aplicațiile, completând utilizarea mouse-ului, tastaturi, controlerelor.
Microsoft Speech Platform SDK 11 include un ghid de programare și secțiuni de referință pentru a ajuta utilizatorii să învețe să folosească interfețele de programare a aplicațiilor (API) , de a gestiona Microsoft Speech Runtime 11 și motoarele de recunoaștere și sinteză a vorbirii. Secțiunile de ghidare de programare și de referință conțin porțiuni de cod, acestea sunt disponibile în folderele în care ați instalat Platforma Speech SDK 11.
Cerinte
a.)Cerințe software
Următoarele sisteme de operare oferă suport pentru Speech Platform SDK 11.
Cerințe minime hardware
CPU 1 GHz
512 MB RAM
10 GB hard disk
Adaptor de rețea Ethernet
Microfon
Placă de sunet
Configurarea recomandată Hardware
CPU 2GHz
1 GB RAM
40+ hard disk SATA GB
Adaptor de rețea Ethernet
Microfon de înaltă calitate
Placă de sunet cu redarea sunetelor foarte clar
Placa de sunet
Vorbirea necesită lățime de bandă relativ scăzută, de înaltă calitate placă de sunet pe 16 biți va fi suficientă .
Sunetul trebuie să fie activat, iar driver-ul corespunzător să fie instalat. Se recomandă plăcile de sunet, cu conversie „curată” A / D (analog – digital), dar de cele mai multe ori claritatea eșantionului digital este dependentă de calitatea microfonului și de zgomotul de mediu. Unele sisteme de recunoaștere a vorbirii ar putea necesita o plăcilă de sunet specifică.
Microfonul
Un microfon de calitate este cheia atunci când se utilizează recunoașterea vorbirii.
Microfoane Desktop nu sunt recomandate în sistemele de recunoaștere a vorbirii, pentru că au tendința de a ridica zgomotul ambiental.
Cea mai buna alegere, și cel mai utilizat este stilul cască(headset). Acesta permite zgomotul ambiant să fie redus la minimum, în timp ce puteți avea microfonul în dreptul gurii tot timpul.
Microfoanele performante de tipul „headset” pot costa mai mult decât software-ul de recunoaștere a vorbirii pe care îl folosiți, dar dacă aveți de gând să vă petreceți o mulțime de timp dictând, cantitatea de timp pe care o salvați utilizând software-ul de recunoaștere a vorbirii asigură că acea investiție a meritat.
Microsoft Office 2010 – folosit pentru documentație
Paint – folosit pentru editarea de Print Screen-uri
2.) Descrierea aplicației
Primul lucru pe care trebuie sa îl facem este să configurăm mediu de dezvoltare pentru System.Speech , pentru a avea acces la “namespace-ul” System.Speech trebuie să avem instalat Microsoft .NET Framework 4 (Web Installer). În proiectul Visual Studio, se adaugă o referință la System.Speech, după cum urmează:
În fereastra Solution Explorer, faceți click dreapta pe References, apoi click pe Add Reference.
În fereastra Add Reference, în fila .NET, derulați până când găsiți System.Speech și selectați-l și apoi click pe OK
.
Am realizat o aplicație care este formată din 4 sub-aplicații pentru a arăta funcționalitățile clasei Speech de la Microsoft.
Dacă apăsăm tasta 1 se va deschide un formular în care utilizatorul poate scrie un text iar computerul să transforme textul in vorbire(Text to Speech);
Dacă apăsăm tasta 2 se va deschide un formular de Speech Recognition(Speech to Text);
Dacă apăsăm tasta 3 se va deschide un formular în care utilizatorul poate trimite mesaje electronice prin comandă vocală ;
Dacă apăsăm tasta 4 se va deschide un formular în care utilizatorul va lansa în execuție diferite programe(procese, comenzi) prin control vocal ;
Pentru a primi notificari referitoare la apăsarea tastelor,în proprietățile formularului aplicației, proprietatea KeyPreview trebuie setata true (în mod implicit ea este false).
Dacă s-a apăsat vreo tastă(1,2,3,4) deschidem formularul corespunzător tastei apăsate.
2.1. Aplicație care realizează sinteza vorbirii (text to speech- TTS)
Dacă apasăm tasta 1, se deschide interfața pentru Text to Speech, aici avem un richTextBox in care scriem textul ce urmează a fi transformat in vorbire.
Primul lucru pe care trebuie sa îl facem este să introducem namespace-ul System.Speech.Synthesis
System.Speech.Synthesis namespace conține clase pentru inițializarea și configurarea unui motor de sinteză de vorbire(speech synthesis engine), pentru crearea de solicitări, pentru generarea de vorbire, pentru a răspunde la evenimente, precum și pentru modificarea caracteristicilor de voce.
Clasa SpeechSynthesizer oferă acces la funcționalitatea motorului de sinteză a vorbirii care este instalat pe calculatorul gazdă. Motoarele de sinteza vorbirii instalate sunt reprezentate de o voce, de exemplu Microsoft Anna.
O instanță SpeechSynthesizer initializeaza vocea implicit.
Pentru a utiliza alte voci instalate, trebuie sa apelăm metoda SelectVoice sau SelectVoiceByHints, pentru a primi informații despre ce voci sunt instalate folosim metoda GetInstalledVoices .
Când apăsam butonul Speak, din interfață, apelăm metoda SpeakAsync.
SpeakAsync generează la ieșire vorbirea asincronă de la un șir(string).
Utilizăm SpeakAsync dacă aplicația trebuie sa îndeplinească sarcini în timp ce vorbește, de exemplu : pentru a evidentia text(highlight text), controla monitorul sau alte sarcini.
În timpul apelului la această metodă, SpeechSynthesizer poate produce următoarele evenimente :
StateChanged – se produce atunci cand starea SpeechSynthesizer se schimbă
SpeakStarted – se produce atunci cand sintetizatorul începe generarea vorbirii
SpeakProgress – se produce de fiecare data când sintetizatorul termină pronunțarea unui cuvânt
BookmarkReached – se produce atunci când sintetizatorul întâlnește un marcaj într-un prompt.
VoiceChange – se produce când vocea celui care vorbește se schimbă din punctual de vedere al sintetizatorului
SpeakCompleted – se produce când sintetizatorul termină o operație.
Dacă aplicația dumneavoastră nu trebuie să efectueze sarcini în timp vorbește, puteți utiliza metodele Speak sau SpeakSsml pentru a genera vorbirea sincronă.
Dacă apăsăm butonul Pause, se întrerupe vorbirea de la „prompt” – apelam metoda Pause din obiectul Speech.Synthesis.
Prin butonul Resume, se reia vorbirea de la „prompt” – apelam metoda Resume din obiectul Speech.Synthesis după ce a fost întrerupt.
În cazul în care dorim să anulăm toate operațiunile din sinteză de vorbire, apelam metoda SpeakAsyncCancelAll – prin apăsarea butonului Stop.
Din meniu putem selecta Save to WAV, pentru a salva textul sintetizat într-un fișier de tipul WAV.Apelăm metoda SetOutputToWaveStream care are ca parametru : Stream audioDestination.
Primul pas pe care trebuie sa îl facem este sa specificăm locul unde va fi salvat fișierul WAV, creăm o instanță a obiectului Save File Dialog.
Apoi configurăm obiectul SpeechSynthesizer pentru a adăuga la ieșire la un flux care conține forme de undă în format audio
Pentru a elibera referința SpeechSynthesizer catre flux, trebuie să reconfigurăm ieșirea sintetizatorului, de exemplu prin apelul metodei SetOutputToNull . Pentru alte opțiuni de configurare de ieșire, putem utiliza metodele SetOutputToAudioStream , SetOutputToDefaultAudioDevice , SetOutputToNull și SetOutputToWaveFile .
Stephen Hawking este unul dintre cei mai faimși oameni care utilizeză un disozitiv de generare a vorbirii.
2.2 Aplicație care realizează recunoașterea vorbirii (Speech Recognition)
Se deschide interfata pentru Speech Recognition :
Introducem namespace-ul Speech.Recognition :
Namespace-ul System.Speech.Recognition conține tipuri de tehnologie Windows Desktop Speech pentru implementarea recunoașterii vorbirii. Software-ul Windows Desktop Speech Technology oferă o infrastructură de bază de recunoaștere a vorbirii care digitalizează semnalele acustice, recuperează cuvinte și elemente de vorbire de intrare audio. Aplicațiile utilizează spațiul de nume(namespace-ul) System.Speech.Recognition pentru a accesa și extinde tehnologia de bază de recunoaștere a vorbirii prin definirea algoritmilor pentru identificarea și acționarea în fraze sau modele de cuvinte.
Crearea de Grammar-uri
Se pot crea „grammar-uri”, care constau dintr-un set de reguli sau restricții, pentru a defini cuvintele și expresiile(frazele) pe care aplicația le va recunoaște ca intrare semnificativă. Folosind un constructor al clasei Grammar, putem crea obiecte grammar în timpul rulării instanțelor GrammarBuilder sau SrgsDocument, sau dintr-un fișier, un șir sau un flux care conține o definiție a grammar-ului.
Cu ajutorul claselor GrammarBuilder și Choices putem crea prin programare(grammars programmatically) “grammar-uri” de complexitate mica sau medie care pot fi utilizate pentru a efectua recunoașterea mai multor scenarii posibile. Pentru a crea “grammars programmatically” care să fie conforme cu Speech Recognition Grammar Specification 1.0 (SRGS) și să profite de avantajele flexibilității oferite de SRGS vom utiliza namespace-ul System.Speech.Recognition.SrgsGrammar. De asemenea putem crea formatul “XML SRGS grammars” utilizând orice editor de text și de a folosi rezultatul pentru a crea GrammarBuilder, SrgsDocument , sau obiecte Grammar.
În plus, clasa DictationGrammar ofera un caz special de grammar pentru a susține un model de dictare convențional.
Speech Recognition Engine(Motor Recunoaștere vorbire)
Instanțele SpeechRecognizer și SpeechRecognitionEngine furnizate împreună cu obiectele Grammar asigură accesul primar la motoarele de recunoaștere vocală ale Windows Desktop Speech Technology.
Putem utiliza clasa SpeechRecognizer pentru a crea aplicații client care utilizează tehnologia de recunoaștere a vorbirii furnizată de Windows, pe care o putem configura prin panoul de control(Control Panel). Astfel de aplicații acceptă intrarea prin mecanisme audio implicite de intrare a unui computer.
.
Dacă folosim clasa SpeechRecognitionEngine , nu vom vedea Windows Speech Recognizer, SpeechRecognitionEngine este motorul unui SpeechRecognizer. Pentru a putea aveam mai mult control asupra configurației și a tipul de motor de recunoaștere, construim aplicația utilizând SpeechRecognitionEngine, care se execută în proces. Folosind clasa SpeechRecognitionEngine, putem selecta dinamic intrarea audio de la dispozitive, fișiere sau fluxuri.
Această clasă ofera control asupra diferitelor aspecte ale recunoașterii vorbirii, după cum urmează:
Pentru a crea recunoașterea vorbirii “in-process”, utilizăm unul din constructorii SpeechRecognitionEngine ;
Pentru a gestiona grammar-urile recunoașterii vorbirii, utilizăm metodele LoadGrammar , LoadGrammarAsync, UnloadGrammar și UnloadAllGrammars ;
Pentru a configura intrarea în “recognizer”, utilizăm metodele SetInputToAudioStream , SetInputToDefaultAudioDevice , SetInputToNull , SetInputToWaveFile sau SetInputToWaveStream ;
Pentru a efectua recunoașterea vorbirii, utilizăm metodele Recognize sau RecognizeAsync
Pentru a sincroniza modificările aduse de “recognizer”,utilizăm metoda RequestRecognizerUpdate. Recunoașterea utilizează mai mult de un fir pentru a efectua sarcini.
Metoda AppendDictation oferă acces, in mod implicit la dictarea liberă, furnizată de Microsoft Speech Platform SDK 11. Principala problemă este aceea că dacă recunoașterea nu se face într-un context, cuvintele nu sunt în cea mai bună calitate.
Metoda SetInputToDefaultAudioDevice configurează obiectul SpeechRecognitionEngine pentru a primi informații de la dispozitivul audio implicit. Clasa SpeechRecognizer nu conține această metodă.
Proprietatea InitialSilenceTimeout primește sau setează intervalul de timp în care motorul de recunoștere a vorbirii acceptă intrarea care conține numai tăcere(silence) înainte de a finaliza recunoașterea. Fiecare sistem de vorbire are un algoritm care distinge între tăcere și vorbire. În cazul în care intervalul Initial silence timeout este setată la 0, sistemul de recunoaștere nu efectuează o verificare inițială. Intervalul timeout poate fi orice valoare non-negativă. Valoarea implicită este 0 secunde. Proprietatea BabbleTimeout primește sau setează intervalul de timp în care motorul de recunoștere a vorbirii acceptă introducerea care conține numai zgomot de fond, înainte de a finaliza recunoașterea. Sistemul de recunoaștere clasifică orice intrare “non-silence” ca fiind zgomot de fond dacă aceasta nu se potrivește cu regula initial stabilită de sistem.
Dacă proprietatea BabbleTimeout este setată la 0, sistemul de recunoaștere nu efectuează o verificare. Intervalul timeout poate fi orice valoare non-negativă, valoarea implicită este 0 secunde.
Apoi, se adaugă acest “event handler”:
În cazul în care vorbirea este recunoscută, metoda _recognizer_SpeechRecognized va fi invocată(apelată). Va trebui să cream această metoda :
Utilizând MethodInvoker Delegate invocăm firul principal. Facem acest lucru astfel încât să putem apela funcțiile de bază la firul principal fără „cross threading”.
e.Result.Text va conține textul recunoscut; Proprietatea Confidence – primește o valoare, atribuită de Recognizer, care reprezintă probabilitatea ca un RecognizedPhrase(conține informații detaliate, generate de recunoașterea vorbirii, despre intrarea recognized) corespunde un input dat. Este o măsură relativă a certitudinii recunoașterii corecte a unei fraze. Valoarea este între 0.0-1.0, încredere mica , respective mare.
Scorurile de încredere(Confidence scores) nu indică probabilitatea absolută că o frază a fost recunoscută în mod corect. În schimb, scorurile de încredere oferă un mecanism pentru compararea acurateții relativă a mai multor supleanți pentru o anumită intrare.
Acest lucru facilitează întoarcerea rezultatului cel mai exact de recunoaștere. De exemplu, dacă o frază are un scor de încredere de 0,8; acest lucru nu înseamnă că expresia are o sansa de 80% de a se potrivi correct pentru intrare. Aceasta înseamnă că fraza este mai probabil sa aibă potrivirea corectă pentru intrarea decat alte rezultate care au scoruri de încredere mai mici de 0,8.
Valorile de încredere sunt relative și unice pentru fiecare motor de recunoaștere. Valorile returnate de încredere de două motoare de recunoaștere diferite nu pot fi comparate în mod semnificativ.
Un motor de recunoaștere vocală poate atribui un scor scazut de încredere pentru un input din diferite motive, inclusiv interferențele din fundal, vorbire incoerentă, sau cuvinte neprevăzute
Apoi apelăm metoda Recognize – Efectuează o operație sincronă de recunoaștere a vorbirii.
Această metodă efectuează o singură operație de recunoaștere; în timpul unui apel la această metodă, sistemul de recunoaștere poate ridica următoarele evenimente:
SpeechDetected – în cazul în care recognizer detectează intrarea care se poate identifica ca vorbire.
SpeechHypothesized – în cazul în care intrarea creează o potrivire ambiguu cu una dintre gramatici active(active grammars);
SpeechRecognitionRejected sau SpeechRecognized – când recognizer finalizează o operațiune de recunoaștere.
Metoda Recognize() returnează un obiect RecognitionResult sau null dacă operația nu a fost finalizată cu success.
O operațiune de recunoaștere sincronă poate eșua din următoarele motive:
Vorbirea nu a fost detectată înainte ca intervalele timeout să expire pentru proprietățile BabbleTimeout sau InitialSilenceTimeout.
Motorul de recunoaștere detectează vorbire, dar nu găsește nicio potrivire cu obiectele Grammar.
Pentru a efectua recunoașterea asincron, utilizați una dintre metodele RecognizeAsync .
Când aplicația se închide, descarcăm toate obiectele de tipul Grammar cu metoda UnloadAllGrammars. Dacă sistemul de recunoaștere în prezent încarcă un Grammar, această metoda așteaptă până când Grammar-ul este încărcat complet, înainte de a se descarcă toate obiectele Grammar din instanța SpeechRecognitionEngine.
Cu metoda Dispose() eliberăm resursele utilizate de SpeechRecognitionEngine în timul sesiunii.
2.3. Aplicație prin care putem trimite E-mailuri prin comandă vocală.
Se deschide formularul pentru trimiterea de E-Mail, am încărcat dintr-un fișier XML trei adrese de E-mail iar în cazul în care utilizatorul spune „one” se selectează prima adresă , „two” pentru a doua, etc.
Pentru a trimite mail-uri folosim namespace-ul System.Net.Mail ;
Conține clase utilizate pentru a trimite mesaje electronice către un server Simple Mail Transfer Protocol (SMTP) . MailMessage reprezintă un mesaj e-mail care poate fi trimis folosind clasa SmtpClient. Expeditorul, destinatarul,subiectul și corpul mesajului e-mail pot fi parametrii atunci cand inițializăm un obiect MailMessage.
Proprietatea Credentials setează încrederea utilizată pentru autentificarea expeditorului. Unele servere SMTP necesită autentificarea clientului, înainte ca serverul să trimite e-mail în numele său. Pentru a utiliza acreditările de rețea implicite, putem seta proprietatea UseDefaultCredentials la true(adevărat). Proprietatea EnableSsl specifică dacă SmtpClient utilizează Secure Sockets Layer (SSL) pentru a cripta conexiunea.
Dacă trimitem un E-Mail cu ajutorul metodei Send mai multor destinatari, iar serverul SMTP accepta unii destinatari ca fiind valizi și respinge alții, aceasta trimite mesajul destinatarilor acceptați, apoi o excepție SmtpFailedRecipientsException este aruncată. Excepția va conține lista destinatarilor respinși .
Atunci cand la microfon spunem „send, aplicația va trimite mail, în campul To va fi una din cele trei adrese.
În timp aplicația a doua s-a concentrat pe dictare, aceasta se va concentra pe capacitatea de a asculta și de a interpreta doar cuvinte specifice; acest lucru înseamnă că dictarea va fi ignorată complet. Vom alimenta un set de cuvinte alternative în motorul de recunoaștere.Folosim metoda Add – adaugă un tablou care conține unul sau mai multe obiecte String la setul de alternative.
Am folosit o adresă de mail de la Yahoo dar se pot folosi și altele :
Dacă E-Mail-ul a fost trimis va apărea un mesaj de succs:
2.4. Aplicație cu ajutorul căreia lansăm in execuție procese, programe prin control vocal.
Așa arată interfața pentru această aplicație.
Dacă utilizatorul rostește „Start” și una dintre aceste comenzi : "Calculator", "Notepad", "Firefox", "Paint","Word", "Excel", "Media Player", "Time Please", "MyComputer","Exit", "ControlPanel","MyDocuments" se va deschide programul(procesul) respectiv.
În primul rând, vom crea o nouă instanță de SpeechRecognitionEngine și setăm motorul așa încât sa primească intrarea de la dispozitivul audio implicit.
Trebuie să încărcăm grammar-ul. Dacă avem nevoie doar să recunoască anumite cuvinte specifice, trebuie să definim o grammar personalizat.
Folosim clasa Choices – aceasta reprezintă un set de alternative în constrângerile unui speech recognition grammar. Un obiect Choices reprezintă o componentă a unei fraze care poate avea una din mai multe valori. Utilizăm această clasă la crearea unui grammar de recunoaștere vocală de la un obiect GrammarBuilder. Nu avem nevoie de recunoașterea completă, doar comenzile disponibile : "Calculator", “Notepd”, etc.
Creăm o listă de elemente alternative pentru un element de grammar si apoi construim grammar-ul. Ideea este că ar trebui să asculte două cuvinte: O comandă / proprietate – “Start” și o valoare. Mai întâi vom crea o listă de opțiuni ("Calculator", "Notepad", …) și apoi o adăugăm la grammarBuilder nostru. Așadar grammar-ul va înțelege urnătorul tip de fraze :
„Start [choice] ”
Unde [choice] este unul din stringuri ;
Acum putem încărca grammar-ul pentru motorul de recunoaștere și să înceapă recunoașterea propriu zisă .
Am setat modul de recunoaștere multiplă pentru ca motorul de recunoaștere să continue procesul până la apelul metodei RecognizeAsyncCancel sau RecognizeAsyncStop și nu imediat după prima recunoaștere. Dacă avem nevoie doar de o singură reconoaștere, modificăm parametrul la RecognizeMode.Single.
Metoda RecognizeAsyncStop finalizează recunoașterea asincron fără a trunchea intrarea. În cazul în care operația curentă de recunoaștere asincronă primește date de intrare, sistemul de recunoaștere continuă să accepte date până când operația de recunoaștere este completă.
Concluzii.
În ultimii 10 ani, tehnologiile software de recunoaștere a vorbirii au facut progrese incredibile; cu punerea în aplicare a software-ului de recunoaștere a vorbirii în telefoane mobile, cum ar fi Siri și S Voice, versiunea Samsung a Siri, recunoașterea vocii este pregătită pentru următoarea etapă în tehnologie – în business.
Recunoasterea vorbirii va revolutiona modul în care oamenii fac afaceri pe Web și va diferenția în cele din urmă clasă mondială e-business. Sistemul de recunoaștere a vorbirii și VoiceXML va reprezinta în mod clar următorul val de Web.
În viitorul apropiat oamenii vor folosi calculatoarele de acasă și de la birou prin voce, fără utilizarea mouse-ului și a tastaturii.
Avantajele aplicației :
Capabilă să scrie textul prin tastatură și voce ;
Capabilă să convertească text în vorbire ;
Recunoașterea vocală de comenzi diferite : Notepad, Paint, Firefox, etc.
Necesită mai puțin consum de timp decât textul scris.
Oferi ajutor semnificativ pentru persoanele cu dizabilități.
Costuri operaționale reduse
Dezavantaje :
Acuratețe scăzută
Nu are rezultate foarte bune în mediul zgomotos
Dezvoltări ulterioare :
Una din îmbunătățirile care s-ar putea aduce acestui proiect ar fi adăugarea unui vocabular mai mare pentru partea cu transmiterea de E-Mail-uri ; versiunea curentă a apicației accepta doar câteva comenzi vocale pentru deschiderea de aplicații, pe viitor am putea adăuga mai multe aplicații pe care le utilizăm in mod frecvent.
După ce am studiat sinteza și recunoașterea vorbirii, am realizat că putem cu ușurință să confundăm clasele de „speech”. Există două spații de nume complet separate, dar asemănătoare între ele și anume : namespace-ul Microsoft.Speech și System.Speech – împărtășesc multe dintre numele claselor (de exemplu, System.Speech.Synthesis.SpeechSynthesizer vs. Microsoft.Speech.Synthesis.SpeechSynthesizer), dar fac parte din două API-uri de vorbire diferite.
Pe scurt, clasa System.Speech și clasa Microsoft.Speech servesc unor scopuri diferite. Amândouă se bazează pe „Speech Application Programming Interface” – SAPI doar că Sytem.Speech este pentru aplicații Desktop în timp ce Microsoft.Speech aparține platformei Microsoft Speech Server SDK, o trăsătură a SAPI concepută pentru aplicații server .
System.Speech se poate adapta la vocea unui anumit utilizator, ceea ce are sens pentru aplicatiile desktop, unde utilizatorul va fi, în general, același. De asemenea, acesta pune în aplicare un motor de dictare (de recunoaștere a cuvintelor rostite de către utilizator), pe care versiunea de server nu o implementează.
Dacă doriți să căutați online exemple de implementarea recunoașterii vorbirii și veți vedea un fragment de cod, nu este întotdeauna evident dacă exemplul se referă la System.Speech sau Microsoft.Speech.
Recunoașterea vocală pentru System.Speech necesită de obicei instruirea utilizatorilor(„user training”), utilizatorul citește un text și sistemul încearcă să învețe și să înțeleagă pronunția utilizator în parte. Recunoașterea vocală pentru Microsoft.Speech funcționează imediat pentru orice utilizator.
Bibliografie :
[1] Burileanu C., Oancea E., Radu M., Text-to-Speech Synthesis for Romanian
Language: Present and Future Trends, http://www.racai.ro/books/awde/ burileanu. htm
2005
[2] Burileanu C. & al., Text-to-Speech Synthesis for Romanian Language, în Recent
Advances in Romanian LanguageTechnology, Editura Academiei Române, București, 1997
[3] History of Speech Recognition and Transcription Software, http://www.dragon-
medical-transcription.com/historyspeechrecognition.html, 2005
[4] Lupu E., Pop P., Prelucrarea numerică a semnalului vocal, vol.1, Ed. Risoprint, 2004.
[5] Mobius B., Corpus-based speech synthesis: methods and challenges. In:
Arbeitspapiere des Instituts für Maschinelle Sprachverarbeitung (Univ. Stuttgart),
AIMS 6 (4), pp. 87–116, 2000
[6] Elizabeth Montalbano, Microsoft Gets Exchange to Speak Up, PC World, August 02,
2005
[7] Ramon Lopez Cozar Delgado, Masahiro Araki, Spoken, Multilingual and Multimodal
Dialogue Systems: Development and Assessment, ISBN: 0-470-02155-1, Wiley Publisher
House, September 2005
[8] G. Toderean, Al. Caruntu, Metode de recunoaștere a vorbirii, Editura Risoprint,
Cluj-Napoca, 2005.
[9] Veikko Surakka, Marko Illi, Gazing and frowning as a new human–computer
interaction technique, ACM Transactions on Applied Perception (TAP), Volume 1 ,
Issue 1, July 2004,Pages: 40 – 56, ISSN:1544-3558, 2004
[10] Patricia Walsh, Randy Lundquist, and John A. Gardner, The Audio-Accessible
Graphing Calculator, Proceedings of the 2001 CSUN International Conference on
Technology and Persons with Disabilities, Los Angeles, CA, March 21-24, 2001
[11] Johan Wouters and Michael W. Macon, Unit Fusion for Concatenative Speech
Synthesis, in Proceedings of the International Conference on Spoken Language
Processing (ICSLP), Oct, 2000
[12] Robin Reynolds Haertle, POO cu Visual Basic.Net si VisualC#.Net, Ed.Teora, 2009
Anexa 1
Codul sursă
Windows Application
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Licenta
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new main_form());
}
}
}
Main Form.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Mail;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;
using System.Data.SqlClient;
namespace Licenta
{
public partial class main_form : Form
{
public main_form()
{
InitializeComponent();
KeyPreview = true;
this.KeyDown += new System.Windows.Forms.KeyEventHandler(KeyEvent);
}
private void KeyEvent(object sender, KeyEventArgs e) //Keyup Event
{
if (e.KeyCode == Keys.D1)
{
speak_form Text_to_Speech = new speak_form();
Text_to_Speech.Show();
}
if (e.KeyCode == Keys.D2)
{
recogn_form Recognition = new recogn_form();
Recognition.Show();
}
if (e.KeyCode == Keys.D3)
{
mail_form Mail = new mail_form();
Mail.Show();
}
if (e.KeyCode == Keys.D4)
{
process_form Process = new process_form();
Process.Show();
}
}
}
}
Text to Speech
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Speech.Synthesis;
namespace Licenta
{
public partial class speak_form : Form
{
public speak_form()
{
InitializeComponent();
}
SpeechSynthesizer ss = new SpeechSynthesizer();
private void speak_form_Load(object sender, EventArgs e)
{
Pause.Enabled = false;
Resume.Enabled = false;
}
private void Speak_Click(object sender, EventArgs e)
{
ss.SpeakAsync(richTextBox.Text);
Pause.Enabled = true;
}
private void browseToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.DefaultExt = "txt";
ofd.Filter = "Text files (*.txt)|*.txt|" + "RTF files (*.rtf)|*.rtf|" + "Word files (*.doc)|*.doc|" +
"Windows Write (*.wri)|*.wri|" + "WordPerfect document (*.wpd)|*.wpd";
ofd.ShowHelp = true;
ofd.Title = "select a file";
ofd.ValidateNames = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(ofd.OpenFile());
richTextBox.Text = sr.ReadToEnd();
}
}
catch (Exception)
{
MessageBox.Show("can not open the file", "Text to Speak", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void Pause_Click(object sender, EventArgs e)
{
ss.Pause();
Resume.Enabled = true;
}
private void Resume_Click(object sender, EventArgs e)
{
ss.Resume();
}
private void Stop_Click(object sender, EventArgs e)
{
ss.SpeakAsyncCancelAll();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void saveToWAVToolStripMenuItem1_Click(object sender, EventArgs e)
{
SaveFileDialog save_dialog = new SaveFileDialog();
save_dialog.Filter = "All files (*.*)|*.*|wav files (*.wav)|*.wav";
save_dialog.Title = "Save to a wave file";
save_dialog.FilterIndex = 2;
save_dialog.RestoreDirectory = true;
if (save_dialog.ShowDialog() == DialogResult.OK)
{
FileStream fs = new FileStream(save_dialog.FileName, FileMode.Create, FileAccess.Write);
ss.SetOutputToWaveStream(fs);
ss.Speak(richTextBox.Text);
fs.Close();
}
}
}
}
Speech to Text
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech;
using System.Threading;
using System.Speech.Recognition;
using System.Speech.Synthesis;
namespace Licenta
{
public partial class recogn_form : Form
{
public recogn_form()
{
InitializeComponent();
this.Closing += new System.ComponentModel.CancelEventHandler(this.recogn_form.FormClosing);
}
public SpeechRecognitionEngine recognizer;
public Grammar grammer;
public Thread RecThread;
public Boolean RecogState = true;
String fileLocation;
private void recogn_form_Load(object sender, EventArgs e)
{
recognizer = new SpeechRecognitionEngine();
GrammarBuilder GBuilder = new GrammarBuilder();
GBuilder.AppendDictation();
grammer = new Grammar(GBuilder);
recognizer.LoadGrammar(grammer);
recognizer.SetInputToDefaultAudioDevice();
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
/*
recognizer.InitialSilenceTimeout = TimeSpan.FromSeconds(0);
recognizer.BabbleTimeout = TimeSpan.FromSeconds(0);
recognizer.EndSilenceTimeout = TimeSpan.FromSeconds(0);
recognizer.EndSilenceTimeoutAmbiguous = TimeSpan.FromSeconds(0);
*/
RecogState = false;
RecThread = new Thread(new ThreadStart(RecThreadFunction));
RecThread.Start();
}
public void RecThreadFunction()
{
while (true)
{
try
{
recognizer.Recognize();
}
catch
{
}
}
}
public void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (!RecogState)
return;
this.Invoke((MethodInvoker)delegate
{
if(e.Result.Confidence>=0.5f)
rTextBox.Text += (" " + e.Result.Text);
});
}
private void btn_enable_Click(object sender, EventArgs e)
{
btn_enable.Enabled = false;
btn_disable.Enabled = true;
RecogState = true;
}
private void btn_disable_Click(object sender, EventArgs e)
{
btn_enable.Enabled = true;
btn_disable.Enabled = false;
RecogState = false;
}
private void recogn_form_FormClosing(object sender, FormClosingEventArgs e)
{
RecThread.Abort();
RecThread = null;
recognizer.UnloadAllGrammars();
recognizer.Dispose();
grammer = null;
}
private void editToolStripMenuItem_Click(object sender, EventArgs e)
{
rTextBox.ResetText();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
if (rTextBox.TextLength > 1)
if (MessageBox.Show("Your changes will not be saved!", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
Application.Exit();
else
{
}
else
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
private void newToolStripMenuItem1_Click_1(object sender, EventArgs e)
{
if (rTextBox.TextLength > 1)
if (MessageBox.Show("Your changes will not be saved!", "Are you sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
rTextBox.Text = null;
else
{ }
}
private void openToolStripMenuItem1_Click_1(object sender, EventArgs e)
{
if (rTextBox.TextLength > 1)
{
DialogResult confirm =
MessageBox.Show("Your changes will not be saved!", "Are you sure?", MessageBoxButtons.YesNo);
if (confirm == DialogResult.Yes)
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text Files|*.txt";
if (open.ShowDialog() == DialogResult.OK)
{
rTextBox.LoadFile(open.FileName,
RichTextBoxStreamType.PlainText);
}
}
else
if (confirm == DialogResult.No)
{
}
}
else
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "Text Files|*.txt";
if (open.ShowDialog() == DialogResult.OK)
{
rTextBox.LoadFile(open.FileName,
RichTextBoxStreamType.PlainText);
}
}
}
private void saveToolStripMenuItem1_Click_1(object sender, EventArgs e)
{
var performSave = true;
if (String.IsNullOrEmpty(fileLocation))
{
performSave = SetFileLocation();
}
if (performSave)
rTextBox.SaveFile(fileLocation, RichTextBoxStreamType.PlainText);
}
private bool SetFileLocation()
{
SaveFileDialog saveFile1 = new SaveFileDialog();
saveFile1.DefaultExt = "*.doc";
saveFile1.Filter = "WORD FILE|*.doc";
if (saveFile1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
saveFile1.FileName.Length > 0)
{
fileLocation = saveFile1.FileName;
return true;
}
return false;
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Mail;
using System.Speech.Recognition;
using System.Speech.Synthesis;
using System.Threading;
using System.Data.SqlClient;
namespace Licenta
{
public partial class mail_form : Form
{
public mail_form()
{
InitializeComponent();
this.Closing += new System.ComponentModel.CancelEventHandler(this.mail_form_Closing);
}
// PromptBuilder pBuilder = new PromptBuilder();
SpeechRecognitionEngine sRecognize = new SpeechRecognitionEngine();
private void mail_form_Load(object sender, EventArgs e)
{
Dictionary<string, string> test = DataAccess.GetEmailAddresses();
cbEmaiAddresses.DroppedDown = true;
cbEmaiAddresses.DataSource = new BindingSource(test, null);
cbEmaiAddresses.DisplayMember = "Value";
cbEmaiAddresses.ValueMember = "Key";
Choices sList = new Choices();
sList.Add(new string[] { "hello", "Dear", "Jane,", "Mark,", "you","send","thanks",
"for", "your", "today", "I", "are","well","exit","to",".Best","wishes","pleased"
,"hope","miss","one","two","three","invitation", });
Grammar gr = new Grammar(sList);
try
{
sRecognize.RequestRecognizerUpdate();
sRecognize.LoadGrammar(gr);
sRecognize.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(sRecognize_SpeechRecognized);
sRecognize.SetInputToDefaultAudioDevice();
sRecognize.RecognizeAsync(RecognizeMode.Multiple);
}
catch
{
return;
}
}
private void sRecognize_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
if (e.Result.Text == "exit")
{
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
if (e.Result.Text == "one")
{
cbEmaiAddresses.Text = "[anonimizat]";
cbEmaiAddresses.DroppedDown = false;
}
if (e.Result.Text == "two")
{
cbEmaiAddresses.Text = "[anonimizat]";
cbEmaiAddresses.DroppedDown = false;
}
if (e.Result.Text == "three")
{
cbEmaiAddresses.Text = "[anonimizat]";
cbEmaiAddresses.DroppedDown = false;
}
if (e.Result.Text == "send")
try
{
MailMessage mail = new MailMessage("[anonimizat]", cbEmaiAddresses.Text, sSubject.Text, sMessage.Text);
SmtpClient client = new SmtpClient("smtp.mail.yahoo.com");
client.Port = 587;
client.Credentials = new System.Net.NetworkCredential("[anonimizat]", "*******");
client.EnableSsl = true;
client.Send(mail);
MessageBox.Show("mail sent ! ", "Succes", MessageBoxButtons.OK);
}
catch (Exception ex)
{
MessageBox.Show("Exception in sendEmail:" + ex.Message);
}
sMessage.Text = sMessage.Text + " " + e.Result.Text.ToString();
}
private void mail_form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (MessageBox.Show("Are you sure you want to exit?", "Confirm exit", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
e.Cancel = true;
else
System.Diagnostics.Process.GetCurrentProcess().Kill();
}
private void sMessage_TextChanged(object sender, EventArgs e)
{
}
}
}
DataAcces.cs
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Data.Sql;
using System.Xml;
namespace Licenta
{
public class DataAccess
{
public static Dictionary<string, string> GetEmailAddresses()
{
string databasePath = AssemblyDirectory + @"\XMLFile1.xml";
XmlTextReader reader = new XmlTextReader(databasePath);
Dictionary<string, string> emailAddress = new Dictionary<string, string>();
while (reader.Read())
{
if (reader.Name == "email")
{
var email = reader.ReadString();
emailAddress.Add(email, email);
}
}
reader.Close();
return emailAddress;
}
public static string AssemblyDirectory
{
get
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
}
}
Comenzi vocale :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Speech.Recognition;
namespace Licenta
{
public partial class process_form : Form
{
private SpeechRecognitionEngine recognizer;
public process_form()
{
InitializeComponent();
recognizer = new SpeechRecognitionEngine();
recognizer.SetInputToDefaultAudioDevice();
recognizer.SpeechRecognized += (s, args) =>
{
string line = "";
foreach (RecognizedWordUnit word in args.Result.Words)
{
if (word.Confidence > 0.5f)
line = line + word.Text + " ";
}
string command = Regex.Replace(line, "Start", "").Trim();
switch (command)
{
case "Notepad":
Process.Start("notepad.exe");
break;
case "Calculator":
Process.Start("calc.exe");
break;
case "Paint":
Process.Start("mspaint.exe");
break;
case "Firefox":
Process.Start(@"C:\Program Files (x86)\Mozilla Firefox\firefox.exe");
break;
case "Word":
Process.Start(@"C:\Program Files (x86)\Microsoft Office\Office14\WINWORD.exe");
break;
case "Excel":
Process.Start(@"C:\Program Files (x86)\Microsoft Office\Office14\EXCEL.exe");
break;
case "Media Player":
Process.Start(@"C:\Program Files (x86)\Windows Media Player\wmplayer.exe");
break;
case "Time Please":
Time();
break;
case "MyComputer":
Process.Start("::{20d04fe0-3aea-1069-a2d8-08002b30309d}");
break;
case "ControlPanel":
Process.Start("::{21EC2020-3AEA-1069-A2DD-08002b30309d}");
break;
case "MyDocuments":
Process.Start("::{450D8FBA-AD25-11D0-98A8-0800361B1103}");
break;
case "Exit":
Application.Exit();
break;
}
textBox.Text += line;
textBox.Text += Environment.NewLine;
};
recognizer.LoadGrammar(CreateGrammarObject());
recognizer.RecognizeAsync(RecognizeMode.Multiple);
}
public void Time() {
DateTime now = DateTime.Now;
string time = now.ToString("T");
MessageBox.Show(time);
}
private void btn_disable_Click(object sender, EventArgs e)
{
recognizer.RecognizeAsyncStop();
}
private Grammar CreateGrammarObject()
{
Choices commandChoices = new Choices("Calculator", "Notepad", "Firefox", "Paint","Word",
"Excel", "Media Player", "Time Please", "MyComputer","Exit", "ControlPanel","MyDocuments");
GrammarBuilder grammarBuilder = new GrammarBuilder("Start");
grammarBuilder.Append(commandChoices);
Grammar g = new Grammar(grammarBuilder);
return g;
}
private void process_form_FormClosed(object sender, FormClosedEventArgs e)
{
recognizer.RecognizeAsyncStop();
}
}
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Studiul Interfetei Microsoft Sapi, Sdk. Comenzi Vocale, Text To Speech, Dictare Si Trimitere E Mail (ID: 150668)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
