Wrocław, 10 czerwca 2009
Raport przygotowany na zaliczenie przedmiotu: "Metody i algorytmy sztucznej inteligencji."Wrocław, June 10 2009
This report has been prepared as a requirement for the course: "Methods and algorithms of artificial intelligence."Keywords: speaker recognition, MFCC, neural-network
Poniżej przedstawiono schemat systemu rozpoznawania osoby na podstawie głosu. Schemat pochodzi z [1].
Początkowe próby dotyczyły analizy średniej częstotliwości dźwięku, ale szybko okazało się, że częstotliwość dla tej samej osoby zmienia się w dość dużym zakresie, co więcej, zakresy częstotliwości różnych osób były zbliżone. Praktycznie dyskwalifikowało to metodę.
Ostatecznie do identyfikacji osoby postanowiono wykorzystać analizę cepstralną w skali mel (ang. Mel Frequency Cepstrum -- MFC). Cepstrum to rezultat obliczania transformaty Fouriera decybelowego (czyli takiego, w którym amplituda jest wyrażona w decybelach) widma sygnału. Skala mel bazuje na doświadczalnym związku między częstotliwością czystego tonu harmonicznego i częstotliwością postrzeganą przez człowieka. Jak wiadomo, człowiek stosunkowo łatwo rozpoznaje osobę po głosie, dlatego wykorzystanie skali zbliżonej do ludzkiej percepcji wydaje się być dobrym pomysłem.
Dźwięki dzielono na dwie grupy: dane uczące oraz dane testujące. Proporcje między licznością poszczególnych grup zmieniały się, aby można było ocenić wpływ długości wektora uczącego na skuteczność rozpoznawania.
>> melfcc(sound, fs, 'maxfreq', 8000, 'numcep', 20, 'nbands', 19, 'fbtype', 'fcmel', 'dcttype', 1, 'usecmp', 1, 'wintime', 0.032, 'hoptime', 0.016, 'preemph', 0, 'dither', 1);
Sieć neuronowa wymaga stałej liczby wejść, zatem zdecydowano o skróceniu wszystkich wektorów do długości najkrótszego z nich (odcięcie końcowych wartości). Okazało się, że wprowadzenie na wejście sieci neuronowej wszystkich wektorów nie jest dobrym rozwiązaniem, gdyż znacznie spowalnia proces uczenia, wymaga większych sieci, a wyniki i tak nie są zadowalające. Postanowiono dokonać selekcji informacji.
Na początku zdecydowano się na wybór jednego lub dwóch wektorów i dokonywanie identyfikacji tylko na ich podstawie. Podejście sprawdzało się tylko dla kilku plików wejściowych. Dla większości sieć nie rozpoznawała poprawnie osoby.
Ostatecznie zrezygnowano ze skracania wektorów, a zdecydowano się na obliczenie średniej arytmetycznej wartości każdego z nich. Wybrano identyfikację osoby na podstawie 20 liczb będących średnimi z każdego wektora. Wzorowano się na rozwiązaniach w [2].
Sieć neuronową utworzono poleceniem newff
z toolboksa Neural Network. Liczbę wejść ustalono na 20 (średnie wartości każdego z wektorów), a liczbę wyjść równą liczbie osób w danych testowych. Rozmiar sieci dobrano eksperymentalnie. Okazało się, że najlepsze rezultaty uzyskiwano przy sieci z jedną warstwą ukrytą (20 neuronów). W przypadku bardziej skomplikowanych sieci występował efekt przeuczenia, z kolei prostsze sieci nie były w stanie nauczyć się dostatecznie dobrze.
Polecenie newff
wymaga, aby funkcje przejścia były różniczkowalne. Ogranicza to wybór do tansig
, logsig
oraz purelin
(można też napisać własną funkcję). Aby ograniczyć wartości wyjściowe do przedziału [0,1] wybrano logsig
jako funkcję przejścia pomiędzy warstwą ukrytą a wyjściem. Jako drugą funkcję wybrano na drodze eksperymentów tansig
.
Uczenie sieci przebiegało metodą Levenberga-Marquardta (trainlm
), gdyż jest to najszybsza z zaimplementowanych w Matlabie metod.
Gotowe polecenie tworzące sieć neuronową miało postać:
>> net = newff([min_input, max_input] ,[20 size(output)],{'tansig' 'logsig' },'trainlm');
Badania rozpoczęto od dużej sieci, która powinna rozpoznawać wszystkich sześć osób. Niestety skuteczność sieci była bardzo mała. Aby wyjaśnić przyczynę, postanowiono przeprowadzić testy dla mniejszych sieci - rozpoznających trzy osoby. Poniżej przedstawiono wyniki. Znak zapytania oznacza, że sieć nie dała jednoznacznej odpowiedzi (co najmniej 0,9 dla dokładnie jednej osoby). Liczby w tabeli informują, ile razy padła odpowiedź.
![]() | ![]() | ![]() |
Jak widać, dla niektórych danych wejściowych sieć działa bezbłędnie, a dla innych skuteczność rozpoznawania jest przeciętna. Postanowiono przeprowadzić badania sieci rozpoznających dwie osoby. Zbadano 15 sieci. Poniżej przedstawiono skuteczność rozpoznawania dla każdej pary (wartości procentowe). Przyjęto, że brak jednoznacznej odpowiedzi nie jest ani odpowiedzią błędną, ani poprawną, gdyż w praktycznych zastosowaniach (np. kontroli dostępu) zwykle można poprosić o ponowne wypowiedzenie hasła.
n | d | k | j | z | |
71 | 100 | 100 | 100 | 50 | r |
87,5 | 60 | 60 | 83 | n | |
100 | 100 | 87,5 | d | ||
40 | 100 | k | |||
71 | j |
Można zauważyć, że z niektórymi parami sieć radziła sobie lepiej niż z innymi. Prawdopodobnie jest to spowodowane występowaniem grup o podobnych współczynnikach cepstralnych, np. {z,r}, {j,k,n}.
Współczynniki cepstralne są stosunkowo dobrym narzędziem w rozpoznawaniu osoby na podstawie głosu, ale w praktycznych zastosowaniach powinny być wykorzystywane razem z innymi metodami analizy dźwięku. W przypadku systemów rozpoznających wiele osób należałoby zastosować preselekcję, aby do analizy cepstralnej wytypować najwyżej kilka osób.
[2] Seonho Kim, Seungwon Yang, "Speaker Identification System Using HMM and Mel Frequency Cepstral Coefficient", http://people.cs.vt.edu/~haebang/coursework/PatternRecog/SpeakerID.pdf