Recunoasterea Vorbirii Folosind Mixturi Gaussiene

RECUNOAȘTEREA VORBIRII

FOLOSIND MIXTURI GAUSSIENE

MEMORIU JUSTIFICATIV

Recunoașterea vorbirii este procesul luãrii semnalului vocal drept semnal de intrare pentru un program de pe calculator. Altfel spus, este procesul prin care sunetele (grupate în cuvinte sau propoziții) produse de om sunt convertite în semnale electrice, care la rândul lor, sunt transformate în secvențe de cod, cãrora li se dã o semnificație. Acest proces este important pentru un utilizator deoarece este un mod natural și intuitiv de a utiliza și controla orice aplicație. Realitatea virtualã este exemplul cel mai bun, permițând utilizatorului libertate totalã de a se bucura de mediul virtual și menținãnd, în același timp, simularea sub controlul acestuia.

Însã pânã la realitate virtuala controlatã cu ajutorul vocii mai sunt câțiva pași de fãcut. Momentan, recunoașterea vorbirii este folositã de editoarele text și în telefonia mobilã în sistemele de comandã vocalã.

Editoarele text permit redactarea unui text cu ajutorul tastaturii. În cazul editoarelor care au implementat un sistem de recunoaștere a vorbirii, utilizatorul nu trebuie decât sã dicteze într-un microfon textul și, cel mult, sã corecteze din când în când acolo unde, datoritã sistemului sau utilizatorului, apare o greșealã.

În telefonia mobilã, recunoașterea vorbirii își gãsește locul în aplicații de genul editarea agendei telefonice, editarea SMS-urilor, apelare vocalã, etc.

Pentru un posesor de calculator acestã unealtã nu poate fi decât binevenitã, mai ales pentru unul neinițiat. Se știe cã interacțiunea are loc în majoritatea cazurilor între utilizator și sistemul de operare al acelui calculator, deci nu ne putem mira dacã foarte curând vom putea folosi, pe lângã tastaturã și mouse, propria noastrã voce, pentru a interacționa cu calculatorul nostru.

Desigur cã recunoașterea vorbirii își poate gãsi aplicații în multe domenii, însã cel mai mare beneficiar al acestui proces, momentan, este domediul multimedia.

CUPRINS

Introducere 5

Clasificarea sistemelor de recunoaștere a vorbirii 5

Producerea vorbirii 7

Tehnici și noțiuni de prelucrarea semnalelor 15

Energia de timp scurt 15

Rata trecerilor prin zero 16

Transformata Fourier și analiza Fourier de timp scurt 16

Transformata Fourier discretã 17

Calculul transformatei Fourier discrete 17

Decimarea în timp 17

Tehnica ferestruirii 19

Fereastra dreptunghiularã (Dirichlet) 22

Fereastra Hamming 24

Codarea perceptivã 25

Cum am procedat 29

Algoritmul de codare Mel 33

Mixturi gaussiene 36

Funționarea globalã a sistemului 37

Fiabilitate software 38

Metode de realizare a software-ului fiabil 40

Nivele prescrise de fiabilitate 42

Proiectarea structurii 43

Metrici software 44

Calcul economic 46

Generalitãți 46

Calcul economic pentru program 48

Rezultate și concluzii 50

Bibliografie 54

Anexe : Programele sursã 55

I. INTRODUCERE

Vocea este principalul instrument prin care noi, oamenii, comunicãm cu alți oameni. Cu ajutorul ei ne transmitem nevoile, sentimentele, ideile, etc. Așadar nu este de mirare cã, odata cu avansul tehnicii, vocea este folositã în din ce în ce mai multe domenii. Dacã pânã de curãnd semnalul vocal se regãsea numai în transmisiuni (pe canale telefonice, canale radio) sau înregistrãri sonore, acesta a început sã fie folosit și în alte domenii de activitate cum ar fi : sinteza vocii, recunoașterea vocii și a vorbitorului, etc.

Recunoașterea vorbirii, cãci de ea ne vom ocupa în continuare, a apãrut o data cu apariția necesitãții comunicãrii om-mașinã (robot, computer, sisteme de acces personalizat) și constã în extragerea informației corespunzatoare identificarii semnalului vocal prin mãsurãri efectuate asupra acestuia.

Lãsând la o parte beneficiile date de sistemele ce implementeazã recunoașterea vorbirii pentru omul de rând, aceste sisteme pot avea un impact foarte puternic în viața persoanelor care suferã de o anumitã condiție medicalã (paralizie, orbire, etc.), oferindu-le noi metode de a interacționa cu lumea înconjurãtoare.

1.1. Clasificarea sistemelor de recunoaștere a vorbirii

În funcție de modul în care funcționeazã, sistemele de recunoaștere a vorbirii se împart în mai multe categorii :

În funcție de vorbitor, sistemele se împart în :

dependente-de-vorbitor

independente-de-vorbitor

În funcție de tipul de vorbire, sistemele se împart în :

vorbire discretã

vorbire conectatã

vorbire continuã

Sistemele de recunoaștere a vorbirii dependente-de-vorbitor sunt cele mai simple și au cea mai mare acuratețe când sunt folosite cum trebuie, însã suferã și de cele mai multe limitãri. La fel ca la orice sistem de recunoaștere a vocii, primul pas este ca utilizatorul sã pronunțe un cuvãnt sau o frazã în microfon. Semnalul este convertit în numeric și salvat în memorie. Pentru a determina înțelesul, calculatorul comparã ceea ce s-a spus cu o tipar din memorie, care are un înțeles cunoscut. Programul funcționeazã asemãnãtor modului de funcționare a tastaturii.

Cum fiecare persoana este diferitã, programul nu poate conține un tipar pentru fiecare potențial utilizator, așa cã mai întâi programul trebuie “antrenat” cu vocea noului utilizator, înainte ca acel utilizator sã fie recunoscut de program. În timpul sesiunii de antrenare, utilizatorul pronunțã în microfon cuvintele sau frazele date de program de mai multe ori. Programul calculeazã o medie statisticã pentru fiecare cuvânt și salveazã aceastã medie într-un tipar pentru acel cuvânt. Pentru astfel de sisteme de recunoaștere a vorbirii, vocabularul este limitat la cuvintele sau frazele folosite în ședința de antrenare. De asemenea programul nu poate fi folosit decãt de cei care au antrenat programul cu vocea lor.

O formã mai generalã de recunoaștere a vorbirii este posibilã datoritã sisteme lor independente-de-vorbitor. În loc sã încercãm sã gãsim o similaritate între ceea ce s-a spus și tiparul salvat în memorie, aceastã metodã mai întâi prelucreazã semnalul vocal utilizând “transformata Fourier” sau “codarea linear predictivã (LPC)”, apoi încearcã sã gãseacã asemãnãri caracteristice între ceea ce s-a spus și ceea ce se așteaptã sã fie spus. Aceste asemãnãri vor fi prezente la o gamã largã de utilizatori, așadar cã sistemul nu trebuie antrenat pentru fiecare nou utilizator. Aceste programme pot face fațã unor tipuri diferite de vorbire, însã datoritã accentului, vitezei diferite de vorbire, înãlțimii, volumului și intonației, erori de recunoaștere pot apãrea destul de des. Aceste tipuri de sisteme sunt foarte dificil de implementat datoritã varietãții foarte mari în tiparele de vorbire, de unde și o acuratețe mai micã fațã de sistemele dependente-de-vorbitor.

Majoritatea sistemelor de recunoaștere a vocii folosesc vorbire discretã, fiind cel mai ușor de implementat. În acest caz utilizatorii pronunțã cuvintele cu pauze notabile între ele. Programul trateazã fiecare cuvãnt izolat de rest. Aceste tipuri de programme sunt utile atunci cãnd este necesar sã dai comenzi formate dintr-un singur cuvânt, dar nenatural atunci când vrei sã pronunți o frazã, necesitând o perioadã de acomodare cu programul. Aceste programe sunt și pot fi folosite cu rata mare de succes de persoanele cu dificultãți de vorbire.

În sistemele vorbire conectatã, vorbitorul poate articula fraze și propoziții, având însã grijã sã pronunțe fiecare cuvânt cât mai corect și ca sfârșitul unui cuvânt sã nu se suprapunã cu începutul urmãtorului.

Cât se poate de natural, în sistemele vorbire continuã, vorbitorul poate pronunța fraze și propoziții, fãrã a-și face griji ca cuvintele sã nu se suprapunã sau cã nu sunt pauze între cuvinte. Aceste tipuri de programme pot recunoaște și cuvinte individuale, însã funcționeazã mai bine dacã acestea sunt pronunțate în fraze sau propoziții, fiind “învãțate” cã anumite cuvinte apar în combinații predictibile. Sistemele de recunoaștere a vocii ce folosesc vorbire continuã sunt foarte dificil de implementat.

1.2. Producerea vorbirii

Conform DEX, limba este „un sistem de comunicare alcătuit din sunete coarticulate, specific oamenilor, prin care aceștia își exprimă gândurile, sentimentele și dorințele”. Astfel spus: „orice metodă de a comunica idei printr-un sistem de semne, simboluri, gesturi sau altceva similar”.

Lingvistica studiază regulile pe baza cărora sunetele vorbirii intră în componența unei limbi, unitățile limbii și modul de funcționare a acestora.

Fonetica studiază și clasifică sunetele vorbirii. Această disciplină include:

fiziologia producerii vorbirii și mișcările organelor vocale (articulatorilor) la producerea sunetelor și a cuvintelor

fonetica acustică, care include descrierea acustică a sunetelor vorbirii

Clasificări ale sunetelor:

O unitate de bază a lingvisticii este fonul (fonemul), care este un sunet articulat. Articularea este procesul producerii sunetelor prin manipularea articulatorilor, aceștia modificând configurația tractului vocal. Acesta include faringele și cavitatea bucală până la buze. Grupările fonurilor se numesc foneme. Fonurile sunt sunete, în timp ce fonemele sunt elemente ale vorbirii. Fonemele pot fi combinate în unități mai mari numite silabe. Definiția fonemului este aceea că dacă un fonem este înlocuit de un altul, înțelesul cuvântului se poate schimba.

O combinație de silabe formează un cuvânt, care este de obicei o combinație de două până la cinci foneme.

Propozițiile sunt unități lingvistice mai mari, care necesită o gramatică sau reguli care să determine maniera în care secvențele de cuvinte sunt unite. Gramatica nu este singura care determină ordinea cuvintelor în propoziție; aceasta trebuie să aibă „sens”. Avansând în structura limbii, ajungem la semantică, cea care studiază sensul cuvintelor.

Maniera în care ordonăm cuvintele este influențată de gramatica limbii și de semnificația pe care dorim să o comunicăm.

Caracteristicile prozodice ale vorbirii furnizează informații despre variațiile înălțimii, intensității și tempo-ului vorbirii. Accentul și intonația pot fi distinse cu ușurință, dar sunt greu de măsurat, modelat și simulat în sinteza vorbirii. Starea emoțională a vorbitorului, sexul acestuia, starea de sănătate și alți factori pot rezulta din variațiile intonațronunța fraze și propoziții, fãrã a-și face griji ca cuvintele sã nu se suprapunã sau cã nu sunt pauze între cuvinte. Aceste tipuri de programme pot recunoaște și cuvinte individuale, însã funcționeazã mai bine dacã acestea sunt pronunțate în fraze sau propoziții, fiind “învãțate” cã anumite cuvinte apar în combinații predictibile. Sistemele de recunoaștere a vocii ce folosesc vorbire continuã sunt foarte dificil de implementat.

1.2. Producerea vorbirii

Conform DEX, limba este „un sistem de comunicare alcătuit din sunete coarticulate, specific oamenilor, prin care aceștia își exprimă gândurile, sentimentele și dorințele”. Astfel spus: „orice metodă de a comunica idei printr-un sistem de semne, simboluri, gesturi sau altceva similar”.

Lingvistica studiază regulile pe baza cărora sunetele vorbirii intră în componența unei limbi, unitățile limbii și modul de funcționare a acestora.

Fonetica studiază și clasifică sunetele vorbirii. Această disciplină include:

fiziologia producerii vorbirii și mișcările organelor vocale (articulatorilor) la producerea sunetelor și a cuvintelor

fonetica acustică, care include descrierea acustică a sunetelor vorbirii

Clasificări ale sunetelor:

O unitate de bază a lingvisticii este fonul (fonemul), care este un sunet articulat. Articularea este procesul producerii sunetelor prin manipularea articulatorilor, aceștia modificând configurația tractului vocal. Acesta include faringele și cavitatea bucală până la buze. Grupările fonurilor se numesc foneme. Fonurile sunt sunete, în timp ce fonemele sunt elemente ale vorbirii. Fonemele pot fi combinate în unități mai mari numite silabe. Definiția fonemului este aceea că dacă un fonem este înlocuit de un altul, înțelesul cuvântului se poate schimba.

O combinație de silabe formează un cuvânt, care este de obicei o combinație de două până la cinci foneme.

Propozițiile sunt unități lingvistice mai mari, care necesită o gramatică sau reguli care să determine maniera în care secvențele de cuvinte sunt unite. Gramatica nu este singura care determină ordinea cuvintelor în propoziție; aceasta trebuie să aibă „sens”. Avansând în structura limbii, ajungem la semantică, cea care studiază sensul cuvintelor.

