<< Inapoi

Cuprins

Inainte >>

4.2.6 Implementarea uneltelor utilizator.

Dupa cum aratam anterior unul din scopurile urmarite la realizarea acestei aplicatii a fost asigurarea unei usurinte a extinderii aplicatiei cu noi unelte pe care un utilizator ar dori sa le adauge. Modul de extindere al fiecarui modul a fost prezentat la momentul potrivit dar pentru o mai buna întelegere a fost chiar implementata o asfel de unealta., unealta care de altfel este una foarte importanta în prelucrarea semnalului sonor.

Aratam mai sus în nenumarate cazuri cum o detectie buna a vorbirii într-un semnal audio asigura performante bune a sistemelor de recunoastere a cuvintelor sau a vorbitorului. Prin urmare s-a ales, pentru exemplu al unei unelte utilizator, chiar implementarea unei unelte ce efectueaza o localizare foarte performanta a vorbirii.

Anterior prezentam un algoritm de localizare a vorbirii bazat pe numarul de treceri prin zero respectiv energia semnalului vocal. Dar practica ne dovedeste ca acest algoritm poate deveni inutil în cazul apartiei unui semnal parazit care prin numar de treceri prin zero sau energie sa fie apropiat de cel vocal.

Un astfel de semnal este cel prezentat în continuare:

Fig. 4.10 Semnal sursa supus localizarii vorbirii folosind NTZ si E.

Se observa din acest semnal, semnalul vocal si semnalul parazit de la sfârsit. O localizare a vorbirii folosind NTZ si energia arata în felul urmator:

Fig 4.11 Rezultaltul localizarii vocii folosind NTZ si E.

Aceasta situatie apare pentru ca graficele NTZ si energiei pentru semnalul rezultat în urma localizarii arata în felul urmator:

Fig. 4.12 Energia semnalului din fig 4.10

Fig. 4.13 NTZ pentru semnalul din Fig. 4.10

De aici se poate observa usor cum semnalul parazit are aproximativ aceleasi caracteristici NTZ si E cu semnalul vocal, fiind clar de ce localizarea vorbirii este practic imposibila cu acest algoritm.

Dar ceea ce diferentiaza semnalul parazit de semnalul vocal este în mod categoric spectrul de frecventa al fiecaruia. De aici ideea de a elimina din semnalul sonor sursa acele cadre în care frecventa dominanta nu este aceea specifica unui semnal vocal. Totusi acest aspect nu este suficient pentru a elimina sau lasa un anumit cadru în semnal pentru ca am putea ajunge în situatia sa eliminam cadre vocale nesonore – consoane sau sa gasim într-un anumit cadru o frecventa dominanta în spectrul semnalului vocal dar acest cadru sa apartina unui semnal parazit. Pentru a se evita aceasta situatie, la stabilirea ca un anume cadru apartine din semnal vocal sau nu se va lua în considerare un interval de X cadre înainte si dupa cadrul curent si daca Y din aceste cadre au caracteristici de cadre nevocale atunci cadrul curent nu este cadru vocal.

O alta problema ce se pune în cazul acestui algoritm este determinarea limitelor spectrului semnalului vocal. Ei bine acest lucru se poate stabili prin analiza unor semnale vocal anterioare.

Iata în continuare rezultatul localizarii semnalului vocal folosind algoritmul prezentat:

Fig. 4.14 Localizarea semnalului vocal folosind spectrul de frecvente

Dar iata pe scurt si pasii ce au fost urmati în integrarea acestei unelte în cadrul aplicatiei, pasi care în mare ar trebui urmati la adaugarea oricarei unelte utilizator.

•  Adaugarea la nivelul resurselor a resursei specifica uneltei. În cazul nostru este vorba despre dialogul cu id-ul IDD_UDT_DETECT_SPECH_FFT .

Fig 4.15 Dialogul Detect Speech

•  Integrarea interfetei în interfata aplicatiei: meniu, dialoguri deja existente, etc. În cazul prezentat s-a adaugat în meniul “User Defined Tools” a intrarii pentru unealta respectiva stabilindu-se si statusul enabled/disabled al acesteia în functie de cum avem sau nu un semnal încarcat.

