2010-01-25 18 views
5

Czy ktoś wie, jak zmienić profile rozpoznawania z aplikacji .NET?System.Speech.Recognition Wybór profilu rozpoznawania

Piszę aplikację .NET, która wykonuje rozpoznawanie mowy, korzystając z możliwości dostępnych w przestrzeni nazw System.Speech.Recognition. Dźwięk, który wprowadzam do systemu, pochodzi od wielu różnych użytkowników. Chciałbym być w stanie wyszkolić system, aby dokładniej rozpoznawać mowę każdego z różnych użytkowników.

Znalazłem panel sterowania Rozpoznawanie mowy w oknach (w tym przypadku Windows 7), w którym mogę skonfigurować profile treningu. Utworzenie profilu dla siebie i przeprowadzenie procesu szkoleniowego znacznie poprawiło dokładność rozpoznawania. Mogę więc skonfigurować profile dla każdego użytkownika i zlecić mu proces szkolenia, ale muszę mieć możliwość wyboru odpowiedniego profilu w mojej aplikacji.

Moja aplikacja to "serwer", który odbiera strumienie audio od jednego lub więcej użytkowników naraz i wykonuje rozpoznawanie mowy. Muszę więc móc określić, który profil rozpoznawania powinien być programowany dla każdej instancji mechanizmu rozpoznawania, którą tworzy moja aplikacja. To nie jest aplikacja pojedynczego użytkownika, więc nie mogę po prostu wybrać ich profilu z panelu sterowania Windows.

Odpowiedz

3

Nie widzę sposobu, aby to zrobić poprzez System.Speech.Recognition, ale można to zrobić za pośrednictwem mowylib (interfejsu API zgodnego z SAPI IDispatch). Spójrz na ISpeechRecognizer::Profile.

Aby ustawić profil, trzeba będzie dodać

using SpeechLib; 

do kodu, wraz z System.Speech.Recognition.

Najtrudniejszą częścią byłoby uzyskanie profilu ustawionego za pomocą SpeechLib na "stick" podczas tworzenia System.Speech.Recognition.RecognitionEngine. Prawdopodobnie ustawiłbym profil jako domyślny (poprzez SpeechLib), utworzę RecognitionEngine i zresetuję domyślny profil.

(jestem przy założeniu, że nie planujesz korzystać ze wspólnej rozpoznawania, który nie będzie działał w scenariuszu z wieloma użytkownikami.)

Prawdopodobnie będziesz potrzebował sekcji krytycznej, aby upewnić się, że tylko jeden wątek może utworzyć RecognitionEngine naraz.

0

co z prośbą, aby każdy z nich wypowiedział swoje imię i nazwisko, aby zagrać z danym użytkownikiem?

nie jest to bardzo bezpieczna metoda, jeśli chcesz, aby to rozwiązanie zawierało pewną liczbę uwierzytelnień ... możesz powiedzieć im, aby użyły danej frazy, którą system rozpozna jako "określonego użytkownika", który nie może naprawdę być sfałszowany?

To jest całkiem interesujące, muszę powiedzieć.

+0

Dzięki Oren. Właściwie to mam sposób na identyfikację, który użytkownik łączy się z serwerem. Próbuję znaleźć, ponieważ wiem, który użytkownik jest podłączony, jak mogę określić w aparacie rozpoznawania, że ​​powinien on używać określonego wstępnie skonfigurowanego profilu treningowego, aby dokładnie rozpoznał słowa wypowiedziane przez użytkownika. Wygląda na to, że można to zrobić za pośrednictwem interfejsu API C++, ale mam nadzieję, że ktoś wie, jak to zrobić za pośrednictwem interfejsu API .NET/C#. –

0

Możesz użyć rejestru, aby zmienić domyślny profil. Rejestr zawiera listę profili. Możesz łatwo dodać je za pomocą okna dialogowego właściwości mowy. Trenuj profil i jest gotowy do użycia.

Zmień domyślny profil w rejestrze i uruchom silnik mowy i używa tego profilu. Ma to działanie dla różnych wersji systemu Windows, nie próbowano na wielu wystąpieniach.

Klucz rejestru znajduje się pod adresem. HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles Zmień "DefaultTokenId" klucz wartość HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles \ tokenów {7A8C84A3-44DA-488F-A27D-BC5BC326A8BE}

Oto jak wyglądają poprzez profile i ustawić profil jako domyślny.

 RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Speech\RecoProfiles\Tokens"); 
     _profiles = rk.GetSubKeyNames(); 
     string findname = "{7A8C84A3-44DA-488F-A27D-BC5BC326A8BE}"; 
     string name = ""; 
     foreach (String s in _profiles) 
     { 
      using (RegistryKey sk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Speech\RecoProfiles\Tokens\" + s)) 
      { 
       if (sk != null) 
        name = (string)sk.GetValue(""); 
       if (name == findname) break; 
      } 
     } 
     RegistryKey rk = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Speech\RecoProfiles", true); 
     rk.SetValue("DefaultTokenId", @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\RecoProfiles\Tokens\" + name);