Maniera în care ordonăm cuvintele este influențată de gramatica limbii și de semnificația pe care dorim să o comunicăm.

Caracteristicile prozodice ale vorbirii furnizează informații despre variațiile înălțimii, intensității și tempo-ului vorbirii. Accentul și intonația pot fi distinse cu ușurință, dar sunt greu de măsurat, modelat și simulat în sinteza vorbirii. Starea emoțională a vorbitorului, sexul acestuia, starea de sănătate și alți factori pot rezulta din variațiile intonației. Accentul este folosit în conversații pentru a indica importanța cuvintelor.

Accentul și intonația conțin informații importante despre calitatea semnalului vorbirii și sunt deci de o importanță majoră pentru sinteza vorbirii. Intonația este percepută ca schimbări în frecvența fundamentală a sunetului, F0. O reprezentare a variației în timp a lui F0 sau a inversei acesteia, perioada sunetului, este numită de obicei contur al înălțimii. În prezent, se consideră că înălțimea este percepția lui F0. Termenii înălțime și F0 sunt adesea folosiți incorect cu sens echivalent. Accentul este perceput ca schimbări în efortul pronunției, la fel ca și schimbările în intensitate, înălțime și durată ale unui sunet.

Ortografia este ansamblul de reguli care stabilesc scrierea corectă a unei limbi, maniera corectă de a scrie un cuvânt. Ea ne furnizează vizual metode de reprezentare a cuvintelor pronunțate cu litere scrise.

Etichetarea este o procedură de transmitere a informației de pronunțare cât mai puțin ambiguu posibil. Este o tehnică de furnizare a transcrierii alofonice, care este mult mai corectă decât regulile ortografice.

Sunetele produse de către un vorbitor sunt influențate și alterate de către perturbațiile din mediul înconjurător al acestuia. Un tip de astfel de influență se numește adaptare fonetică. Asemenea adaptări sunt rezultatul unor schimbări în maniera în care vorbitorii își mișcă articulatorii, cauzând astfel modificări în cavitățile vocale. Maniera și gradul în care aceste cavități se modifică sunt afectate de foneme anterioare, prezente și viitoare. În cazul unui fonem, pozițiile articulatorilor și formele cavităților influențează mișcările articulatorilor în vederea producerii sunetelor vorbirii. Un exemplu de adaptare ar fi creșterea ratei de vorbire. Cu cât vorbim mai rapid, cu atât limba va atinge mai rar pozițiile specifice pentru producerea fonemelor. Pe scurt, adaptarea este procesul modificării unui fonem datorat influenței formei tractului vocal. Adaptarea este rezultatul unui articulator ce-și modifică mișcarea datorită contextului fonemic.

Astfel, producerea unui fonem este influențată de formele tractului vocal. Totuși, manifestarea acustică a fonemului nu se modifică.

Asimilarea este o formă excesivă de adaptare. Dacă un fonem se modifică suficient de mult pentru ca asemănarea dintre el și fonemele învecinate să crească, atunci o astfel de modificare în fonem se numește asimilare.

Coarticularea se definește ca mișcare simultană a doi articulatori în cazul diferitelor foneme. Aceasta se poate produce cu sau fără o modificare în producerea sunetului.

Vorbirea nu este o înșiruire precisă, ordonată, de foneme, ci mai degrabă o serie de foneme care au pante de început și de sfârșit în amplitudine, aceasta contribuind la tranzițiile ce au loc între foneme. Astfel, vorbirea este o secvență de foneme „diminuate” care nu sunt pronunțate de obicei în mod precis, făcând dificilă în felul acesta identificarea fonemelor din spectrograme sau forme de undă.

Principala funcție a laringelui este de a furniza o închidere protectoare pentru sistemul respirator. Laringele, susținut de ligamente și controlat de mușchi activați de numeroși nervi, este compus din țesuturi moi încapsulate într-un schelet cartilaginos. O membrană mucoasă căptușește laringele și traheea. Corzile vocale sunt membrane care se extind în conductul aerian. Lungimea corzilor vocale la bărbați este de la 17 până la 24 mm, iar la femei de la 13 până la 17 mm. Corzile pot fi întinse de la 3 până la 4 mm.

Plămânii sunt considerați rezervoare de aer, capabile de a elimina aerul prin trahee înspre corzile vocale. Pentru sunetele sonore (cum ar fi vocalele), presiunea aerului crește până când corzile vocale se deplasează, formând un orificiu numit glotă. Suflul de aer trece prin această deschidere glotală punând corzile în mișcare de vibrație. Teoria mioelastică-aerodinamică a producerii sunetului prin intermediul corzilor vocale consideră că această mișcare de vibrație este rezultatul acțiunii reciproce a două forțe. Una dintre forțe este presiunea subglotală care determină aerul să împingă corzile, eliminând suflul de aer. Cealaltă forță este efectul Bernoulli (combinația liniară dintre presiune și pătratul vitezei fiind constantă), care este un fenomen de absorbție ce trage corzile împreună când viteza aerului prin glotă este relativ mare. Dacă glota este inițial deschisă, efectul Bernoulli va cauza închiderea glotei.

Partea mioelastică a teoriei provine din faptul că mușchii (mio) modifică elasticitatea și tensiunea corzilor vocale în vederea modificării frecvenței vibrației corzilor vocale. Masa corzilor vocale, de asemenea, afectează frecvența vibratorie a acestora. Cu cât corzile devin mai scurte și mai groase, cu atât devin mai masive, frecvența vibrației scăzând. Cu cât corzile devin mai lungi și mai subțiri, cu atât devin mai puțin masive și pot vibra la o frecvență mai mare.

În figura (1.2.1) avem o reprezentare a secțiunii laterale a organelor vocale umane.

Figura 1.2.1. Organele vocale umane :

1)Cavitatea nazalã;

2)Bolta palatinã;

3)Puntea alveolarã;

4)Vãlul palatin(Velum);

5)Vârful limbii(Apex);

6)Dorsum;

7)Uvula;

8)Radix;

9)Faringele;

10)Epiglota;

11)Falsele corzi vocale;

12)Corzile vocale;

13)Laringele;

14)Esofagul;

15)Traheea

Când corzile vibrează, ele modulează curentul de aer dinspre plămâni, creând pulsuri de aer. Succesiunea pulsurilor de aer generate în urma vibrației corzilor produce un câmp acustic care înaintează pe tractul vocal. Sunetul generat are o înălțime ce depinde de frecvența de vibrație și o tărie ce depinde de amplitudinea undei de presiune acustică. Frecvența oscilației corzilor este determinată de masa acestora, lungimea, grosimea, elasticitatea și, evident, de presiunea subglotală.

După ce curentul de aer traversează glota, modificat de către faringe, cavitatea bucală și cavitățile nazale, este în final emis din buze și nări sub formă de sunete. Rata curentului de aer este considerată drept formă de undă a sursei acustice a sunetelor „sonore”. Aceste sunete sunt produse în urma vibrării corzilor vocale. Celelalte sunete sunt numite „nesonore” sau mute. În acest caz, corzile vocale rămân fixe și deci aerul eliminat din plămâni prin trahee este neafectat de vibrațiile glotale. Există două tipuri fundamentale de sunete nesonore: fricative și explozive. Primul este tipic sunetului s, care este produs expirând aer printr-o deschizătură strâmtă, cum ar fi dinții, pentru a produce un curent de aer. Al doilea, specific lui p în „puf”, este creat de eliberarea rapidă a presiunii aerului apărute în spatele unei închideri, cum ar fi cea a buzelor.

Corzile vocale sunt ținute deschise pentru sunetele nesonore. Pentru a aduce corzile la vibrație, presiunea subglotală trebuie să fie mai mare decât cea supraglotală. Există două surse majore de excitație: sonoră, când corzile vocale vibrează, și nesonoră, când corzile sunt ținute deschise. Un al treilea tip de excitație este numit uneori excitație mixtă. Acesta este o combinație între excitația sonoră și cea nesonoră, de exemplu în cazul fonemului z, în „zebră”. În acest caz, corzile vocale vibrează și de asemenea avem și un sunet turbulent produs de către vârful limbii în apropierea dinților.

În primul rând, presiunea plămânilor, tensiunea corzilor vocale și masa acestora afectează frecvența fundamentală a vibrației corzilor. Deci, frecvența fundamentală minimă, maximă și medie pentru bărbați, femei și copii diferă.

Calitatea vocii este afectată în primul rând de sursa sau forma de undă a ratei curentului de aer, în timp ce mișcarea articulatorilor afectează inteligibilitatea vorbirii.

Elementul primar ce controlează tractul vocal este limba, care-l împarte în două cavități rezonante, faringele și gura, acestea determinând caracteristica de transmisie a tractului vocal. Această caracteristică poate fi modificată prin cuplarea cavității nazale prin intermediul vălului palatin.

Caracteristica de transmisie a tractului vocal poate determina ca anumite componente frecvențiale ale semnalului laringeal să treacă mai puțin atenuate decât altele. Rezonanțele, sau vârfurile spectrului, se referă la formanți. Fiecare formant are, de asemenea, o lățime de bandă. Studiile menționează că primii doi sau trei formanți sunt în general suficienți pentru caracterizarea perceptuală a majorității vocalelor și consoanelor sonore ale vorbirii. Formanții mai înalți sunt importanți pentru o pronunție cât mai naturală sau de calitate. O structură similară se observă și în cazul sunetelor nesonore. Cea mai semnificativă bandă de frecvență pentru vorbire este aceea cuprinsă între 250 … 3000 Hz.

Vocalele

In limba română există 7 vocale, iar în limba engleză există 14 vocale, toate sonore. Locul articulației pentru acestea variază. Un exemplu este vocala /IY/, ca în „beet”, aceasta fiind o vocală înaltă, frontală, nerotunjită (nu scoate buzele în afară). /AO/, ca în „bought”, este o vocală joasă, îndepărtată, în timp ce /UW/, ca în „boot”, este o vocală înaltă, îndepărtată și rotunjită.

Vocale schwa (degenerate)

O schwa, numită adesea vocală degenerată, este o vocală spre care tind celelalte vocale atunci când una se articulează rapid sau imprecis în timpul vorbirii fluente. O vocală schwa tinde să fie scurtă în durată și slabă în amplitudine.

Diftongi

Un diftong este un fonem monosilabic alunecător ce pornește dintr-o poziție articulatorie pentru o vocală și se deplasează către poziția altei vocale. Se produce, de asemenea, o schimbare în rezonanța vocalei.

Jitter și shimmer la vocale

În timp ce vocalele și diftongii sunt considerați a fi stabili, aceștia sunt produși în urma unor variații în frecvență (acest fenomen numindu-se jitter) sau în amplitudine (shimmer).

Semivocale: vocale lichide și alunecătoare

Vocalele lichide sunt acelea care mișcă limba către puntea alveolară. Alunecătoarele sunt similare diftongilor, cu precizarea că au o tranziție mai rapidă, sunt produse cu vârful limbii ridicat și cu cavitatea bucală contractată.

Consoane

Cele 17 consoane ale limbii engleze se împart în mai multe subclase. De exemplu, după modul de articulare, avem consoane explozive sau apăsate, care sunt generate blocând curentul de aer în cavitatea bucală în vederea creșterii presiunii și apoi eliberând imediat presiunea. Există trei consoane explozive sonore și trei nesonore. Fricativele sunt adesea clasificate după tipul excitației, adică sonore și nesonore. Există patru fricative sonore și patru nesonore, ultimele formând o contracție în tractul oral în vederea producerii turbulenței (frecării). Consoanele nazale sunt generate coborând vălul pentru a conecta cavitatea nazală cu faringele și cu tractul oral, gura fiind închisă. Nazalele au o rezonanță în cavitatea nazală, aceasta introducând zerouri în funcțiile de transfer ale întregului sistem. Un murmur nazal se situează între 200 și 300 Hz la bărbați.

Africate

O africată este o consoană apăsată urmată de o eliberare fricativă. Una este sonoră și alta nesonoră.

Aspirate

O aspirată este un fonem produs de un curent de aer staționar prin coardele vocale deschise.

Continuante

Aceste foneme au un tract vocal fix, invariabil în timp, excitat de o sursă. Este vorba de vocale, fricative (sonore sau nesonore), semivocale, aspirate și nazale, toate fiind neîntrerupte, spre deosebire de apăsate (blocate).

Necontinuante

Aceste foneme au un tract vocal variabil, de exemplu, diftongii, apăsatele (blocatele) și africatele.

Sibilante

Sibilantele sunt sunete înalte, cu un șuierat evident.

Nesibilante

Nesibilantele sunt celelalte fricative care nu se încadrează în categoria sibilantelor.

Sonorante

Aceste foneme includ nazalele și semivocalele (lichidele și alunecătoarele), fiind produse de un curent de aer mai puțin strangulat.

Bara vocală

O bară vocală este un formant de frecvență foarte scăzută, de obicei apropiată de 150 Hz. Ea apare când coardele vocale vibrează și excită un tract nazal sau oral blocat. Fricativele sonore adesea conțin o bară vocală, de exemplu /Z/ în „zoo”.

Alofone

O alofonă este o variantă de fonem.

II. TEHNICI ȘI NOȚIUNI DE PRELUCRAREA SEMNALELOR

2.1. Energia de timp scurt

Se calculeaza energia de timp scurt cu o fereastrã de 23 ms deplasatã cu un pas de 11.5 ms, se impune un prag de trecere convenabil.