•  Interventia daca este cazul asupra semnalului vocal si cadrelor reprezentate de instan­te ale claselor CFrame si CFrameArray . În cazul nostru are loc initializarea obiectului frameArray instanta a CFrameArray cu valorile din waveUnitDest care este instanta a clasei CWaveUnit si contine semnalul de la intrare copiat la destinatie.

•  Definirea propriei operatii în cadrul clasei COperations .

•  Definirea propriilor metode, daca este cazul în cadrul claselor CFrame si CFrameArray. Modalitatea de utilizare si apelare a acestora este cea prezentata în capitolele anterioare.

Asupra acestui pas ma voi opri putin mai mult spre a-i prezenta modul de realizare în cazul uneltei de localizare a vorbirii folosind spectrul de frecventa:

Din cadrul metodei COperations::UD_DetectSpeechFFT se apeleaza metoda clasei CFrameArray , UD_DetectSpeechFFT , metoda al carei pseudocod este prezentat în continuare:

void CFrameArray::UD_DetectSpeechFFT( unsigned uSize, unsigned uMinFreq, unsigned uMaxFreq, unsigned uCheckSilenceZone, double dPercentSilence)

{

for (idx = speechStart; idx <= speechEnd; idx++)

{

frames[idx].DoFFT();

}

for (idx1 = speechStart; idx1 < speechEnd ; idx1++)

{

uMaxFreqIdx = frecventa predominanta

if ((uMaxFreqIdx > frecv limita maxima a semnalului vocal)

|| (uMaxFreqIdx < frecv limita minima a semnalului vocal))

frames[idx1].SetSilence( true );

else

frames[idx1].SetSilence( false );

}

for (idx1 = speechEnd ; idx1 > speechStart; idx1--)

{

uMaxFreqIdx = frecventa predominanta

if ((uMaxFreqIdx > frecv limita maxima a semnalului vocal)

|| (uMaxFreqIdx < frecv limita minima a semnalului vocal))

frames[idx1].SetSilence( true );

else

frames[idx1].SetSilence( false );

}

for (idx1 = speechEnd ; idx1 > speechStart; idx1--)

{

daca pentru frame[idx1] , GetSilence() == true si

din X cadre la stanga si x cadre la dreapta, în cazul a Y din ele GetSilence() == true atunci frames[idx1].SetSilence( true );

altfel frames[idx1].SetSilence( false );

}

}

•  Returnarea rezulatelor spre GUI.

4.2.7 Implementarea interfetei audio

Interfata audio între aplicatie si utilizator s-a realizat folosind facilitatile oferite de tehnologia DirectX.

Facilitatile oferite pe aceasta cale utilizatorului sunt: înregistrarea semnalului sonor din cadrul aplicatiei folosind orice dispozitiv audio de intrare displonibil. De managementul acestuia se va ocupa DirectX-ul. Acelasi lucru este valabil si la partea de redare, de gestiunea device-ului de output ocupându-se DirectX-ul, fie prin uneltele puse la dispozitie de Windows sau chiar prin aplicatii puse la dispozitie de producatorii respectivelor produse, daca este cazul.

Prin urmare singurele operatii ce mai ramân a fi executate în cadrul aplicatiei WaveIO sunt cele de preluare a semnalului digital de la DirectX si stocarea sa în format specific aplicatiei, asta în cazul înregistrarii, si respectiv scrierea semnalului în bufferul DirectX în cazul redarii.

În continuare voi prezenta schitat algoritmii de redare si inregistrare de semnal sonor.

Algoritmmul de “play” folosind DirectSound

1. Creare Obiect Direct Sound

2 Eliberarea SoundBufferului

3. Blocarea SoundBufferului

4. Setarea Parametrilor si descrierii SoundBufferului.

5. Eliberarea SoundBufferului

6. Setarea CooperativeLevelului la Obiectul DirectSound

7. Apelarea metodei Play a SoundBuffer-ului cu parametrul loop pentru inceperea redarii în bucla.

8. Apelarea metodei Stop a SoundBuffer-ului pentru încetarea redarii.

Algoritmmul de “record” folosind DirectSound

1 Creare CaptureBuffer si setarea descrierii acestuia.

