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.) 

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.