Pentru semnale nestaționare, de exemplu vorbirea, trebuie sã consideram energia definitã peste segmente rezonabil de scurte (în jurul a 20 ms). Pentru acest caz o definiție convenabilã pentru energia de timp scurt este:

(2.1.1)

unde w(m) este lațimea secvenței sau ferestrei ce selecteazã un segment din x(n), iar N este numãrul de eșantioane din fereastrã. Pentru cazul simplu când w(m) = 1, pentru orice m, E(n) este suma pãtratelor a celor mai recente valori N ale lui x(n).

Prima dificultate invocã alegerea ferestrei. Scopul ferestrei este de a atașa ponderi mai scãzute eșantioanelor “trecute”, de aceea w(m) tinde la 0 monoton când m tinde la infinit.

A doua dificultate o invocã alegerea intervalului N. Dacã N este prea mic, E(n) din ecuația (2.1.1) va varia foarte rapid depinzând de detaliile exacte ale semnalului. Daca N este prea mare, E(n) va varia foarte puțin, nereflectând schimbãrile din semnalul vocal. Convenabil pentru N este echivalentul a 10-20 ms de semnal.

Semnificația majora a E(n) este cã oferã un mijloc pentru a separa semnalul vocalizat. Energia pentru semnal nevocalizat este mai micã decât pentru semnalul vocalizat. Deci pentru un semnal vorbit de foarte bunã calitate energia poate fi folositã pentru a separa porțiunile vocalizate de cele nevocalizate.

O altã dificultate o reprezintã formula folositã pentru evaluarea energiei din ecuația (2.1.1), care este foarte sensibilã la nivele mari ale semnalului (ele intrã în calcul la pãtrat), de aceea variazã nedorit în anumite cazuri.

O cale relativ simplã de a ocoli aceastã problemã este folosirea pentru masurarea enegiei a relației:

(2.1.2)

2.2. Rata trecerilor prin zero (Nz)

Rata trecerilor prin zero se calculeazã cu ecuația (2.2.1), pentru care N are semnificația de numãrul de eșantioane al semnalului pentru care se calculeazã aceastã ratã.

(2.2.1)

2.3. Transformata Fourier și analiza Fourier de timp scurt

Spectrul semnalului vocal reflectã atât proprietãțile tractului vocal dat cât și ale semnalului excitație. Transformata Fourier standard constituie o metodã adecvatã pentru semnale periodice, tranzitorii sau aleatoare staționare și nu este aplicabilã direct la reprezentarea semnalului vocal ale cãrui proprietãți se schimbã pregnant în timp.

Proprietãțile temporale ale semnalului vocal – energia, trecerile prin zero, corelația – se pot însã considera invariabile pe intervale scurte de timp, de ordinul a 10-30 ms.

Se definește transformata Fourier dependentã de timp cu relația:

(2.3.1)

în care x(m) reprezintã semnalul vocal eșantionat, iar w(n-m) este o secvențã fereastrã ce determinã segmentul din semnalul de intrare care este analizat la momentul fixat de indicele n.

2.3.1 Transformata Fourier Discreta

TFD a unui semnal neperiodic x(n), definit pe intervalul este datã de relatia (2.3.1.1):

în care coeficienții spectrali X(k) sunt evaluați pentru .

Spectrul continuu al unui semnal de durata To secunde poate fi complet reprezentat prin eșantioane uniform distribuite în frecvențã, ele nefiind mai departate de 1/T0 Hz.

2.3.2. Calculul Transformatei Fourier Discrete

Cel mai evident mod de calcul este implementarea relațiilor de definiție direct:

(2.3.2.1)

Pentru reducerea numãrului de calcule vom apela la transformata Fourier rapidã (TFR).

2.3.3. Decimarea in timp

Unul dintre algoritmii TRF cei mai cunoscuți este denumit decimarea în timp. Operația de decimare constã în separarea sumei din relația de mai sus în douã sume, una pentru valorile pare și cealaltã pentru valorile impare ale lui n:

(2.3.3.1)

Se poate arãta simplu cã:

(2.3.3.2)

Indicele N aratã periodicitatea operatorului element cheie în obținerea algoritmului TFR.

Se observa cã:

(2.3.3.3)

Având în vedere aceasta, expresia TDF în N puncte, pentru secvența x(n) din (2.3.3.1), poate fi adusã la forma:

(2.3.3.4)

sau:

(2.3.3.5)

unde X1(k) și X2(k) sunt transformatele în N/2 puncte ale secvențelor x1(n)=x(2n), respectiv x2(n) =x(2n+1).

Deoarece X(k) este definitã pe intervalul iar X1(k) și X2(k) pentru este necesar sã se stabileascã o regula de interpretare a relatiei pentru valorile

Deoarece X1(k) = X1(k+N/2), X2(k)=X2(k+N/2) și relatia (2.3.3.5) este echivalentã cu:

(2.3.3.6)

Presupunãnd cã X1(k) și X2(k) sunt deja cunoscute pentru calculul TFD în N puncte cu ajutorul relației (2.3.3.6) necesitã N adunãri de numere complexe. Termenul este calculat o singurã datã pentru fiecare k, astfel cã sunt necesare doar N/2 înmulțiri complexe.

Rezoluția în frecvențã a transformatei este datã de relația unde fe este frecvența de eșantionare și N numãrul de puncte al transformatei.

Dacã x(nT) posedã componente spectrale distanțate la mai puțin decât rezoluția în frecvențã a transformatei, atunci TFD nu le poate reprezenta prin componente distincte.

Pentru aceasta este necesarã creșterea rezoluției reprezentãrii. Acest lucru se obține fie prin mãrirea duratei intervalului de analizã, fie prin mãrirea perioadei de eșantionare, fie prin mãrirea numãrului de eșantioane, sau pe ambele cãi.

2.4. Tehnica ferestruirii

Evidențierea unei secvențe finite din semnal se face cu ajutorul unor funcții de pondere numite funcții-fereastrã, sau mai scurt ferestre.

Aplicarea ferestrelor are consecințe importante asupra rezultatelor prelucrãrii, obținându-se rezultate diferite pentru diverse expresii ale funcției de pondere.

Spre exemplu, în cazul în care se face prelungirea periodicã a unui semnal neperiodic în intervalul de analizã (a se vedea figura 2.4.1), reziduul spectral care apare poate fi redus cu ajutorul funcțiilor fereastrã.

Se noteazã cu w(n) funcția fereastrã și cu W(n) transformata sa Fourier. Ele au urmatoarele proprietãți:

w(n) este realã, parã și pozitivã;

are lobul principal centrat în origine și lobii laterali simetrici de ambele parți;

dacã derivata de ordinul m a lui w(n) este discontinuã, atunci anvelopa lobilor laterali ai lui descrește asimptotic cu 6 dB/octavã.

Dacã F () este transformata Fourier discretã a semnalului inițial, atunci

Fw () = F()W() (2.4.1)

Interpretarea acestui rezultat se face ușor cu ajutorul unui exemplu în care fereastra este rectangularã, adicã de forma:

w(n)= (2.4.2)

Transformata sa este:

W(n)=exp. (2.4.3)

în care W(n) reprezinta nucleul Dirichlet. Valoarea lui Fw(ω) la o frecvențã oarecare ω=ω0 este suma tuturor contribuțiilor spectrale la fiecare ω ponderate cu fereastra centratã în ω0 și masurate la ω1.

O apreciere a performanțelor ferestrelor poate fi facutã evaluând abaterea A datã de relația:

A=[F(w)W(w)]-F(w) (2.4.4)

Abaterea depinde de caracteristicile ferestrei alese și este cauzatã de degradarea rezoluției din cauza lãțimii lobului central și de reziduul lobilor laterali îndepãrtați.

Farã a pierde din generalitate, se considerã W(n) ca fiind egalã cu unitatea în origine și limitat la intervalul < .

Figura 2.4.2 Aliura secventei esantionate.

Comparația între ferestre se poate face cu ajutorul a patru parametri care reflectã efectul acestor trei surse de degradare.

Pentru fereastra normalizatã, parametrii sunt urmãtorii:

b – frecvența la care lobul principal cade la valoarea de vârf a lobilor laterali ;

a1 – valoarea de vârf a lobilor laterali;

a2 – valoarea lobilor laterali la , valoarea la care se poate considera practic cã s-a atins un comportament asimptotic al descreșterii lobilor laterali;

d – raportul de descreștere asimptoticã a anvelopei lobilor laterali.

În continuare, se vor analiza acești parametri pentru câteva tipuri de ferestre cu utilizare largã. Se vor face de asemenea considerații asupra oportunitãții utilizarii unei anumite ferestre în funcție de acești parametri principali.

2.4.1 Fereastra dreptunghiulara (Dirichlet)

Este unitarã pe tot intervalul de observație și este definitã de relația:

(2.4.1.1)

La calculul TFD se considerã w(n) =1 pentru n = 0,1,…N; și zero în rest.

Se obține astfel:

W(n) = exp (2.4.1.2)

Nivelul primilor lobi laterali este de –13dB fațã de lobul principal.

Parametrii ferestrei sunt: b=0.81, a1=-13dB, a2=-46dB, d=6dB/oct (raportul de descreștere așteptat pentru o funcție cu o discontinuitate).

Ferestrele în cos α(n) constituie o familie de ferestre care depind de parametrul α întreg. Ele prezintã interes deoarece termenii lor pot fi ușor generați, iar proprietãțile transformatei funcțiilor cosinus sunt ușor de identificat. Aceste proprietãți sunt utile pentru calculul TFD.

Ele se definesc astfel:

w(n) = (2.4.1.3)

Prin schimbarea originii cu N/2 eșantioane se obține:

w(n) = (2.4.1.4)

Se observã schimbarea de funcție care exprimã modificarea fazei în a doua relație fațã de prima. Cele mai utilizate valori pentru α sunt numere întregi între 1 si 4. Pentru α=2 se obține fereastra Hanning (cosinus pãtrat), pentru care se obțin expresiile:

,.. (2.4.1.5)

și, respectiv, pentru fereastra translatatã:

(2.4.1.6)

De notat faptul cã dacã α crește ferestrele devin mai înguste și transformata reflectã aceastã îngustare prin descreșterea lobilor laterali, precum și accentuarea pantei descreșterii lor odatã cu lãrgirea lobului principal.

Parametrii ferestrei sunt: b = 1.87, a1 = -118dB, d = 18dB/oct (apar discontinuitati la a doua derivata).

Transformata Fourier a ferestrei Hanning este urmatoarea:

, (2.4.1.7)

în care este nucleul Dirichlet:

(2.4.1.8)

În relația (2.4.1.7) se recunoaște nucleul Dirichlet în origine, ca transformata eșantioanelor de amplitudine constantã 0.5 și perechea de nuclee translatate, ca transformata unui singur ciclu de eșantioane cosinus.

De notat cã nucleele translatate sunt localizate în primele locuri ale nucleului central, ei având dimensiunea redusã la jumãtate.

Sumarea lobilor laterali, care sunt în antifazã, tinde sã anuleze structura lor. Anularea parțialã a structurii lobilor laterali sugereazã o tehnicã de construcție pentru alte ferestre, cum este de exemplu fereastra Hamming.

2.4.2 Fereastra Hamming

Poate fi privitã ca o fereastra Hanning modificatã. Ea permite anularea mai pronunțatã a lobilor laterali. Se considerã fereastra datã de:

, (2.4.2.1)

ce are TFD:

. (2.4.2.2)

Anulare perfectã a primului lob lateral la .

Rezultã pentru α=25/46.

Dacã α se aproximeazã la 0.54, zeroul se produce la , obtinându-se o bunã atenuare a lobului lateral.

Pentru aceastã valoare a lui α fereastra este numitã Hamming și are expresia:

(2.4.2.4)

Fereastra translatatã devine:

(2.4.2.4)

Coeficienții ferestrei sunt apropiați de setul care realizeazã minimul lobilor laterali.

Parametrii ei sunt: b =1.91, a1 = -43 dB, a2 –63 dB, d =6 dB/oct.

Dupã cum s-a aratat anterior, aplicarea transformatei Fourier discrete unei secvențe finite de N eșantioane conduce la apariția unui reziduu spectral. Prin prelungirea periodicã a semnalului (necorelatã cu perioada sa naturala) la limitele intervalului de observație se vor produce discontinuitãți care determinã excluderea reziduului spectral. Reziduul spectral poate fi redus prin aplicarea funcțiilor fereastrã. Ordinul de discontinuitate la limitele de observație poate fi micșorat prin aplicarea ferestrei, dacã funcției sale de transfer w(n) i se impune condiția de a avea derivate nule sau aproape nule în punctele–limitã; în acest fel datele ponderate tind uniform spre 0 la marginea intervalului de observație.

2.5. Codarea perceptiva

Scopul final este obținerea unui vector caracteristic care sã conținã informații referitoare la sursa semnalului vocal și structura traiectului vocal de aceea, dupã efectuarea TFD pentru semnalul selectat, informația trebuie codatã în consecințã.

