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