2010-01-25 8 views
5

누구든지 .NET 응용 프로그램 내에서 인식 프로필을 변경하는 방법을 알고 있습니까?System.Speech.Recognition 인식 프로필 선택

System.Speech.Recognition 네임 스페이스에있는 기능을 사용하여 음성 인식을 수행하는 .NET 응용 프로그램을 작성하고 있습니다. 시스템에 공급되는 오디오는 여러 다른 사용자가 제공합니다. 각기 다른 사용자의 말을보다 정확하게 인식 할 수 있도록 시스템을 교육 할 수 있기를 바랍니다.

훈련 프로필을 구성 할 수있는 Windows (이 경우 Windows 7)에서 음성 인식 제어판을 발견했습니다. 자신을위한 프로필을 설정하고 교육 프로세스를 수행하면 인식 정확도가 크게 향상되었습니다. 그래서 모든 사용자에 대해 프로파일을 설정하고 교육 프로세스를 수행하도록 할 수는 있지만 응용 프로그램에서 올바른 프로파일을 선택할 수 있어야합니다.

내 응용 프로그램은 한 번에 하나 이상의 사용자로부터 오디오 스트림을 받아 음성 인식을 수행하는 "서버"입니다. 따라서 응용 프로그램에서 만드는 인식 엔진의 각 인스턴스에 프로그래밍 방식으로 사용할 인식 프로필을 지정할 수 있어야합니다. 이것은 단일 사용자 응용 프로그램이 아니므로 Windows 제어판에서 프로필을 선택할 수는 없습니다.

답변

3

System.Speech.Recognition을 통해이를 수행하는 방법이 보이지 않지만, speechlib (SAPI IDispatch 호환 API)를 통해 수행 할 수 있습니다. ISpeechRecognizer::Profile을보십시오.

프로파일을 설정하려면 System.Speech.Recognition과 함께, 코드에

using SpeechLib; 

을 추가해야합니다.

까다로운 부분은 System.Speech.Recognition.RecognitionEngine을 만들 때 SpeechLib을 통해 설정 한 프로필이 '스틱'으로 표시되는 것입니다. 아마도 (SpeechLib을 통해) 프로파일을 기본값으로 설정하고, RecognitionEngine을 만들고, 기본 프로파일을 재설정 할 것입니다.

(난 당신이 다중 사용자 시나리오에서 작동하지 않습니다 공유 인식기를 사용하지 않을거야 있으리라 믿고있어.)

당신은 확인하기 위해 중요한 부분을 필요 아마 것 하나 그 스레드는 한 번에 RecognitionEngine을 만들 수 있습니다.

0

각 사용자에게 이름을 말하면서 주어진 사용자와 프라임을 찍는 방법에 대해 묻는 것은 어떻습니까?

이 솔루션에서 일정량의 인증을 얻으려면 매우 안전한 방법은 아닙니다 ... 시스템이 '특정 사용자'로 인식 할 특정 구문을 사용하도록 말할 수 있습니다. 정말 가짜 야?

이것은 꽤 재미 있지만, 나는 말해야합니다.

+0

감사합니다. 실제로 어떤 사용자가 서버에 연결하고 있는지 확인하는 방법이 있습니다. 내가 찾고자하는 것은, 어떤 사용자가 연결되어 있는지를 감안할 때 특정 사전 구성된 교육 프로파일을 사용해야한다는 것을 인식 엔진에 어떻게 지정하여 사용자가 말한 단어를 정확하게 인식 할 수 있도록하는 것입니다. 이것은 C++ API를 통해 수행 될 수 있지만, .NET/C# API를 통해이를 수행하는 방법을 알고 싶어지기를 바랍니다. –

0

레지스트리를 사용하여 기본 프로필을 변경할 수 있습니다. 레지스트리에는 프로파일 목록이 들어 있습니다. 음성 속성 대화 상자를 통해 쉽게 추가 할 수 있습니다. 프로파일과 사용 준비를 교육하십시오.

레지스트리의 기본 프로필을 변경하고 음성 엔진을 시작하면 해당 프로필이 사용됩니다. 이것은 다른 Windows 버전을 위해 작동하며, 여러 인스턴스에서 시도하지 않았습니다.

레지스트리 키는에 있습니다. HKEY_CURRENT_USER \ 소프트웨어 \ 마이크로 소프트 \ 연설 \ RecoProfiles는 HKEY_CURRENT_USER \ 소프트웨어 \ 마이크로 소프트 \ 음성 \ RecoProfiles \ 토큰에 "DefaultTokenId"키 값을 변경 {7A8C84A3-44DA-488F-A27D-BC5BC326A8BE} 여기

방법을 찾는 것입니다 프로파일을 사용하고 프로파일을 기본값으로 설정하십시오.

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