Este bine de știut cã sistemul auditiv analizeazã sunetele receptate în componente de frecvențã. Bazatã pe frecvențã, urechea este capabilã sã audã un sunet în prezența altor sunete de frecvențe diferite. Selectivitatea în frecvențã deține un rol important în multe aspecte ce privesc percepția auditivã și a fost în centrul atenției cercetatorilor din domeniu. Mulți cercetãtori sugereazã o abordare bazatã pe modelul de percepție al sunetului de cãtre urechea umanã (scara Bark sau Mel). În aceastã lucrare s-a folosit scara Mel, care modeleazã benzile critice din interiorul cohleei. De asemenea, s-a demonstrat cã scara Mel este mai bunã în comparație cu scara Bark în ceea ce privește recunoașterea vorbirii.

Percepția umanã a sunetului, fie pentru tonuri pure, fie pentru semnale vorbite, nu poate fi aproximatã de o scarã liniarã de masurã. În urma cercetatorilor s-a ajuns la soluția definirii subiective a înalțimii sunetului sau a tonurilor pure. Astfel pentru fiecare ton cu o frecvențã f, mãsuratã în Hz, o anumitã valoare a înãlțimii sunetului este mãsuratã pe scara Mel. Ca punct de referințã, valoarea unui ton cu frecvența de 1 KHz, la 40 dB deasupra pragului perceptiv, este definitã ca 1000 mel.

Figura 2.5.1. Scara Mel (0-10 KHz)

În figura 2.5.1 este reprezentatã funcția Mel pentru frecvențe începând de la 0 pânã la 10 KHz. Se observã o oarecare liniaritate a funcției pânã în jurul frecvenței de 1000 Hz.

Relațiile de conversie între scara Mel și frecvențã sunt date mai jos:

(2.5.1),

respectiv (2.5.2)

Conversiile pe scara Mel pot fi aplicate fie în domeniul timp sau în domeniul frecvențã. S-a ales domeniul frecvențã ceea ce înseamnã cã frecvențele FFTB sunt alese egal distanțate pe scara Mel, frecvențe între care avem 8 filtre trece bandã.

Aceste limite (Fmin=0, Fmax=0.5Fe) cât și numãrul de filtre sunt stabilite în functie de rezoluția doritã, caracteristica în frecvențã a microfonului cu care se face achiziția semnalului și nu în ultimul rând în funcție de semnalul analizat.

Se observã cã este conservatã informația referitoare la sursa de excitație și cea referitoare la parametrii traiectului vocal. În cazul codãrii perceptive rezoluția este mult mai bunã iar spectrul este relativ insensibil la prezența zgomotului.

În general, s-a descoperit cã percepția unei anumite frecvențe de cãtre auditori este influențatã de energia din banda criticã de frecvențã, în jurul acelei frecvențe. Astfel, spectrul Mel este simulat folosind un banc de filtre repartizate uniform în banda de frecvențã în funcție de caracteristicile scãrii Mel (energia fiecãrui filtru trece bandã aproximeazã spectrul modificat).

În figura (2.5.2) este reprezentat un astfel de banc de filtre, în care fiecare filtru trece bandã este de formã triunghiularã cu banda de frecvențã variabilã (direct proportionalã cu caracteristica Mel).

Figura 2.5.2. Banc de filtre trece bandã

Acest filtru este spectrul semnalului vocal, obținãndu-se la iesire semnalul codat perceptiv. De fapt, semnalul de la ieșire este egal cu produsul dintre amplitudinea semnalului spectral ce corespunde unei anumite frecvențe și amplitudinea pe care o are filtrul la acea frecvențã. Apoi se calculeaza energia corespunzatoare benzii de frecvențã a fiecarui FTB. Aceasta valoare va reprezenta o componentã a vectorului caracteristic al semnalului vocal care va fi de o dimensiune egalã cu numãrul de filtre.

Spectrul semnalului, obținut în urma aplicãrii transformatei Fourier, este trecut prin filtrele perceptive Mel, obținându-se spectrul Mel. Aceastã transfomare duce la o pierdere de rezoluție, lucru observat și în figura (2.5.3.a). De asemenea, vârfurile mici aflate lângã un vârf mare vor fi asimilate de acesta (2.5.3.c); vârfurile devin mai late datoritã piederii rezoluției (2.5.3.b); vârfurile care nu sunt localizate exact la centrul frecveței Mel al filtrului corespunzãtor își pot muta centrul pe centrul frecvenței Mel, de exemplu un vârf care are centrul la 110 Hz își poate muta centrul la 100 Hz.

Figura 2.5.3. Spectre FFT și spectrele Mel corespunzãtoare

În continuare, spectrul Mel este prelucrat în scopul obținerii coeficienților Mel folosind ecuația DCT (discrete cosine transform):

(2.5.3)

unde c(i) este un coeficient Mel, i=1,2,…C, S(m) reprezintã spectrul Mel și L este numãrul total de filtre Mel.

III. CUM AM PROCEDAT

Se încearcã recunoașterea literelor de cãtre program. Literele, 26 la numãr (a, ã, b, c, d, e, f, g, h, i, î, j, k, l, m, n, o, p, r, s, ș, t, ț, u, v, z), trebuie pronunțate cu pauze notabile între ele pentru a putea fi separate de cãtre program. Se va pronunța “bî”, “cî”, ș.a.m.d. Literele “â”, “q”, “w”, “y”, “x” au fost excluse deoarece au o pronunție complexã (“î din a”, “cs”, “dublu v”, etc.). Programul este un sistem de recunoașterea vocii dependent-de-vorbitor, bazat pe vorbire discretã. Se comparã ceea ce se spune cu o medie fãcutã pentru 5 seturi de înregistrãri/literã în sesiunea de antrenare a programului. Rezultatul este afișat pe ecran. Pentru fiecare literã se calculeazã lungimea (numãrul de eșantioane), rata trecirilor prin zero, energia și 8 coeficienți perceptivi.

Semnalul vocal este mai întâi prelucrat (filtrat, amplifcat), apoi este segmentat în cadre de 512 eșantioane (23 ms) cu o suprapunere de 256 eșantioane(11.5 ms), cadrele fiind ponderate cu o fereastrã Hamming. Dupã ponderare li se aplicã transformata Fourier folosind metoda de decimare în timp în 1024 puncte. Spectrul FFT este trecut printr-un banc de 8 filtre perceptive (8 FTB), obținându-se spectrul Mel, din care se vor obține coeficienții perceptivi doriți. Schema de codare perceptivã este prezentatã în figura (3.1).

Figura 3.1. Schema de codare perceptivã

Pentru a reduce zgomotul, semnalul este filtrat cu un filtru FIR (final impulse response) trece jos, care are frecvența de tãiere de 100 Hz, și cu un filtru FIR trece sus cu frecvența de tãiere de 11 Khz.

Figura 3.2.

De asemenea se dorește separarea semnalului util (semnal vocal) de perioadele de liniște. Acest lucru se realizeazã împãrțind semnalul în segmente de 256 eșantioane, fãrã suprapunere, pentru care se calculeazã energia. Impunen un prag pentru energie: cadrul a cãrui energie este mai mare decât pragul este considerat semnal util. Pentru a nu fi luate în considerare cadrele a caror energie depãșește pragul, însã semnalul este zgomot, vom pãstra doar segmentele de semnal care au cel puțin 10 cadre consecutive care au îndeplinit condiția.

Figura 3.3.

Odatã obținutã secvența de semnal care ne intereseazã, aceasta este segmentatã în cadre de lungime 512 eșantioane, cu o suprapunere de 256 eșantioane, care vor fi ponderate folosind fereastra Hamming. Semnalul ponderat este supus decimãrii în timp cu o rezoluție de 10 biți (1024 puncte). Se va obține spectrul semnalului.

Figura 3.4. Obținerea spectrului FFT

Figura 3.5. Obținerea spectrului Mel

Figura 3.6.

În continuare, spectrul Mel este prelucrat în scopul obținerii coeficienților Mel folosind ecuația DCT (discrete cosine transform):

(3.1)

unde c(i) este un coeficient Mel, i=1,2,…C, S(m) reprezintã spectrul Mel și L este numãrul total de filtre Mel.

Figura 3.7. Obținerea spectrului Mel

Figura 3.8. Coeficienți Mel

3.1 Algoritmul de codare Mel

În continuare voi prezenta algoritmul de calcul pentru bancul de filtre Mel:

Date de proiectare

intervalul de frecvențã : [100…11000]

Fmin=100 Hz FminMel=1000*log2(1.1)=lim1=137.5

Fmax=11 KHz FmaxMel=1000*log2(12)=lim2=3585

numarul de filtre trece bandã : nf=8

numãrul de puncte FFT: N=1024 (luãm 512 puncte corespunzãtoare intervalului [0…11000])

frecvența de eșantionare : Fes=22050 Hz rezoluția în frecvențã va fi fHz=Fes/N=21.5, iar FesMel=(lim2-lim1)/(nf+1)

Trebuie sã calculãm centrele și benzile filtrelor. Pașii algoritmului sunt:

calcularea limitelor în scara Mel:

Fmin(Hz) Fmin(Mel)

Fmax(Hz) Fmax(Mel)

lațimea benzii pe scara Mel este:

(3.1.1)

capetele și centrul filtrului “i” în frecvențã sunt:

(3.1.2)

(3.1.3)

(3.1.4)

unde k este indicele benzii: k=1,2,…nf

vrem sã obținem ecuația pentru partea ascendentã-descendentã a filtrului i :

(3.1.5)

(3.1.6)

vrem sã obținem energia pe banda ascendentã-descendentã:

(3.1.7)

asociem o frecvențã puntului “j” cu formula:

(3.1.8)

vrem sã obținem intervalul lui j perntru care:

(3.1.9)

(3.1.10)

(3.1.11)

calculãm energia pe banda ascendentã:

(3.1.12)

unde Al este amplitudinea |FFT| pentru punctul j

vrem sã obținem intervalul lui j pentru care:

(3.1.13)

(3.1.14)

(3.1.15)

calculãm energia pe banda descendentã:

(3.1.16)

calculãm energia totalã pe cele douã pante:

(3.1.17)

se repeta pașii 3-11 pentru i=1,2,..nf

3.2 Mixturi Gaussiene

O gaussianã se determinã cu ajutorul formulei :

,unde (3.2.1)

μ=media clasei 

σ=dispersia clasei 

x=elementele clasei

Mixturile gaussiene se calculeazã cu relația :

(3.2.2)

Modelul este caracterizat de “n” gaussiene, în cazul nostru 11.

Mediile și dispersiile se calculeazã folosind relațiile de mai jos :

(3.2.3)

(3.2.4)

unde:

j clasa

nj numãrul de elemente din clasa j

xj,k elementul k din clasa j

μj media clasei j

σj dispersia clasei j

În cazul nostru, avem 26 de modele – crespunzãtoare celor 26 de litere, fiecare model are câte 11 componente (numãrul de eșantioane, rata trecerilor prin zero, energia și 8 coeficienți perceptivi), fiecare componentã având media și dispersia ei.

3.3 Funcționarea globalã a sistemului

Avem 26 de litere; vorbitorul va pronunța de “n” (4-5) ori fiecare literã . Tiparul salvat în memorie va conține pentru fiecare literã o medie a celor “n” înregistrãri. Pentru fiecare înregistrare se calculeazã lungimea, rata trecerilor prin zero, energia și 8 coeficienți perceptivi . Se va obține o matrice caracteristicã, în care fiecare linie reprezintã un cadru de semnal analizat, iar coloanele parametrii semnalului. Pentru fiecare coloanã a matricii vom calcula o medie și o dispersie. În final vom avea 26 de modele.

Vorbitorul va pronunța litere separate de pauze notabile; programul va separa literele; pentru fiecare literã se determinã matricea caracteristicã; avem o matrice necunoscutã pe care vrem sã o etichetãm; pentru a vedea de care model se apropie mai mult aceastã matrice calculez F(x) din relația (3.2.2) pentru cele 26 de modele:

(3.3.1)

Rezultatul va fi vectorul f, care conține 26 de valori distincte. Pentru acest vector calculãm max(f). Matricea necunoscutã aparține modelului pentru care avem un maxim.

Schema bloc a sistemului este prezentatã în figura de mai jos:

Figura 3.3. Schema bloc a sistemului

IV. FIABILITATE SOFTWARE

Fiabilitatea este privită ca măsura încrederii pe care o avem în concepția și în capacitatea unui program de a funcționa corect în toate condițiile avute în vedere de la început. Această definiție se referă mai mult la fiabilitatea procesului decât la cea a programului, fiind legată de probabilitatea ca o eroare din program să fie activată de un set specific de intrări. Fiabilitatea produselor software este caracteristica ce exprimă poate cel mai bine particularitățile acestei industrii, dacă abordăm problema în comparație cu fiabilitatea produselor hardware. Există abordări cantitative ale fiabilității, exprimate prin probabilitatea ca un produs software să-și îndeplinească funcțiunile cu anumite performanțe și fără erori într-un interval de timp și în condiții de exploatare date, precum și abordări calitative ce privesc fiabilitatea ca o capacitate a produsului software. Standardul ISO/IEC 9126 [ISO1], definește fiabilitatea ca un set de atribute care se bazează pe capabilitatea produsului software de a-și menține nivelul de performanță în condiții și pe o perioadă de timp stabilite. Limitele fiabilității unui produs software se datorează erorilor din etapele de formulare a cerințelor, proiectare și implementare. Căderile datorate acestor erori depind de modul și condițiile în care este utilizat produsul. Corespunzător ciclului de viață al produsului software, putem distinge o fiabilitate previzională sau proiectată, o fiabilitate experimentală și o fiabilitate operațională (la beneficiar).

