Udostępnij za pośrednictwem


     

Kinect SDK - Audio API Udostępnij na: Facebook

Autor: Tomasz Kowalczyk

Opublikowano: 2011-10-03

Jest to ostatni artykuł z serii opisującej zastosowanie sensora Kinect SDK. Poniższy tekst zawiera informacje, dotyczące możliwości przetwarzania dźwięku za pomocą sensora Kinect. Po zapoznaniu się z treścią artykułu czytelnik będzie wiedział, jakie możliwości posiada Kinect wraz z API, odpowiedzialnym za odbieranie i przetwarzanie sygnału fonicznego. Dzięki temu artykułowi czytający zapozna się z Audio API oraz możliwościami Microsoft Speech API. W części praktycznej artykułu został opisany przykładowy program konsolowy, który rozpoznaje mowę. Rozbudowa tego programu daje szansę na zaprojektowanie aplikacji, której funkcjonowanie będzie zależało od wypowiedzianego słowa.

Możliwości Audio API

W jednym z wcześniejszych artykułów opisana została budowa sprzętowa sensora Kinect. Warto w tym miejscu rozszerzyć wiedzę oraz przypomnieć, że posiada on 4 mikrofony, co pozwala na wykorzystanie urządzenia, po poprawnym zainstalowaniu go na komputerze, nie tylko jako zwykłego mikrofonu.

Rys. 1. Cztery mikrofony sensora Kinect.

Wraz z Kinect SDK programista posiada dostęp do tych czterech mikrofonów. Zaimplementowane możliwości pozwalają programowo przetwarzać sygnały dźwiękowe, odebrane przez sensor, i w zależności od ich brzmienia odpowiednio reagować na nie we własnej aplikacji. Korzystając z Audio API i bazując na dokumentacji, dostarczonej przez Microsoft, tworzenie aplikacji z możliwością rozpoznawania mowy jest już możliwe dla każdego.

Architektura sprzętowa

Kinect SDK posiada zaawansowane możliwości, zaimplementowane w bibliotekach Audio API, które posiadają następujące cechy:

  • redukcja szumów i efektu echo,
  • przechwytywanie dźwięku w wysokiej jakości,
  • lokalizacja źródła dźwięku,
  • rozpoznawanie mowy.

Aby w pełni zrozumieć rozbudowane funkcje urządzenia oraz wiedzieć, na co tak naprawdę pozwala Audio API, warto również zapoznać się z pojęciem beamforming.

Należy ponadto pamiętać, iż wszystkie wyżej wymienione możliwości dostępne są zarówno w środowisku języka C++ jak i C#.

Wymagane oprogramowanie

Aby zaistniała możliwość pełnego wykorzystania Audio API we własnych aplikacjach, należy upewnić się, czy poza zainstalowaniem Kinect SDK, osoba przystępująca do instalacji produktu zaopatrzyła się również w poniższe oprogramowanie:

Informacja
Na chwilę obecną MSDN dostarcza niewielu informacji na temat Microsoft Speech API. W związku z tym zalecane jest, aby zapoznać się z dokumentacją, zawartą w pliku HTML Help (CHM), znajdującym w katalogu Program Files\Microsoft Speech Platform SDK\Docs.