3. Inceperea inregistrarii prin apelul metodei Start a CaptureBufferului cu parametru de loop.

4. În momentul incetarii inregistrarii: Blocarea CaptureBufferului

5. Copiere continut buffer în structura CWaveUnit

6. Deblocare CaptureBuffer.

7. Setare atribute pentru noul obieect CWaveUnit.

4.2.8 Implementarea interfetei video

O parte impoartanta a aplicatiei WaveIO o reprezinta interfata grafica a acesteia si asta datorita multiplelor informa­tii ce sunt comunicate utilizatorului prin intermediul ei.

Fig. 4.16 Fereastra principala de dialog a aplicatiei WaveIO

Fereastra principala se compune din 4 sectiuni principale

•  Meniul aplicatiei.

În cadrul acestui meniu sunt grupate o parte din intrarile în aplicatie. Elementele meniului precum si semnificatia fiecaruia din ele sunt prezentate în cele ce urmeaza.

File

Open … – Deschide un fisier wav de pe disc.

Save/Save as… - Salveaza continutul unui CWaveUnit pe disc.

Exit – Termina aplicatia

Edit

View

Tools

Tools – Deschide dilogul Tools de care ne vom ocupa mai târziu în cadrul acestui capitol.

Wave format – Deschide dialogul WaveFormat în care se pot seta atribute ale semnalului sonor. Deocamdata singurul atribut setabil este numarul de sample-uri pe secunda.

Differences – Deschide fereastra de dialog destinata compararii a doua seturi de coeficienti de acelasi tip sau de comparare a spectrelor de frecvente. Mai multe despre aceasta unealta, vor fi prezentate în cadrul acestui capitol.

Draw

În functie de optiune selectata din acest meniu ii va fi afisat utilizatorului: forma de unda a semnalului sonor, graficul numarului de treceri prin zero, graficul Energiei semnalului, spectru de frecventa.

Aceste operatii sunt posibile fie numai pentru unda sursa sau numai pentru unda destinatie, caz în care este posibila vederea în paralel a semnalului si a graficului pentru NTZ, energie sau a spectrului, sau este posibila vizualizarea aceluias tip de grafic , comparativ pentru sursa si destinatie, caz în care afisarea se poate face pastrând proportia între cele doua grafice, daca se selecteaza optiunea Waves Relativity sau individual pentru fiecare grafic.

Item-urile din acest meniu sunt: Energies, Zero Passes, Frequency Spectrum , Waves, Source >, Destination >, Misc .

User Defined Tools

Detect Speech Using FFT - Deschide dialogul pentru localizarea vorbirii bazata pe spectrul de frecventa.

Acest meniu este dedicat uneltelor create de utilizatori.

Debugger

Start/Stop Debugger – porneste respectiv opreste debuggerul acestui program.

•  Bara de unelte

Fig. 4.17 Bara de unelte

Prin intermediul acestai bari utrilizatorul va putea deschide sau salva un semnal sonor digital, în/din format wav, sau va putea interactiona asupra modulului ce se ocupa de interfata audio a aplicatiei. În ce priveste acest ultim aspect, utilizatorul poate porni sau opri redarea semnalului sursa sau destinatie, precum si înregistrarea unui nou senal în obiectul CWaveUnit sursa.

Tot prin intermediul acestai bari utilizatorul poate muta semnalul destinatie peste sursa.

•  Panoul grafic

În cadrul acestui panou sunt afisate diferitele grafice selectate prin intermediul meniului Draw . Acest panou este împartit în doua sectiuni din care una apartine semnalului sursa, iar celalalta semnalului destinatie.

În cadrul acestor sectiuni aplicatia poate afisa: forma de unda a semnalului sonor, graficul NTZ, graficul energiei semnalului sau graficul spectrului de frecvente. Pentru fiecare astfel de grafic exista câte o metoda dedicata în cadrul clasei CWaveIOView. Dar toate aceste metode au la baza metodele DrawSrc si DrawDest al caror scop este de desenare a graficului unei functii ale carei valori discrete sunt memorate în cadrul unui vector.