Fiabilitatea este aptitudinea produsului software de a funcționa în condiții anormale, în conformitate cu specificațiile sale de proiectare (definiție dată de Mayer). De exemplu, rezistența la introducerea de date incorecte, reluări posibile în caz de pană a sistemului (software sau hardware), posibilitățile de a lucra când totuși sistemul este degradat, etc. Acest factor nu este independent de contextul tehnic în care se utilizează aplicația software.

Problema determinării, asigurării și evaluării calității este o problemă destul de veche; ea a fost abordată de mult timp ceea ce a facut ca, înca de la sfârșitul anilor '80, I.S.O. să publice primele standarde referitoare la calitate. Conform standardului ISO-8402, calitatea este ansamblul caracteristicilor unei entități, care îi conferă aptitudinea de a satisface nevoile exprimate sau implicite. Aceasta se exprimă printr-un sistem de caracteristici, nu este de sine stătătoare și se definește în relația cu terții-clienți, producători, furnizori, sau comercianți. Este o variabilă continuă și presupune satisfacerea atât a nevoilor exprimate, cât și a celor implicite. Conceptul de calitate este tratat, în prezent, ca un concept dinamic, ce leagă calitatea produsului sau a serviciului de alte două elemente fundamentale: calitatea proiectului și calitatea fabricației.

Asigurarea calitații produsului final se realizează treptat, pe masură ce se avansează în procesul de obținere a acestuia. Calitatea sistemelor de programe se creează în procesul de realizare și se manifestă în procesul de utilizare a acestora. În industria de software, o importanță deosebită o are relația de dependență dintre specificul și calitatea procesului generator, calitatea proiectului și calitatea produsului.

Conform ISO 8402, calitatea este prezentă în fapt printr-un set de caracteristici ce pot fi împărțite în:

caracteristici economice: se exprimă prin intermediul costurilor, al economiilor de resurse, precum și prin creșterile de randament și de productivitate;

caracteristici sociale si psiho-senzoriale: se manifestă prin punerea în valoare a elementelor creatoare, prin eliminarea rutinei și a stereotipiei precum și prin instruirea asistată a operatorilor;

caracteristici tehnice si de utilizare: sunt prezentate în literatura de specialitate, iar I.S.O. a elaborat un model care reprezintă esența standardului ISO 9126 .

Între caracteristicile de calitate există o mulțime de relații de subordonare, interdependente, ierarhizare, agregare sau decompoziție, iar complexitatea acestor relații face ca ansamblul caracteristicilor de calitate să alcătuiască un sistem. Caracteristicile de calitate constituie agregări ale unor atribute de calitate, ce sunt corespunzatoare unor proprietăți concrete, pe care trebuie să le posede sistemele de programe.

Managementul calității este componenta funcției generale de conducere, care determină și pune în aplicare politica în domeniul calității și deține responsabilitățile pentru toate activitățile care concură la îndeplinirea obiectivelor privind calitatea. Există patru funcții principale ale managementului calității:

planificarea calității: cuprinde activitățile prin care se stabilesc obiectivele și cerințele privind calitatea;

controlul calității: include activitățile de monitorizare a desfășurării proceselor și de evaluare a rezultatelor referitoare la calitate, în raport cu obiectivele stabilite, în scopul eliminării deficiențelor și/sau prevenirii apariției acestora;

asigurarea calității: cuprinde activitățile preventive prin care se urmărește, în mod sistematic, corectitudinea și eficiența activităților de planificare și control, pentru a garanta obținerea rezultatelor la nivelul calitativ asteptat;

îmbunătățirea calității: cuprinde activitățile desfășurate în fiecare etapă a ciclului de viață a produsului, în scopul obținerii unui nivel calitativ superior celui planificat, în condițiile desfașurării corespunzătoare a activitaților de planificare, control și asigurare a calității.

4.1. Metode de realizare a software-ului fiabil

Datorită dificultăților întâmpinate la studierea ”a posteriori” a fiabilității software-ului, s-a impus necesitatea găsirii unor metode de proiectare fiabilă a software-ului. Dintre principiile de bază care trebuie respectate la proiectare se pot aminti:

proiectul produsului software trebuie să fie corect din punct de vedere logic și compatibil cu specificațiile temei de proiectare;

din punct de vedere al fiabilității și mentenabilității, el trebuie să aibă o structură modulară, fiecare modul să aibă o dimensiune mică și să comunice cu celelalte printr-un singur punct;

utilizarea principiilor programării structurate, care asigură o mai mare claritate și logică internă, posibilitatea tipizării proiectării și facilitatea reproiectării și mentenanței produselor software;

utilizarea tehnicilor orientate pe obiect.

Proiectarea produselor software poate fi realizată utilizând mai multe metode și anume: descendentă (top-down), ascendentă (bottom-up), sau mixtă (top-down-bottom-up).

O importantă contribuție la realizarea de produse software fiabile o poate aduce utilizarea tehnicilor de programare defensivă. Aceasta presupune includerea în programele proiectate a unor verificări care să permită reducerea substanțială (sau chiar eliminarea) unor posibile erori software. De exemplu, în cazul proiectării unui modul de program, proiectantul trebuie să pornească de la premisa că modulul poate accepta date de intrare incorecte, ceea ce poate conduce la date de ieșire incorecte, dar credibile. Pentru a înlătura acest pericol, conform principiilor programării defensive vor trebui incluse, la începutul modulului de program, verificările corespunzătoare asupra datelor de intrare.

Un sistem tolerant la erori își poate continua execuția corectă a funcțiilor sale de intrare/ieșire chiar în prezența unei mulțimi de erori ce apar în timpul funcționării sale, fără o intervenție din exterior. Prin execuția corectă se va înțelege că programele, datele și rezultatele operării sistemelor nu conțin erori, iar timpul de execuție a unei operații nu depășește o limită specificată.

La proiectarea unui sistem software tolerant la erori trebuie avute în vedere următoarele obiective principale:

detectarea și localizarea erorilor software;

limitarea, cât mai mult posibil, a efectului propagării erorilor;

verificarea integrității sistemului, periodic sau înaintea executării proceselor critice.

În firmele de soft există norme privind munca de programare, și condiții de calitate, care stabilesc media erorilor la mia de linii de cod, numărul mediu de erori care pot fi corectate în etapele de testare, precum și procentul de eventuale erori nedepistate. Gradul de acceptare al acestor erori depinde de destinația sistemului și influențează desigur prețul de vânzare al produsului program, sau a sistemului în ansamblu.

Analiza, depistarea și corectarea erorilor din pachetele de programe, a bug-urilor, este o activitate curentă în orice firmă de soft. În decursul anilor s-au încercat diferite procedee de automatizare a depistării și corectării erorilor, realizarea unor mecanisme de testare a programelor. A rămas celebru un panseu al lui Djikstra care sună cam așa: "Orice program de test poate evidenția cel mult prezența unei erori, niciodată absența erorii".

Redundanța software poate fi implementată la diferite niveluri: sistem, instrucțiune, date. Pot fi evidențiate două metodologii principale pentru restabilirea, în limite acceptabile de timp, a funcționării continue a sistemului software după erori. Chiar și în cazul utilizării redundanței software, este posibil să existe unele erori software ce nu pot fi detectate. De aceea, se impune realizarea de software tolerant la erori prin: redundanța software statică sau redundanța software dinamică.

Redundanța software statică presupune existența mai multor module software (cel puțin 3), care au aceleași funcții și funcționează cvasi-simultan. Pentru minimizarea efectului erorilor software datorate proiectării, este indicat ca modulele să fie realizate în mod independent. Utilizarea redundanței statice prezintă dezavantajul supraîncărcării procesorului hardware. În timpul execuției, cantitatea de resurse necesare (memorie, timp de execuție, etc.) pentru o aplicație crește proporțional cu numărul modulelor redundante.

În cazul redundanței software dinamice, la apariția unei erori în modulul soft principal, acesta este imediat înlocuit cu un modul de rezervă care a fost proiectat să realizeze aceleași funcțiuni.

Scopul redundanței software constă în detectarea defectărilor hardware, corecția erorilor (acolo unde este posibil), și restabilirea funcționării după apariția unei defectări.

4.2. Nivele prescrise de fiabilitate

Încă din faza stabilirii cerințelor și specificațiilor, trebuie să se impună nivelul de fiabilitate al sistemului ca un compromis între prețul de cost și consecințele defectărilor. Astfel, un produs software conceput pentru cercetări spațiale cu participare umană trebuie să aibă o fiabilitate mai mare decât unul pentru jocuri pe calculator. Este necesar deci ca produsele software să se înscrie în anumite clase de fiabilitate. Clasele de fiabilitate sunt următoarele:

foarte scazută (very low). Acest nivel se prescrie atunci când defectarea are ca singură consecință inconvenientul producătorului de a înlătura o neregulă în program. Asemenea situație intervine, de exemplu în cazul modelelor demonstrative sau al simulărilor. Este cazul sistemului tratat în acestã lucrare.

scazută (low). Acet nivel corespunde în cazurile în care defectarea implică o pierdere mică, ușor de recuperat pentru beneficiar. Sistemele utilizate în predicție pe termen lung sunt exemple tipice.

nominală (nominal). Acest nivel corespunde cazului când defectarea implică o pierdere moderată pentru beneficiar, dar remedierea situației nu este prea costisitoare. Sistemul de gestionare a stocurilor sau sistemele informaționale de conducere sunt exemple tipice pentru această clasă de fiabilitate.

ridicată (high). Efectele defectării pot implica o pierdere financiară mai mare sau un inconvenient major pentru factorul uman. Exemple tipice sunt sistemele bancare și cele ale distribuției energiei electrice.

foarte ridicată (very high). Efectele defectării pot consta în pierdere de vieți omenești. Cazul tipic îl constituie sistemul de control al reactoarelor nucleare.

În funcție de nivelul de fiabilitate prescris se poate stabili ce efort este necesar să fie alocat în fiecare etapă a realizării produsului. În figura (4.1) se reprezintă acest efort normat la cel necesar obținerii unei fiabilități nominale. Figura poate fi utilizată și în vederea evaluării produsului pe baza efortului investit în procesul de realizare. Se observă că diferențele în ceea ce privește efortul investit devin mai mari în fazele de integrare și testare.

Figura 4.1. Reprezentarea efortului pentru asigurarea

nivelului de fiabilitate prescris

4.3. Proiectarea structurii

Asigurarea fiabilității la nivelul proiectului se bazează pe realizarea unei structuri cât mai simple și transparente. Pentru a avea control asupra acestor caracteristici trebuie să se cunoască:

P1= numărul total de module din program

P2= numărul de module dependente de intrari( I) sau ieșiri( E)

P3= numărul de module dependente de o procesare anterioară

P4= numărul de elemente din bazele de date

P5= numărul elementelor neunice din baza de date

P6= numărul de segmente din baza de date

P7= numărul de module cu mai mult de o intrare și o ieșire

Cu ajutorul mărimilor P1-P7 se evaluează 6 mărimi derivate D1-D6 care exprimă simplitatea structurii programului. Cu cât valorile Di sunt mai mari, cu atât este mai îndoielnică fiabilitatea programului. Aceste valori conțin urmãtoarele informații:

D1 – este o variabilă binară egală cu “0” dacă proiectarea este descendentă și cu “1” în caz contrar

D2 = P2/P1 – exprimă dependența la nivelul modulelor

D3 = P3/P1 – exprimă dependența la procesarea anterioară

D4 = P5/P4 – arată mărimea bazei de date

D5 = P6/P4 – arată compartimentarea bazei de date

D6 = P7/P1 – arată mărimea interacțiunii programului cu exteriorul .

O sinteză a mărimilor D1 – D6 este dată de indicele de structurare al proiectului DSM, care are expresia :

(4.3.1)

unde wi sunt ponderi alese în funcție de importanța fiecărei caracteristici Di. Valori apropiate de 1 pentru D1-D6, respectiv pentru DSM, indică o deficiență a proiectului care trebuie corectată prin reproiectare, astfel încât să se micșoreze mărimile primare P1-P7. Orice modificare în proiect trebuie analizată din unghiul de vedere al indicelui de structurare pentru a decide în ce măsură modificarea propusă îmbunătățește proiectul. Indicele de structurare permite de asemenea evaluarea comparativă a unor proiecte diferite.

4.4. Metrici software

Metricile software pot fi împărțite în două categorii:

1. Metrici software de producție;

2. Metrici software de proces.

Primele măsoară produsele soft din punct de vedere al producerii lor, cum ar fi codul sursă sau documentele de proiectare.

Cele din a doua categorie măsoară procesul de dezvoltare a software-ului, cum ar fi numărul de ore/om necesare în activitățile de dezvoltare, proiectare și codificare ale produsului soft.

Metricile sunt folositoare în condițiile în care sunt implementate într-o secvență bine fundamentată de activități. Pașii de urmat în utilizarea metricilor, sunt:

1–evaluarea procesului;

2–determinarea metricilor și a datelor ce trebuie colectate;

3–determinarea celor mai potrivite tehnici și instrumente pentru a fi utilizate în cadrul proiectului;

4–estimarea costului și programului proiectului;

5–determinarea nivelului metricilor;

6–construirea unei baze de date a proiectului;

7–evaluarea costului și a programului proiectului;

8–evaluarea productivității și a calității;

