Wrocław, 10 czerwca 2009

Raport przygotowany na zaliczenie przedmiotu: "Metody i algorytmy sztucznej inteligencji."

Autor: Radosław Trela

Identyfikacja na podstawie głosu



Abstrakt

Celem projektu było stworzenie prostego, tekstowo zależnego systemu identyfikującego osobę na podstawie głosu. Projekt został zrealizowany w środowisku Matlab. Identyfikacja odbywała się na podstawie współczynników cepstralnych. Do klasyfikacji wykorzystano sieć neuronową typu feed-forward. Pokazano, że współczynniki cepstralne są dobrym narzędziem w rozpoznawaniu osoby na podstawie mowy, ale sprawdzają się w małych systemach (rozpoznających niewiele osób). W praktycznych zastosowaniach powinny być wykorzystywane razem z innymi metodami analizy mowy.

Wrocław, June 10 2009

This report has been prepared as a requirement for the course: "Methods and algorithms of artificial intelligence."

Author: Radosław Trela

Speaker recognition



Abstract

The aim of this project was to design and create a simple text-dependent speaker recognition system. It was implemented in Matlab. MFCC features from the speech utterance are fed to a neural-network-based classifier to identify the speakers. A feed-forward net architecture was used. It was shown, that MFCC features are good tools to speach analysis, but only for small systems. In practice they should be used with other method of speach analysis.

Keywords: speaker recognition, MFCC, neural-network


Wstęp

Identyfikacja osób na podstawie głosu leży w obszarze zainteresowań wielu naukowców na świecie. Jest ona częścią biometrii. O przydatności metod identyfikacji oraz weryfikacji osób na podstawie głosu nie trzeba nikogo przekonywać. Mogą być one pomocne w kontroli dostępu do chronionych pomieszczeń, autoryzacji użytkowników korzystających z określonych danych, programów czy urządzeń, a także w kryminalistyce.

Poniżej przedstawiono schemat systemu rozpoznawania osoby na podstawie głosu. Schemat pochodzi z [1].

schemat systemu

Ekstrakcja cech

Aby możliwa była realizacja projektu, należało z próbek dźwięku wyekstrahować cechy charakterystyczne dla konkretnej osoby.

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.

Opis narzędzi

Pliki uczące oraz pliki testowe zapisane były w formacie WAV. Do realizacji projektu wybrano środowisko Matlab, gdyż ma ono zaimplementowanych wiele narzędzi ułatwiających obróbkę sygnałów. Współczynniki cepstralne były wyliczane przy pomocy darmowego toolboksa Rastamat dostępnego na stronie http://labrosa.ee.columbia.edu/matlab/rastamat/, z kolei wczytywanie plików przy pomocy poleceń dostępnych w toolboksie Voicebox (http://www.ee.ic.ac.uk/hp/staff/dmb/voicebox/voicebox.html). Z niewiadomych przyczyn dźwięki wczytane poleceniem wavread (spoza pakietu Voicebox) były bardzo złej jakości. Strata jakości nie miała miejsca przy wykorzystaniu polecenia readwav (Voicebox). Sieci neuronowe utworzono w przeznaczonym do tego toolboksie (Neural Network).

Dane uczące oraz testujące

W celu uczenia oraz testowania zarejestrowano głosy sześciu osób (trzech kobiet oraz trzech mężczyzn). Wszystkie osoby wypowiadały tę samą kwestię dziesięciokrotnie. Każde z nagrań miało długość od 1,5 s do 2 s. Liczba próbek każdej osoby została ograniczona, aby lepiej zbadać przydatność metody w rzeczywistych zastosowaniach, przy niewielkiej liczbie plików uczących. Do rejestracji dźwięku wykorzystano mikrofon komputerowy.

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.

Budowa systemu

Selekcja informacji

Współczynniki cepstralne wyliczono poleceniem
>> 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);
gdzie sound jest wczytanym plikiem, a fs częstotliwością próbkowania. Polecenie pochodzi z toolboksa Rastamat. Opcje skopiowano z przykładu podanego na stronie projektu. Powyższa komenda zwraca 20 wektorów o długości zależnej od długości nagrania (dla plików testowych długość wektora zmieniała się w zakresie 83-162).

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

Budowa sieci neuronowej

Postanowiono, że wyjściem z sieci będzie wektor o długości równej liczbie osób w bazie wzorców. Każdej osobie będzie odpowiadała liczba z przedziału [0,1] określająca stopień dopasowania danych wejściowych do tej osoby.

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');

Testy

Testy prowadzono na sieciach uczonych czterema oraz sześcioma plikami dla każdej osoby. Nie stwierdzono znaczących różnic w działaniu sieci po zmianie liczby nagrań uczących.

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

tab_3_1 tab_2_3 tab_3_3

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

Wnioski

Sieć neuronowa działa zadowalająco tylko w przypadkach, gdy ma identyfikować osobę z małej (dwu- lub trzyosobowej) grupy. Jest to spowodowane faktem, iż po uśrednieniu wartości z każdego wektora współczynników cepstralnych podobne wartości odpowiadały różnym osobom. Testy na małych sieciach rozpoznających jedynie dwie osoby ujawniły, którym osobom odpowiadały podobne wektory. Być może podczas uśredniania wartości w wektorach nastąpiła zbyt duża redukcja informacji.

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.

Literatura

[1] M. N. Do, "Digital Signal Processing Mini-Project: An Automatic Speaker Recognition System", http://lcavwww.epfl.ch/~minhdo/asr_project/

[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