I0I1S1 GrzeszykAnna Lab3

background image




Systemy Dialogowe

Sprawozdanie z ćwiczenia laboratoryjnego nr 3

Temat laboratorium:

Urządzenie automatycznego rozpoznawania sygnału mowy
metodą rozpoznawania wzorców

(projekt dla małego słownika)

Wykonała:

Anna Grzeszyk

I0I1S1

Prowadzący:

Dr inż. Andrzej Wiśniewski

background image

1. Przebieg laboratorium

Laboratorium opierało się na stworzeniu mechanizmu rozpoznającego słowa

ze słownika oraz uczącego się na przykładzie wczytanych kilku próbek. Nasz
słownik zawiera 10 słów istniejących w języku polskim, powszechnych, mniej lub
bardziej skomplikowanych. Nie tyle podczas nagrywania, co dopiero podczas
testowania programu zauważyłam, iż najlepsze do rozpoznawania są dłuższe
słowa, z większą częstością spółgłosek.

Przygotowano 150 plików mieszczących w sobie 10 słów, powtórzonych 15

razy. 5 spośród wymienionych będzie przeznaczona na uczenie wzorca, zaś
pozostałe 10 do jego testowania.

2. Ciąg testowy

Aby otrzymać rozpoznawanie na satysfakcjonującym poziomie, musimy

wyznaczyć niezbędne charakterystyki. W ramach laboratorium wyznaczyliśmy
wzór testowy o postaci:

W = [L E PPZ FFT LPC]

gdzie:

L – liczba próbek w dźwięku

E – energia sygnału ze wzoru

PPZ – liczba przejść przez zero ze wzoru


∑| [ ] [ ]|

FFT – 5 współczynników fft()

LPC – 5 współczynników liniowego kodowania predykcyjnego

3. Rozpoczęcie procedury uczenia

Program, jaki wykonałam w tej części sprawozdania opiera się na kolejnym

wczytywaniu pozyskanych próbek (znajdują się w tym samym katalogu, co
skrypt), uzyskiwaniu z nich informacji, a na koniec, po zsumowaniu wszystkich
uzyskanych współczynników – obliczeniu średniej dla każdego parametru słowa.
Tak uzyskany wzorzec jest gotowy do przetestowania. Kod pierwotnego
programu:

background image

clear

all

clc

ileSlownik=10;

probki=5;

wektor_slow=char(

'chmura'

,

'grac'

,

'hasz'

,

'kot'

,

'picie'

,

'pies'

,

'pogoda'

,

'slon'

,

'snieg'

,

'zolc'

);

wzorzec=zeros(ileSlownik,10,2);

wsp = zeros(1,13);

for

i=1:1:ileSlownik

w_uczenia = zeros(1,10);

for

j=1:1:5

[s,fs]=wavread(strcat(path,

'/'

,deblank(wektor_slow(i,:)),int2str(j),

'.wav'

)

);

wsp(2)=floor(length(s)/2);

wsp2(2)=length(s)-(floor(length(s)/2)+1);

s1=s(1:floor(length(s)/2));

s2=s(floor(length(s)/2)+1:length(s));

wsp(1)=log10(sum(s1.^2,

'double'

));

wsp(3) = sum(abs(sign(s1(2:wsp(2)))-sign(s1(1:wsp(2)-1))))/2;

wsp(4:8) = real(fft(s1,5));

tmp=abs(lpc(s1,5));

wsp(9:13)=tmp(2:6);

w_uczenia(1,:) = w_uczenia(1,:) + wsp;

end

;

wzorzec(i,:,1) = w_uczenia(1,:)/5;

end

;

ocena=zeros(1,10);

for

i=1:ileSlownik

for

j=6:15

plik= sprintf (

'%s%d%s'

, wektor_slow(i,:) , j ,

'.wav'

) ;

[s fs]=wavread(plik);

wsp(2)=floor(length(s)/2);

wsp2(2)=length(s)-(floor(length(s)/2)+1);

s1=s(1:floor(length(s)/2));

s2=s(floor(length(s)/2)+1:length(s));

wsp(1)=log10(sum(s1.^2,

'double'

));

wsp(3) = sum(abs(sign(s1(2:wsp(2)))-sign(s1(1:wsp(2)-1))))/2;

wsp(4:8) = real(fft(s1,5));

tmp=abs(lpc(s1,5));

wsp(9:13)=tmp(2:6);

porownanie=zeros(10,1);

for

z=1:10

porownanie(z,1)=sum(abs(wzorzec(z,:,1)-abs(wsp)));

end

;

[~,indeks1]=min(porownanie(:,1));

if

(indeks1==i || indeks2==i)

ocena(1,i)=ocena(1,i)+1;

else

ocena(2,i)=ocena(2,i)+1;

end

;

end

;

end

;

rozpoznanie=sum(ocena(1,1:10))/(ileSlownik^2)*100;

fprintf(

'%s%d%s'

,

'Procent prawidłowych dopasowań: '

, rozpoznanie,

'%'

);

ocena

%w_slow

background image

4. Testowanie procedury uczenia

Testów dokonujemy poprzez wczytanie wszystkich pozostałych próbek do

przestrzeni roboczej, odczytaniu jej parametrów, porównaniu wartości z
wartością średnią oraz odnalezieniu, przy którym słowie jest najmniejsza różnica.

5.

Wyniki

Na konsoli uzyskałam niniejszy wynik:

Z uwagi na niezadowalające rozpoznanie dla całych wyrazów (na poziomie

poniżej 50%), konieczna jest zmiana algorytmu. W najprostszy sposób można to
osiągnąć za pośrednictwem stosowanych wag, lecz jest to proces żmudny z
uwagi na czas poświęcony na dobranie odpowiednich współczynników. Ponadto
nawet dla takich zmian nie zostaje usprawnione wyszukiwanie odpowiednich
slów.

Zdecydowanie lepszym pomysłem jest podział fragmentu słowa na części,

aby porównywać słowo mniejszymi partiami – nawet jeśli nie wszystkie części
nagrania będą pasować, to uzyskamy więcej dopasowań.

6. Estymacja parametrów

Estymacji parametrów dokonuję poprzez dosyć prostą metodę. Stosuję

odejmowanie wartości bezwzględnych z wzorca i wczytanego pliku, które następnie
mnożę przez wagi, jakie dany współczynnik posiada, aby wszystkie otrzymane
liczby zsumować w jeden wspólny wektor.

7. Poprawa otrzymanych wyników

Udało mi się osiągnąć wymagany procent rozpoznań na poziomie 85%,

dodatkowo mogę dynamicznie zmieniać ilość elementów, na jakie dzielę plik
dźwiękowy. Nie obyło się jednak bez indywidualnie dobranej wagi, którą ze
względu na podział na takie same części, składające się z tej samej liczby
próbek, dobrałam tak, aby liczba próbek miała znikomy efekt na wynik. Jako że
pierwsze 3 czynniki notowały największe wartości, a składniki LPC czy FFT
niezwykle odróżniają sygnały od siebie – nadałam im bardzo wysokie wagi ze
względu na zauważenie różnicy w wyniku. Poniżej zamieszczam ekran dla klilku
wykonanych podziałów:

background image

Widzimy, że stałe powiększanie, jak i pomniejszanie próbek, niesie ze sobą

stratę w procentowym rozpoznaniu dźwięków. Toteż ostateczna wersja programu
opiera się o podział na 64 części, gdzie uzyskałam wynik 87%, co jest wynikiem
zadowalającym, zauważywszy fakt, że dla połowy plików mamy bezbłędne
rozpoznania, a ostatni z nich jest nierozpoznany, być może z powodu zbyt dużej
ilości słów na „S”. Gdyby wykluczyć jego udział, rozpoznanie wynosiłoby 92%.
Poniżej zamieszczam również prezentację procentowego wykrycia
poszczególnych słów.

Nr wyrazu (l.p.)

1

2

3

4

5

6

7

8

9

10

Procent wykrycia (%) 100 80 90 100 80 80 100 100 100 40

background image

8. Podsumowanie

W celu prawidłowego dobrania parametrów próbowałam różnych metod

poprawy wyników, przez zmianę wag dla współczynników, po podmianę próbek
na inne. Niewątpliwie najbardziej wymierne rezultaty przyniosło podzielenie

sygnału, a tak małe porcje dźwięku, jakie powstają w wyniku podziału słowa na

64 części, są z racji dużej rozdzielczości czasowej i częstotliwościowej, dużo
efektywniejsze.

Popełnionych błędów mogło być w tym ćwiczeniu niezwykle wiele. Przy

wyznaczaniu parametrów inne wyniki daje głośniejszy dźwięk, inne częstotliwości

notujemy, gdy ktoś jest chory lub mówi innym tonem. Bardzo ważny wpływ
miały również momenty hałasu bądź ciszy zarejestrowane nieopatrznie w

sygnale. Problem mógł zaistnieć już w przypadku edycji pliku dźwiękowego –
pozostawienie zbyt szerokiej ramki na sygnał bądź też zbyt wczesne ucięcie

powodują duże prawdopodobieństwo niedopasowania.

Aby poprawić efektywność tak zbudowanego urządzenia, należałoby

przede wszystkim zautomatyzować powstawanie współczynników wagowych oraz
wzbogacić urządzenie o dodatkowe funkcje, potrafiące wykrywać np. zbyt dużą

długość ramki względem testowych dźwięków, czy też funkcję porównujące ze

sobą składnik po składniku wektora, a nie tylko jego sumy.

Należałoby również zadbać o prawidłowe wczytywanie sygnałów poprzez

eliminację ciszy i szumów z próbek dźwiękowych. Dobrym pomysłem jest także

rozszerzenie wektora o kolejne współczynniki, szczególnie dokładnie określające

dany dźwięk, jak LPC czy FFT.


Wyszukiwarka

Podobne podstrony:
I0I1S1 Grzeszyk Lab2v2
I0I1S1 Grzeszyk Lab2v2
GrzeszykAnna I0I1S1 cw4 spr
GrzeszykAnna I0I1S1 cw4 spr
lab3
lab3 kalorymetria
Instrukcja Lab3
lab3 6
lab3
sprawko z lab3 z auto by pawelekm
Lab3 zadanie 2 schemat organizacyjny
Lab3 KWW KT
Podstawy Robotyki lab3 id 36832 Nieznany
Architekrura Systemów Lab3
Lab3 Cpp GPS opis
AKiSO lab3 id 53767 Nieznany
BD 1st 2 4 lab3 tresc 1 1 id 81 Nieznany
LAB3, Szkoła, penek, Przedmioty, Fizyka, Laborki

więcej podobnych podstron