9–formarea unei baze pentru estimări viitoare.

V. CALCUL ECONOMIC

5.1 Generalități

La prima vedere, calculul în termeni de prestații în muncă ia în considerare și condițiile naturale non-umane ale producției. În conceptul timpului mediu necesar de muncă socială, legea randamentelor descrescătoare este luată în calcul doar în măsura în care poate fi pusă pe seama condițiilor naturale de producție. Dacă cererea pentru anumite mărfuri crește, din această cauză trebuind să fie exploatate resurse naturale mai proaste, atunci crește și timpul mediu de muncă socială, necesar la fabricarea unei unități de produs. Dacă se reușește descoperirea unor resurse naturale mai favorabile, atunci quantumul necesar de muncă socială scade. Dar această luare în calcul a condițiilor naturale de producție este satisfăcătoare numai în măsura în care se reflectă în modificările volumului necesar de muncă socială. De aici încolo, evaluarea în termeni de prestații în muncă eșuează. Ea neglijează total consumul factorilor materiali de producție.

Costul de producție este o categorie economică legată de existența producției de mărfuri, de procesul de formare a valorii și de prețuri.

Calculul economic reprezintă un calcul foarte amănunțit al costului de producție al programelor respective.

În sfera producției materiale, costul de producție este forma bănească a unui conținut ce reprezintă consumul de mijloace materiale și forță de muncă, necesare pentru producerea și desfacerea bunurilor materiale. El include tot ceea ce înseamnă cheltuială de producție suportată de întreprinzător pentru producerea și desfacerea bunului respectiv.

Între costul de producție și prețul de vânzare există deosebiri atât cantitative, cât și calitative. Astfel prețul este mai mare decât costul de producție incluzând în plus și profitul. Deosebirea calitativă este că, în timp ce prețul asigură mijloacele necesare producției lărgite, costul de producție asigură doar recuperarea cheltuielilor de producție.

Potrivit legislației în vigoare, în țara noastră costul de producție este împărțit în următoarele grupe de cheltuieli:

Cheltuieli materiale (materii prime, energie, materiale și combustibili) Cmp.

Cheltuieli directe cu munca vie (retribuții directe plătite muncitorilor, impozit pe fondul de retribuții directe Ifr, contribuții pentru asigurări sociale Cas).

– Contribuții la fondul de cercetări științifice;

– Impozite (pe clădiri);

– Fond pentru ajutor de șomaj, alte cheltuieli.

Cdmv = Rd + Ifr + Cas (5.1.1)

Elementele componente ale costului de producție se modifică de la o perioadă de timp la alta sub influența factorilor externi și interni.

Mărimea costului de producție exprimă toate cheltuielile cu mijloacele de producție și plata salariilor, cheltuieli ce se efectuează pentru producerea și desfacerea bunurilor de materiale.

Reducerea costului de producție înseamnă micșorarea cheltuielilor pe unitatea de produs și este o necesitate obiectivă impusă de creșterea rentabilității, sporirea profitului și a productivității muncii.

Reducerea costului de producție atrage după sine creșterea calității produsului, realizarea unor specializări suplimentare.

Diminuarea costului de producție se poate face pe mai multe căi:

Prin reducerea costului materialelor;

Prin utilizarea eficientă a capitalului fix;

Prin creșterea productivității muncii;

Prin reducerea cheltuielilor administrativ – gospodărești.

La efectuarea calculului economic se poate ține cont și de o serie de costuri, cum ar fi:

Costul fix se referă la cheltuieli independente de volumul producției (chirii, amortizarea mașinilor, a clădirilor, etc.);

Costul variabil se modifică odată cu modificarea volumului de producție;

Costul marginal exprimă sporul de cheltuieli necesare pentru obținerea unei unități suplimentare de produs;

Costul cercetării științifice este dat de cheltuielile pentru cercetarea propriu – zisă și pentru aplicarea în practică a rezultatelor activității de cercetare- proiectare în vederea realizării prototipului;

Costul tehnologic se caracterizează prin individualizarea cheltuielilor directe și a unei părți însemnate din cheltuielile indirecte, în special cu întreținerea și folosirea utilajelor.

Procesul de formare al costului de producție este dat de nivelul secției de cheltuielile directe la care se adaugă cheltuielile cu întreținerea și funcționarea utilajelor (CIFU), cheltuieli generale ale secției cu munca vie (CMDV), care sunt necesare în scopul asigurării necesităților de iluminare și încălzire, etc.

Cheltuielile directe (Cd) la care se adaugă cheltuielile necesare pentru materii și materiale și cheltuielile directe cu munca vie (Cmp), din care se scade costul materialelor refolosibile și recuperabile (C), sunt date de formula :

Cd = Cmp + Cdmv – C (5.1.2)

Valoarea aparatului se calculează cu relația următoare:

I = Pa + Cm + Pc + Ct (5.1.3)

unde: – I – investiția;

– Pa – prețul aparatului;

– Cm – cheltuieli de montaj (asamblare);

– Ct – cheltuieli pentru transport.

5.2. Calculul economic pentru program

Deoarece tema proiectului implică numai realizare soft, va trebui să calculăm costul economic al programului realizat folosind Matlab 6.0.

Pentru realizarea acestui program este nevoie de:

Un computer cu sistem de operare WINDOWS XP/2000 preinstalat care se evaluează la circa 25 milioane lei.

Licența pentru Matlab 6.0. se estimează la circa 30 milioane lei.

Programarea ca formă de muncă este plătită cu circa 700.000/zi la o normă de 30 de linii de program, această sumă fiind variabilă în funcție de țară, nivel de trai, etc.

În cazul nostru avem circa 550 de linii de program realizate în Matlab 6.0.

Nr. linii program la zi = 30

Nr. total linii = 550

Nr. zile = Nr. total linii / Nr. linii program la zi

Nr. zile = 550/30 ≈ 18 zile

Considerăm că un programator lucrează, astfel, 18 zile pentru care retribuția sa este de:

Retribuție = Nr. zile *700.000 = 12.600.000 lei

Această sumă poate varia de la firmă la firmă în funcție de prețul pe linia de program sau de norma pe care o are un programator.

VI. REZULTATE ȘI CONCLUZII

Programul are o acuratețe de 50%. Acest lucru se datoreazã mai multor cauze:

Vorbitorul nu poate pronunța aceeași literã în exact același mod. Rezultã o varietate foarte mare pentru o aceeși literã. În figura (6.1) se exemplificã acest fapt pentru litera “a”. Se observã diferența în lungime și în amplitudine a semnalului.

Figura 6.1.

Aceste diferențe apar datoritã accentului, vitezei diferite de vorbire, înãlțimii, volumului și intonației. Alte cauze care pot influența vocea și pronunția sunt : vorbitorul este rãcit, rãgușit, etc.

Oricare ar fi natura acestor diferențe, ele se vor regãsi în valorile matricii caracteristice. În figura (6.2) se observã acest lucru pentru coeficienții Mel.

Figura 6.2

Asemãnarea foneticã a unor litere sau pãrți din litere. Ca de exemplu litera “o” cu litera “u” (figura 6.3), litera “a” cu litera “k” (pronunțatã “ca”)(figura 6.4), litera “p” cu litera “f” (figura 6.5), etc. Cum separarea semnalului util se face cu ajutorul energiei semnalului, se poate întâmpla ca energia unei pãrți dintr-o literã sã fie sub pragul impus și, deci, sã nu fie luatã în considerare. Ce va rãmâne s-ar putea sã fie mai aprope de modelul altei litere.

Figura 6.3

Figura 6.4

Figura 6.5

Aceastã asemãnare în domeniul fonetic se poate observa și vizualizând coeficienții perceptivi, ca pentru literele “o” și “u” în figura de mai jos.

Figura 6.6

Zgomotul poate fi o problemã majorã. În prezența unei perturbații acustice neprevăzute sistemele de recunoaștere automată a vorbirii se pot comporta mult inferior analizatorilor umani. În cazul de fațã, zgomotul produs de cooler-ul calculatorului este prezent pe toate înregistrãrile într-o mai mare sau mai micã mãsurã. Acest zgomot modificã rata de trecere prin zero, care este un parametru important. De asemenea, zgomotul poate prelungi secvența de semnal util. Zgomotul este foarte periculos pentru sesiunea de antrenare a programului, având în vedere cã aceste înregistrãri vor constitui tiparul cu care se vor compara înregistrãrile ulterioare.

Programul trebuie sã decidã de care din cele 26 de modele se apropie mai mult matricea carateristicã. Însã, datoritã faptului cã sunt 26 de modele, fiecare conținând 11 medii și 11 dispersii, este inevitabil producerea unor erori generate de întrepãtrunderea claselor, astfel încât, dupã calcularea vectorului “f”, max(f) sã nu corespundã modelului literei pronunțate și fk corespunzãtor literei pronunțate sa fie pe poziția 2, 3, etc.

Așadar limitãrile acestui program sunt destul de evidente. Pentru a mãri acuratețea este nevoie fie de algoritmi mai buni, fie de o analizã mai detaliatã a vorbirii, sau de ambele.

O analizã mai detaliatã implicã mai multe resurse și un timp mai îndelungat pentru obținerea unui rezultat. Trebuie ales cu grijã nivelul de analizã astfel încât cerințele de sistem și de timp sã nu fie exagerate.

În ceea ce privește algoritmii de calcul, o îmbunãtãțire a acestora va mãri acuratețea și scurta timpul necesar analizei. Un început ar fi folosirea HMM-urilor (Hidden Markov Models) pentru alinierea și segmentarea semnalului.De asemenea, algoritmul de decizie ar putea lucra în etape, de exemplu litera vorbitã este vocalã sau consoanã ; dacã este consoanã, ce tip de consoanã este ; și așa mai departe.

Acest program este un studiu legat de recunoașterea vorbirii, utilitatea comercialã fiind micã datoritã faptului cã la baza recunoașterii stau literele și nu cuvinte sau propoziții. De menționat cã aceastã metodã va avea o acuratețe micã pentru sisteme de recunoaștere a vorbirii ce folosesc cuvinte sau propoziții, alte metode, destul de similare fiind folosite la realizarea lor.

VII. Bibliografie

Adelaida Mateescu, Neculai Dumitriu, Lucian Stanciu, “Semnale și sisteme” – Editura Teora, București, 2001

Cornelia Istode Novac, “Inginerie software” – Editura Tehnicã, București, 1999

http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html

http://www.acoustics.hut.fi

http://www.hitl.washington.edu

http://www-2.cs.cmu.edu/~mseltzer/sphinxman/

http://cs.joensuu.fi/pages/tkinnu/research/index.html

ANEXA 1

Programele sursã

1)Funcția coef(x,sr) calculeazã pentru un vector de date x, prelevat cu frecvența de eșantinare sr, 11 coeficienți. Rezultatul este o matrice koef în care fiecare linie reprezintã un cadru de lungime 512 eșantioane analizat din vectorul de intrare, iar pe coloane avem în ordine :lungimea totalã a vectorului, rata de trecere prin zero a vectorului, energia cadrului și 8 coeficienți perceptivi calculați pentru cadrul respectiv.

function koef=coef(x,sr)

load 'FTS.mat' Num1 Den1;

load 'FTJ.mat' Num Den;

xftj=filter(Num1,Den1,x);

xf=filter(Num,Den,xftj);

fxf=enframe(xf,256);

for i=1:length(fxf(:,1))

mxf(i,:)=melcepst(fxf(i,:),sr,'0p',1,floor(3*log(sr)),256);

end

m=0;

while m~=length(fxf(:,1))

m=m+1;

if mxf(m,1)>-20

xt=0;

while mxf(m,1)>-20

if m==length(fxf(:,1))

break;

end

xt=[xt fxf(m,:)];

m=m+1;

end

if length(xt(1,:))>3000

mel=melcepst(xt,sr,'0',8,floor(3*log(sr)),512);

Nz=0;

for i=2:length(xt)

if sign(xt(1,i-1))>=sign(xt(1,i))

Nz=Nz+sign(xt(1,i-1))/2-sign(xt(1,i))/2;

else

Nz=Nz+sign(xt(1,i))/2-sign(xt(1,i-1))/2;

end

end

for j=1:length(mel(:,1))

koef1(j,:)=[Nz mel(j,:)];

end

for j=1:length(mel(:,1))

koef(j,:)=[length(xt) koef1(j,:)];

end

end

end

end

2) Funcția meddisp(koef) calculeazã pentru o matrice koef media și dispersia conform ecuațiilor (3.2.3) și (3.2.4). Rezultatul va fi pus în 2 vectori de lungime 11 : media și dispersia.

function [media,dispersia]=meddisp(koef)

for j=1:length(koef(1,:))

media(j)=0;dispersia(j)=0;

for k=1:length(koef(:,1))

media(j)=media(j)+koef(k,j);

end

media(j)=media(j)/k;

for k=1:length(koef(:,1))

dispersia(j)=dispersia(j)+(koef(k,j)-media(j))^2;

end

dispersia(j)=dispersia(j)/(k-1);

end

3) Funția mixtura(koef,media,dispersia) calculeazã pentru o matrice caracteristicã koef mixtura gaussienã datã de formula (3.2.2), folosind vectorii media și dispersia dați de un singur model. Rezultatul va fi o valoare discretã f.

function f=mixtura(koef,media,dispersia)

f=0;

for j=1:2