Dokładnie mówiąc, Audio API jest nakładką na DMO, które jest obiektem COM, pozwalającym na integrację oprogramowania z procesorem DSP.Procesor ten posiada dostęp do cyfrowego procesora przetwarzania sygnałów. Audio API, w środowisku kodu zarządzanego (C#), posiada możliwość przygotowania operacji obsługi inicjalizacji, przechwytywania oraz zatrzymania przetwarzania sygnału dźwiękowego. Biblioteki te ponadto posiadają zaimplementowane zdarzenia (Events), które pozwalają na rozróżnienie źródła dźwięku.

Informacja
Warto również pamiętać, iż Audio API uruchamia DMO w oddzielnym wątku, co wymusza stosowanie trybu MTA w aplikacji. Projektując aplikacje za pomocą WPF, należy korzystać z trybu STA, w wyniku tego zastosowania pojawią się wyjątki podczas kompilacji kodu, korzystającego z Audio API.

Architektura programowa

Poniższy diagram klas przedstawia hierarchię i sposób organizacji kodu bibliotek, wchodzących w skład Kinect SDK Audio API. Widoczne są na nim, między innymi, atrybuty i metody dostępowe, odpowiedzialne za rozróżnianie źródła dźwięku. Dokładniej to ujmując, klasaBeamChangedEventArgs posiada atrybut Angle, który określa kąt, z jakiego napływa dany dźwięk do sensora Kinect.

Rys. 2. Diagram klas Audio API.

Audio API posiada również zestaw narzędzi, które ułatwiają definiowanie gramatyki, zgodnie z którą rozpoznawane są słowa. Wykorzystywana tutaj metoda polega na rozpoznawaniu wzorców, które były wcześniej programowo zdefiniowane w postaci słownika, i porównywaniu ich z dźwiękiem przetworzonym przez sensor Kinect.

Biblioteki, odpowiedzialne za dźwięk w Kinect SDK, są zgodne ze standardem SRGS (Speech Recognition Grammar Specification), który jest powszechnie wykorzystywany w portalach głosowych do przeprowadzania dialogu z użytkownikiem. Jest to swego rodzaju zbiór słów – wzorów, które pozwalają sterować przepływem informacji między programem a użytkownikiem. Standard SRGS wykorzystuje pliki XML o odpowiedniej strukturze, których budowa pozwala na łatwe definiowanie gramatyki, używanej w programie.

Przykładowy plik, definiujący gramatykę w pliku XML, przedstawiony został na poniższym rysunku:

Rys. 3. Schemat gramatyki zdefiniowany w postaci pliku XML.

Implementacja

Aplikacja, opracowana na potrzeby niniejszego artykułu, posiada zaimplementowaną funkcjonalność rozpoznawania mowy. Po deklaracji kontenera, który będzie służył jako słownik dla trzech słów (red, green, blue) i uruchomieniu aplikacji, każdy dźwięk, zarejestrowany przez sensor Kinect, zostanie poddany procesowi, który będzie miał na celu rozpoznanie odebranego sygnału, a następnie zareagowanie na konkretne słowo. Program pokazuje również, z jaką dokładnością dźwięk został rozpoznany i do którego wzorca ze słownika został on dopasowany.

Informacja
Wszystkie kody źródłowe projektów, utworzonych w ramach tych artykułów, będą dostępne na tej stronie.

Poniżej znajduje się opis poszczególnych fragmentów programu, które mają decydujący wpływ na jego funkcjonowanie.

using (var source = new KinectAudioSource())
            {

Powyższy kod pozwala na używanie funkcji, odpowiedzialnych za przetwarzanie dźwięku. Następnie tak utworzonemu obiektowi oraz jego własnościom, należy nadać odpowiednie wielkości, które aktywują przetwarzanie dźwięku oraz startują urządzenie w odpowiednim trybie:

source.FeatureMode = true;
source.AutomaticGainControl = false; 
source.SystemMode = SystemMode.OptibeamArrayOnly;

W kolejnym kroku należy zdefiniować, jakiego języka aplikacja będzie używać do rozpoznawania mowy (w chwili pisania artykułu dostępny był język angielski):

private const string RecognizerId = "SR_MS_en-US_Kinect_10.0";
RecognizerInfo ri = SpeechRecognitionEngine.InstalledRecognizers().Where(r => r.Id == RecognizerId).FirstOrDefault();

Następnie uruchamiamy silnik rozpoznawania mowy, bazujący na języku, zdefiniowanym wcześniej:

using (var sre = new SpeechRecognitionEngine(ri.Id))
                {

Następnie należy zdefiniować, jakie słowa będą brane pod uwagę przez program w procesie rozpoznawania wzorców, zdefiniowanych w języku wybranym wyżej. W tym celu należy wypisać w tablicy poszczególne słowa, które system rozpoznawania mowy będzie miał do wyboru w procesie porównywania wzorców:

var colors = new Choices();
                    colors.Add("red");
                    colors.Add("green");
                    colors.Add("blue");

Kolejny krok polega na zbudowaniu gramatyki dla tak zdefiniowanego słownika, którego wzorce znajdują się w zdefiniowanej bibliotece wzorców. Jako wartości atrybutów, należy tu podać również, jakiego języka system ma używać:

var gb = new GrammarBuilder();                                            
                    gb.Culture = ri.Culture;
                    gb.Append(colors);
                    var g = new Grammar(gb);

Poniżej pozostaje jedynie zaimplementować proces, który powinien zostać uruchomiony w momencie, gdy sygnał dźwiękowy zostanie przechwycony przez mikrofony urządzenia. W tym momencie następuje deklaracja pobierania strumienia danych oraz określenie jego specyfiki:

using (Stream s = source.Start())
                    {
                        sre.SetInputToAudioStream(s,
                                                  new SpeechAudioFormatInfo(
                                                      EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));

Poniżej zostaje wysłany na ekran konsoli monit o tym, jakie słowa są obsługiwane przez program:

Console.WriteLine("Recognizing. Say: 'red', 'green' or 'blue'. Press ENTER to stop");

Uruchomiona zostaje procedura rozpoznawania mowy:

sre.RecognizeAsync(RecognizeMode.Multiple);
                        Console.ReadLine();
                        Console.WriteLine("Stopping recognizer ...");
                        sre.RecognizeAsyncStop();
                    }

Podsumowanie

Celem tego artykułu było zapoznanie czytelnika z Audio API, który jest częścią Kinect SDK. Opisany zbiór bibliotek pozwala na przetwarzanie sygnałów dźwiękowych, co ponownie zwiększa możliwości urządzenia po podłączeniu do komputera.

Przedstawiony tutaj został prosty program, wykorzystujący funkcje zawarte w Microsoft Speech API, który pozwala na rozpoznawanie mowy i programowe reagowanie na wypowiedziane słowa. Jeśli powyższy artykuł okazał się interesujący, warto rozszerzyć wiedzę na temat możliwości aplikacji, opartych o rozpoznawanie mowy, czytając ten artykuł.