Mai trebuie amintiti ca exista doua moduri de afisare a greficelor în cele doua sectiuni: unul este modul “ independent” , în care fiecare zona are propria scara, si apoi modul “ relativ ” în care se foloseste o scara comuna scopul fiind realizarea unei comparari între semnalul sursa si cel destinatie.

•  Bara de status

În aceasta bara este afisata starea executiei programului sau scurte mesaje de informare asupra functionalitatii unor elemente de interfata.

Dialogul Tools

Acest dialog este activat în momentul selectarii itemului Tools din meniul Tools.

Fig. 4.18 Dialogul Tools.

Prin intermediul acestui dialog, utilizatorul interactioneaza cu modulul de unelte. În aceasta fereastra utilizatorul îsi poate defini o lista de operatii care se vor executa serial.

Din sectiunea “Operations” utilizatorul poate configura uneltele stabilind parametrii fiecaruia dintre ele si de asemenea le poate adauga listei de operatii. Pentru adaugarea unei operatii se va apasa butonul asociat fiecarei unelte, iar pentru resetarea parametrilor la valorile implicite se face prin apasarea butonului . Tot din aceasta fereastra de la sectiunea Framing se va seta dimensiunea în esantioane a cadrului, precum si procentul de suprapunere a doua cadre consecutive. De asemenea mai trebuie amintit ca în cazul determinarii coeficientilor LPC si cesptrali precum si în cazul determinarii spectrului, datele obtinute pot fi salvate în fisiere, de unde mai apoi pot fi restaurate în vederea unor prelucrari ulterioare, cum ar fi calcularea distantei între doua seturi de coeficienti.

O data creata o lista de operatii, utilizatorul poate salva aceasta lista într-un fisier pe disc, într-un format special, pentru ca mai apoi sa o restaureze.

Important de amintit aici este si modul în care lista de operatii cu parametrii este trasmisa din acest dialog în clasa CWaveIODoc . Aceasta transmitere se realizeaza prin intermediul unor vectori, pentru construirea si apoi pentru parsarea carora exista metode specifice ale clasei CTools . De fapt pentru trasmiterea operatiilor avem doi vectori: unul de valori întregi în care sunt memorate ID-urile operatiilor, fiecare operatie având un ID unic, si un vector de caractere al caruit format este: “attribute1_oper1=value1 | attribute2_operation1=value2”, “attribute1_oper2=value3 | attribute2_operation2 = value4”. Pentru construirea vectorilor de parametrii se foloseste metoda AddParameter . Vectorii continând operatiile si parametrii, sunt stocate în variabile publice ale clasei, astfel încât sa poata fi accesate din CWaveIODoc. Pentru parsarea vectorilor de parametrii se apeleaza metodele publice: CTools::GetParameter, pentru fiecare tip de data existând o metoda. De exmeplu pentru cazul în pare parametrul transmis este de tip double se va apela metoda GetParameterD care va primi ca parametrii vectorul de parametrii, indexul opertiei pentru care se va extrage parametrul, respectiv numele parametrului a carui valoare trebui returnata.

Dialogul Differences

Dupa cu aratam anterior, dialogul Differences reprezinta punctul de interactiune între utilizator cu modulul de diferente.

Fig. 4.19 Dialogul Differences.

Transmiterea datelor de la modulul de unelte de prelucrare, la modulul de diferente se face prin intermediul unor fisiere în format special. Prin urmare, dupa selectarea tipului de distanta care se vrea calculata sau a tipului de coeficienti între care se face calculul, primul pas în vederea calcularii distantei între doua seturi de coeficienti sau a compararii a doua spectre este de a deschide cele doua fisiere corespunzatoare unde mai înainte în prealabil au fost salvate datele. Dupa selectarea fisierelor se seteaza daca este cazul, parametrii distan­tei – de exemplu numarul de maxime locale în cazul calcularii distantei între formanti. Dupa care se apasa butonul DO pentru calcularea distantei.

4.2.9 Functionarea aplicatiei WaveIO

Dupa toate cele prezentate anterior cea mai indicata ar fi o privire de ansamblu asupra functionarii aplicatiei printr-o diagrama de stare a sistemului.

Fig. 4.20 Diagrama de stare a aplicatiei WaveIO.

<< Inapoi

Cuprins

Inainte >>