medi(j)=0;dispersi(j)=0;

for k=1:length(media(1,:,1))

medi(j)=medi(j)+media(1,k,j);

end

medi(j)=medi(j)/k;

for k=1:length(media(1,:,1))

dispersi(j)=dispersi(j)+(media(1,k,j)-medi(j))^2;

end

dispersi(j)=dispersi(j)/(k-1);

for k=1:length(koef(:,1))

f=f+exp(-(medi(j)-koef(k,j))^2/dispersi(j));

end

end

for i=3:length(koef(1,:))

for k=1:length(koef(:,1))

media1(i)=media(1,1,i);

dispersia1(i)=dispersia(1,1,i);

for n=1:length(media(1,:,1))

media1(i)=media1(i)+media(1,n,i);

dispersia1(i)=dispersia1(i)+dispersia(1,n,i);

end

media1(i)=media1(i)/length(media(1,:,1));

dispersia1(i)=dispersia1(i)/length(media(1,:,1));

f=f+exp(-(media1(i)-koef(k,i))^2/dispersia1(i));

end

end

4) Funcția compmixt(koef) folosește funcția mixtura pentru a calcula pentru matricea caracteristicã koef mixturile gaussiene pentru cele 26 de modele, a cãror medii și dispersii sunt luate din fișierul alfabetul.mat. Rezultatul va fi un vector de lungime 26.

function f=compmixt(koef)

load 'alfabetul.mat' media dispersia;

for i=1:length(media(:,1,1))

f(i)=mixtura(koef,media(i,:,:),dispersia(i,:,:));

end

5)Fișierul alfabetul.m calculeazã și salveazã în fișierul alfabetul.mat mediile și dispersiile pentru cele 26×5 litere care reprezintã sesiunea de antrenare. Cei 2 vectori au dimensiunile 26x5x11.

clc;clear;close all;

sr=22050;

n=1;

[media(1,n,:),dispersia(1,n,:)]=meddisp(coef(wavread('a1.wav'),sr));

[media(2,n,:),dispersia(2,n,:)]=meddisp(coef(wavread('aa1.wav'),sr));

[media(3,n,:),dispersia(3,n,:)]=meddisp(coef(wavread('b1.wav'),sr));

[media(4,n,:),dispersia(4,n,:)]=meddisp(coef(wavread('c1.wav'),sr));

[media(5,n,:),dispersia(5,n,:)]=meddisp(coef(wavread('d1.wav'),sr));

[media(6,n,:),dispersia(6,n,:)]=meddisp(coef(wavread('e1.wav'),sr));

[media(7,n,:),dispersia(7,n,:)]=meddisp(coef(wavread('f1.wav'),sr));

[media(8,n,:),dispersia(8,n,:)]=meddisp(coef(wavread('g1.wav'),sr));

[media(9,n,:),dispersia(9,n,:)]=meddisp(coef(wavread('h1.wav'),sr));

[media(10,n,:),dispersia(10,n,:)]=meddisp(coef(wavread('i1.wav'),sr));

[media(11,n,:),dispersia(11,n,:)]=meddisp(coef(wavread('ii1.wav'),sr));

[media(12,n,:),dispersia(12,n,:)]=meddisp(coef(wavread('j1.wav'),sr));

[media(13,n,:),dispersia(13,n,:)]=meddisp(coef(wavread('k1.wav'),sr));

[media(14,n,:),dispersia(14,n,:)]=meddisp(coef(wavread('l1.wav'),sr));

[media(15,n,:),dispersia(15,n,:)]=meddisp(coef(wavread('m1.wav'),sr));

[media(16,n,:),dispersia(16,n,:)]=meddisp(coef(wavread('n1.wav'),sr));

[media(17,n,:),dispersia(17,n,:)]=meddisp(coef(wavread('o1.wav'),sr));

[media(18,n,:),dispersia(18,n,:)]=meddisp(coef(wavread('p1.wav'),sr));

[media(19,n,:),dispersia(19,n,:)]=meddisp(coef(wavread('r1.wav'),sr));

[media(20,n,:),dispersia(20,n,:)]=meddisp(coef(wavread('s1.wav'),sr));

[media(21,n,:),dispersia(21,n,:)]=meddisp(coef(wavread('ss1.wav'),sr));

[media(22,n,:),dispersia(22,n,:)]=meddisp(coef(wavread('t1.wav'),sr));

[media(23,n,:),dispersia(23,n,:)]=meddisp(coef(wavread('tt1.wav'),sr));

[media(24,n,:),dispersia(24,n,:)]=meddisp(coef(wavread('u1.wav'),sr));

[media(25,n,:),dispersia(25,n,:)]=meddisp(coef(wavread('v1.wav'),sr));

[media(26,n,:),dispersia(26,n,:)]=meddisp(coef(wavread('z1.wav'),sr));

n=2;

[media(1,n,:),dispersia(1,n,:)]=meddisp(coef(wavread('a2.wav'),sr));

[media(2,n,:),dispersia(2,n,:)]=meddisp(coef(wavread('aa2.wav'),sr));

[media(3,n,:),dispersia(3,n,:)]=meddisp(coef(wavread('b2.wav'),sr));

[media(4,n,:),dispersia(4,n,:)]=meddisp(coef(wavread('c2.wav'),sr));

[media(5,n,:),dispersia(5,n,:)]=meddisp(coef(wavread('d2.wav'),sr));

[media(6,n,:),dispersia(6,n,:)]=meddisp(coef(wavread('e2.wav'),sr));

[media(7,n,:),dispersia(7,n,:)]=meddisp(coef(wavread('f2.wav'),sr));

[media(8,n,:),dispersia(8,n,:)]=meddisp(coef(wavread('g2.wav'),sr));

[media(9,n,:),dispersia(9,n,:)]=meddisp(coef(wavread('h2.wav'),sr));

[media(10,n,:),dispersia(10,n,:)]=meddisp(coef(wavread('i2.wav'),sr));

[media(11,n,:),dispersia(11,n,:)]=meddisp(coef(wavread('ii2.wav'),sr));

[media(12,n,:),dispersia(12,n,:)]=meddisp(coef(wavread('j2.wav'),sr));

[media(13,n,:),dispersia(13,n,:)]=meddisp(coef(wavread('k2.wav'),sr));

[media(14,n,:),dispersia(14,n,:)]=meddisp(coef(wavread('l2.wav'),sr));

[media(15,n,:),dispersia(15,n,:)]=meddisp(coef(wavread('m2.wav'),sr));

[media(16,n,:),dispersia(16,n,:)]=meddisp(coef(wavread('n2.wav'),sr));

[media(17,n,:),dispersia(17,n,:)]=meddisp(coef(wavread('o2.wav'),sr));

[media(18,n,:),dispersia(18,n,:)]=meddisp(coef(wavread('p2.wav'),sr));

[media(19,n,:),dispersia(19,n,:)]=meddisp(coef(wavread('r2.wav'),sr));

[media(20,n,:),dispersia(20,n,:)]=meddisp(coef(wavread('s2.wav'),sr));

[media(21,n,:),dispersia(21,n,:)]=meddisp(coef(wavread('ss2.wav'),sr));

[media(22,n,:),dispersia(22,n,:)]=meddisp(coef(wavread('t2.wav'),sr));

[media(23,n,:),dispersia(23,n,:)]=meddisp(coef(wavread('tt2.wav'),sr));

[media(24,n,:),dispersia(24,n,:)]=meddisp(coef(wavread('u2.wav'),sr));

[media(25,n,:),dispersia(25,n,:)]=meddisp(coef(wavread('v2.wav'),sr));

[media(26,n,:),dispersia(26,n,:)]=meddisp(coef(wavread('z2.wav'),sr));

n=3;

[media(1,n,:),dispersia(1,n,:)]=meddisp(coef(wavread('a3.wav'),sr));

[media(2,n,:),dispersia(2,n,:)]=meddisp(coef(wavread('aa3.wav'),sr));

[media(3,n,:),dispersia(3,n,:)]=meddisp(coef(wavread('b3.wav'),sr));

[media(4,n,:),dispersia(4,n,:)]=meddisp(coef(wavread('c3.wav'),sr));

[media(5,n,:),dispersia(5,n,:)]=meddisp(coef(wavread('d3.wav'),sr));

[media(6,n,:),dispersia(6,n,:)]=meddisp(coef(wavread('e3.wav'),sr));

[media(7,n,:),dispersia(7,n,:)]=meddisp(coef(wavread('f3.wav'),sr));

[media(8,n,:),dispersia(8,n,:)]=meddisp(coef(wavread('g3.wav'),sr));

[media(9,n,:),dispersia(9,n,:)]=meddisp(coef(wavread('h3.wav'),sr));

[media(10,n,:),dispersia(10,n,:)]=meddisp(coef(wavread('i3.wav'),sr));

[media(11,n,:),dispersia(11,n,:)]=meddisp(coef(wavread('ii3.wav'),sr));

[media(12,n,:),dispersia(12,n,:)]=meddisp(coef(wavread('j3.wav'),sr));

[media(13,n,:),dispersia(13,n,:)]=meddisp(coef(wavread('k3.wav'),sr));

[media(14,n,:),dispersia(14,n,:)]=meddisp(coef(wavread('l3.wav'),sr));

[media(15,n,:),dispersia(15,n,:)]=meddisp(coef(wavread('m3.wav'),sr));

[media(16,n,:),dispersia(16,n,:)]=meddisp(coef(wavread('n3.wav'),sr));

[media(17,n,:),dispersia(17,n,:)]=meddisp(coef(wavread('o3.wav'),sr));

[media(18,n,:),dispersia(18,n,:)]=meddisp(coef(wavread('p3.wav'),sr));

[media(19,n,:),dispersia(19,n,:)]=meddisp(coef(wavread('r3.wav'),sr));

[media(20,n,:),dispersia(20,n,:)]=meddisp(coef(wavread('s3.wav'),sr));

[media(21,n,:),dispersia(21,n,:)]=meddisp(coef(wavread('ss3.wav'),sr));

[media(22,n,:),dispersia(22,n,:)]=meddisp(coef(wavread('t3.wav'),sr));

[media(23,n,:),dispersia(23,n,:)]=meddisp(coef(wavread('tt3.wav'),sr));

[media(24,n,:),dispersia(24,n,:)]=meddisp(coef(wavread('u3.wav'),sr));

[media(25,n,:),dispersia(25,n,:)]=meddisp(coef(wavread('v3.wav'),sr));

[media(26,n,:),dispersia(26,n,:)]=meddisp(coef(wavread('z3.wav'),sr));

n=4;

[media(1,n,:),dispersia(1,n,:)]=meddisp(coef(wavread('a4.wav'),sr));

[media(2,n,:),dispersia(2,n,:)]=meddisp(coef(wavread('aa4.wav'),sr));

[media(3,n,:),dispersia(3,n,:)]=meddisp(coef(wavread('b4.wav'),sr));

[media(4,n,:),dispersia(4,n,:)]=meddisp(coef(wavread('c4.wav'),sr));

[media(5,n,:),dispersia(5,n,:)]=meddisp(coef(wavread('d4.wav'),sr));

[media(6,n,:),dispersia(6,n,:)]=meddisp(coef(wavread('e4.wav'),sr));

[media(7,n,:),dispersia(7,n,:)]=meddisp(coef(wavread('f4.wav'),sr));

[media(8,n,:),dispersia(8,n,:)]=meddisp(coef(wavread('g4.wav'),sr));

[media(9,n,:),dispersia(9,n,:)]=meddisp(coef(wavread('h4.wav'),sr));

[media(10,n,:),dispersia(10,n,:)]=meddisp(coef(wavread('i4.wav'),sr));

[media(11,n,:),dispersia(11,n,:)]=meddisp(coef(wavread('ii4.wav'),sr));

[media(12,n,:),dispersia(12,n,:)]=meddisp(coef(wavread('j4.wav'),sr));

[media(13,n,:),dispersia(13,n,:)]=meddisp(coef(wavread('k4.wav'),sr));

[media(14,n,:),dispersia(14,n,:)]=meddisp(coef(wavread('l4.wav'),sr));

[media(15,n,:),dispersia(15,n,:)]=meddisp(coef(wavread('m4.wav'),sr));

[media(16,n,:),dispersia(16,n,:)]=meddisp(coef(wavread('n4.wav'),sr));

[media(17,n,:),dispersia(17,n,:)]=meddisp(coef(wavread('o4.wav'),sr));

[media(18,n,:),dispersia(18,n,:)]=meddisp(coef(wavread('p4.wav'),sr));

[media(19,n,:),dispersia(19,n,:)]=meddisp(coef(wavread('r4.wav'),sr));

[media(20,n,:),dispersia(20,n,:)]=meddisp(coef(wavread('s4.wav'),sr));

[media(21,n,:),dispersia(21,n,:)]=meddisp(coef(wavread('ss4.wav'),sr));

[media(22,n,:),dispersia(22,n,:)]=meddisp(coef(wavread('t4.wav'),sr));

[media(23,n,:),dispersia(23,n,:)]=meddisp(coef(wavread('tt4.wav'),sr));

[media(24,n,:),dispersia(24,n,:)]=meddisp(coef(wavread('u4.wav'),sr));

[media(25,n,:),dispersia(25,n,:)]=meddisp(coef(wavread('v4.wav'),sr));

[media(26,n,:),dispersia(26,n,:)]=meddisp(coef(wavread('z4.wav'),sr));

n=5;

[media(1,n,:),dispersia(1,n,:)]=meddisp(coef(wavread('a.wav'),sr));

[media(2,n,:),dispersia(2,n,:)]=meddisp(coef(wavread('aa.wav'),sr));

[media(3,n,:),dispersia(3,n,:)]=meddisp(coef(wavread('b.wav'),sr));

[media(4,n,:),dispersia(4,n,:)]=meddisp(coef(wavread('c.wav'),sr));

[media(5,n,:),dispersia(5,n,:)]=meddisp(coef(wavread('d.wav'),sr));

[media(6,n,:),dispersia(6,n,:)]=meddisp(coef(wavread('e.wav'),sr));

[media(7,n,:),dispersia(7,n,:)]=meddisp(coef(wavread('f.wav'),sr));

[media(8,n,:),dispersia(8,n,:)]=meddisp(coef(wavread('g.wav'),sr));

[media(9,n,:),dispersia(9,n,:)]=meddisp(coef(wavread('h.wav'),sr));

[media(10,n,:),dispersia(10,n,:)]=meddisp(coef(wavread('i.wav'),sr));

[media(11,n,:),dispersia(11,n,:)]=meddisp(coef(wavread('ii.wav'),sr));

[media(12,n,:),dispersia(12,n,:)]=meddisp(coef(wavread('j.wav'),sr));

[media(13,n,:),dispersia(13,n,:)]=meddisp(coef(wavread('k.wav'),sr));

[media(14,n,:),dispersia(14,n,:)]=meddisp(coef(wavread('l.wav'),sr));

[media(15,n,:),dispersia(15,n,:)]=meddisp(coef(wavread('m.wav'),sr));

[media(16,n,:),dispersia(16,n,:)]=meddisp(coef(wavread('n.wav'),sr));

[media(17,n,:),dispersia(17,n,:)]=meddisp(coef(wavread('o.wav'),sr));

[media(18,n,:),dispersia(18,n,:)]=meddisp(coef(wavread('p.wav'),sr));

[media(19,n,:),dispersia(19,n,:)]=meddisp(coef(wavread('r.wav'),sr));

[media(20,n,:),dispersia(20,n,:)]=meddisp(coef(wavread('s.wav'),sr));

[media(21,n,:),dispersia(21,n,:)]=meddisp(coef(wavread('ss.wav'),sr));

[media(22,n,:),dispersia(22,n,:)]=meddisp(coef(wavread('t.wav'),sr));

[media(23,n,:),dispersia(23,n,:)]=meddisp(coef(wavread('tt.wav'),sr));

[media(24,n,:),dispersia(24,n,:)]=meddisp(coef(wavread('u.wav'),sr));

[media(25,n,:),dispersia(25,n,:)]=meddisp(coef(wavread('v.wav'),sr));

[media(26,n,:),dispersia(26,n,:)]=meddisp(coef(wavread('z.wav'),sr));

save alfabetul media dispersia;

6) Fișierul final.m reprezintã corpul principal al programului. Vorbitorul va înregistra 7 secunde de semnal care vor fi ulterior prelucrate. Literele pronunțate în cadrul celor 7 secunde vor fi separate și supuse analizei, rezultatul fiind afișat.

clc;clear;close all;

load 'FTS.mat' Num1 Den1;

load 'FTJ.mat' Num Den;

input('Apasati o tasta pentru a inregistra');

clc;

x=wavrecord(7*22050,22050);

sr=22050;

xftj=filter(Num1,Den1,x);

xf=filter(Num,Den,xftj);

fxf=enframe(xf,256);

for i=1:length(fxf(:,1))

mxf(i,:)=melcepst(fxf(i,:),sr,'0p',1,floor(3*log(sr)),256);

end

m=0;

while m~=length(fxf(:,1))

m=m+1;

if mxf(m,1)>-20

xt=0;

while mxf(m,1)>-20

if m==length(fxf(:,1))

break;

end

xt=[xt fxf(m,:)];

m=m+1;

end

if length(xt(1,:))>2560

soundsc(xt,sr);pause(1);

mel=melcepst(xt,sr,'0',8,floor(3*log(sr)),512);

Nz=0;

for i=2:length(xt)

if sign(xt(1,i-1))>=sign(xt(1,i))

Nz=Nz+sign(xt(1,i-1))/2-sign(xt(1,i))/2;

else

Nz=Nz+sign(xt(1,i))/2-sign(xt(1,i-1))/2;

end

end

for j=1:length(mel(:,1))

koef1(j,:)=[Nz mel(j,:)];

end

for j=1:length(mel(:,1))

koef(j,:)=[length(xt) koef1(j,:)];

end

f=compmixt(koef);

switch max(f)

case f(1)

disp('a');

case f(2)

disp('aa');

case f(3)

disp('b');

case f(4)

disp('c');

case f(5)

disp('d');

case f(6)

disp('e');

case f(7)

disp('f');

case f(8)

disp('g');

case f(9)

disp('h');

case f(10)

disp('i');

case f(11)

disp('ii');

case f(12)

disp('j');

case f(13)

disp('k');

case f(14)

disp('l');

case f(15)

disp('m');

case f(16)

disp('n');

case f(17)

disp('o');

case f(18)

disp('p');

case f(19)

disp('r');

case f(20)

disp('s');

case f(21)

disp('ss');

case f(22)

disp('t');

case f(23)

disp('tt');

case f(24)

disp('u');

case f(25)

disp('v');

case f(26)

disp('z');

end

end

end

end

subplot(3,1,1),plot(x);grid;title('SEMNALUL ORIGINAL');

subplot(3,1,2),plot(xf);grid;title('SEMNALUL FILTRAT');

subplot(3,1,3),plot(mxf(:,1));grid;title('ENERGIA SEMNALULUI FILTRAT');

Urmãtoarele funcții au fost luate dintr-un toolbox de procesare vocalã, numit VoiceBox, scrise de Mike Brookes, de la Catedra de Inginerie Electricã și Electronicã al Colegiului Imperial din Londra.

7)Funcția enframe(x,win,inc) împarte semnalul x în segmente de lungime win, începând cu eșantionul inc.

function f=enframe(x,win,inc)

nx=length(x);

nwin=length(win);

if (nwin == 1)

len = win;

else

len = nwin;

end

if (nargin < 3)

inc = len;

end

nf = fix((nx-len+inc)/inc);

f=zeros(nf,len);

indf= inc*(0:(nf-1)).';

inds = (1:len);

f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));

if (nwin > 1)

w = win(:)';

f = f .* w(ones(nf,1),:);

end

8)Funcția melbankm(p,n,fs,fl,fh,w) calculeazã bancul de filtre perceptive Mel, unde p reprezintã numãrul de filtre, n numãrul de puncte al transformatei Fourier, fs frecvența de eșantionare, fl frecvența capãtului inferior al primului filtru ca parte fracționarã din fs, fh frecvența capãtului superior al ultimului filtru ca parte fracționarã din fs, iar w tipul de fereastrã folositã pentru ponderare (triunghiularã, hanning, hamming) în domeniul Mel.

function [x,mn,mx]=melbankm(p,n,fs,fl,fh,w)

if nargin < 6

w='tz';

if nargin < 5

fh=0.5;

if nargin < 4

fl=0;

end

end

end

f0=700/fs;

fn2=floor(n/2);

lr=log((f0+fh)/(f0+fl))/(p+1);

% convert to fft bin numbers with 0 for DC term

bl=n*((f0+fl)*exp([0 1 p p+1]*lr)-f0);

b2=ceil(bl(2));

b3=floor(bl(3));

if any(w=='y')

pf=log((f0+(b2:b3)/n)/(f0+fl))/lr;

fp=floor(pf);

r=[ones(1,b2) fp fp+1 p*ones(1,fn2-b3)];

c=[1:b3+1 b2+1:fn2+1];

v=2*[0.5 ones(1,b2-1) 1-pf+fp pf-fp ones(1,fn2-b3-1) 0.5];

mn=1;

mx=fn2+1;

else

b1=floor(bl(1))+1;

b4=min(fn2,ceil(bl(4)))-1;

pf=log((f0+(b1:b4)/n)/(f0+fl))/lr;

fp=floor(pf);

pm=pf-fp;

k2=b2-b1+1;

k3=b3-b1+1;

k4=b4-b1+1;

r=[fp(k2:k4) 1+fp(1:k3)];

c=[k2:k4 1:k3];

v=2*[1-pm(k2:k4) pm(1:k3)];

mn=b1+1;

mx=b4+1;

end

if any(w=='n')

v=1-cos(v*pi/2);

elseif any(w=='m')

v=1-0.92/1.08*cos(v*pi/2);

end

if nargout > 1

x=sparse(r,c,v);

else

x=sparse(r,c+mn-1,v,p,1+fn2);

end

8) Funcția rfft(x,n,d) implementeazã algoritmul de decimare în timp pentru un vector de date reale x, în n puncte.

function y=rfft(x,n,d)

s=size(x);

if prod(s)==1

y=x

else

if nargin <3

d=find(s>1);

d=d(1);

if nargin<2

n=s(d);

end

end

if isempty(n)

n=s(d);

end

y=fft(x,n,d);

y=reshape(y,prod(s(1:d-1)),n,prod(s(d+1:end)));

s(d)=1+fix(n/2);

y(:,s(d)+1:end,:)=[];

y=reshape(y,s);

end

9) Funcția rdct(x,n,a,b) calculeazã transformata cosinus discretã pentru un vector de date reale x, care va fi scurtat sau lungit pânã la dimensiunea n.

function y=rdct(x,n,a,b)

fl=size(x,1)==1;

if fl x=x(:); end

[m,k]=size(x);

if nargin<4 b=1;

if nargin<3 a=sqrt(2*m);

if nargin<2 n=m;

end

end

end

if n>m x=[x; zeros(n-m,k)];

elseif n<m x(n+1:m,:)=[];

end

x=[x(1:2:n,:); x(2*fix(n/2):-2:2,:)];

z=[sqrt(2) 2*exp((-0.5i*pi/n)*(1:n-1))].';

y=real(fft(x).*z(:,ones(1,k)))/a;

y(1,:)=y(1,:)*b;

if fl y=y.'; end

10) Funcția melcepst(s,fs,w,nc,p,n,inc,fl,fh) returneazã coeficienții perceptivi Mel pentru un semnal vocal s, eșantionat cu frecvența fs, unde nc reprezintã numãrul de coeficienți Mel (excluzând coeficientul 0), n lungimea ferestrei ca putere a lui 2 (<30ms), p numãrul de filtre din bancul de filtre, inc suprapunerea dintre cadre, fl frecvența capãtului inferior al primului filtru ca parte fracționarã din fs, fh frecvența capãtului superior al ultimului filtru ca parte fracționarã din fs.

function c=melcepst(s,fs,w,nc,p,n,inc,fl,fh)

if nargin<2 fs=11025; end

if nargin<3 w='M'; end

if nargin<4 nc=12; end

if nargin<5 p=floor(3*log(fs)); end

if nargin<6 n=pow2(floor(log2(0.03*fs))); end

if nargin<9

fh=0.5;

if nargin<8

fl=0;

if nargin<7

inc=floor(n/2);

end

end

end

if length(w)==0

w='M';

end

if any(w=='R')

z=enframe(s,n,inc);

elseif any (w=='N')

z=enframe(s,hanning(n),inc);

else

z=enframe(s,hamming(n),inc);

end

f=rfft(z.');

[m,a,b]=melbankm(p,n,fs,fl,fh,w);

pw=f(a:b,:).*conj(f(a:b,:));

pth=max(pw(:))*1E-6;

if any(w=='p')

y=log(max(m*pw,pth));

else

ath=sqrt(pth);

y=log(max(m*abs(f(a:b,:)),ath));

end

c=rdct(y).';

nf=size(c,1);

nc=nc+1;

if p>nc

c(:,nc+1:end)=[];

elseif p<nc

c=[c zeros(nf,nc-p)];

end

if ~any(w=='0')

c(:,1)=[];

nc=nc-1;

end

if any(w=='e')

c=[log(sum(pw)).' c];

nc=nc+1;

end

% calculate derivative

if any(w=='D')

vf=(4:-1:-4)/60;

af=(1:-1:-1)/2;

ww=ones(5,1);

cx=[c(ww,:); c; c(nf*ww,:)];

vx=reshape(filter(vf,1,cx(:)),nf+10,nc);

vx(1:8,:)=[];

ax=reshape(filter(af,1,vx(:)),nf+2,nc);

ax(1:2,:)=[];

vx([1 nf+2],:)=[];

if any(w=='d')

c=[c vx ax];

else

c=[c ax];

end

elseif any(w=='d')

vf=(4:-1:-4)/60;

ww=ones(4,1);

cx=[c(ww,:); c; c(nf*ww,:)];

vx=reshape(filter(vf,1,cx(:)),nf+8,nc);

vx(1:8,:)=[];

c=[c vx];

end

if nargout<1

[nf,nc]=size(c);

t=((0:nf-1)*inc+(n-1)/2)/fs;

ci=(1:nc)-any(w=='0')-any(w=='e');

imh = imagesc(t,ci,c.');

axis('xy');

xlabel('Time (s)');

ylabel('Mel-cepstrum coefficient');

map = (0:63)'/63;

colormap([map map map]);

colorbar;

end

Similar Posts