2010-01-25 73 views
5

有誰知道如何從.NET應用程序中更改識別配置文件?System.Speech.Recognition選擇識別配置文件

我寫一個.NET應用程序,做使用在System.Speech.Recognition命名空間中找到該功能的語音識別。我饋入系統的音頻來自多個不同的用戶。我希望能夠訓練系統以更準確地識別來自每個不同用戶的語音。

我已經在windows(本例中爲Windows 7)中找到語音識別控制面板,我可以在其中配置訓練配置文件。爲自己設置配置文件並執行培訓過程可顯着提高識別的準確性。所以我可以爲每個用戶設置配置文件並讓他們完成培訓過程,但是我需要能夠在我的應用程序中選擇正確的配置文件。

我的應用程序是一個「服務器」,一次接收來自一個或多個用戶的音頻流並執行語音識別。所以我需要能夠指定哪個識別配置文件以編程方式用於我的應用程序創建的識別引擎的每個實例。這不是一個單一的用戶應用程序,所以我不能讓他們從Windows控制面板中選擇他們的配置文件。

回答

3

我不明白的方式通過System.Speech.Recognition做到這一點,但你可以通過speechlib做它(SAPI IDispatch接口兼容的API)。看看ISpeechRecognizer::Profile

要設置的配置文件,您將需要

using SpeechLib; 

添加到您的代碼,以System.Speech.Recognition一起。

最棘手的部分會得到當你創建System.Speech.Recognition.RecognitionEngine你通過SpeechLib設置爲「棒」的輪廓。我可能會將配置文件設置爲默認配置(通過SpeechLib),創建RecognitionEngine並重置默認配置文件。

(我假設你不打算使用共享識別,這將不會在多用戶的情況下工作。)

你可能需要一個關鍵部分,以確保只有一個線程一次可以創建RecognitionEngine。

0

如果要求他們每個人都說出他們的名字來與給定的用戶進行初步對話,那麼該怎麼辦?

它不是,如果你想這個解決方案有認證的一定量的...你可以告訴他們使用一給定短語,該系統將識別爲「特定用戶」一個非常安全的方法,可以不真的是假的?

雖然這很有趣,但我得說。

+0

謝謝奧倫。我實際上有一種方法來確定哪個用戶連接到服務器。我試圖找到的是,鑑於我知道哪個用戶已連接,我如何向識別引擎指定它應該使用特定的預配置的培訓配置文件,以便它能夠準確識別用戶說話的單詞。看來這可以通過C++ API完成,但我希望有人知道如何通過.NET/C#API來完成。 – 2010-01-26 15:09:55

0

您可以使用註冊表來更改默認配置文件。註冊表包含配置文件列表。您可以通過語音屬性對話框輕鬆添加它們。訓練配置文件並準備好使用。

更改註冊表中的默認配置文件並啓動語音引擎,並且其正在使用該配置文件。這適用於不同的Windows版本,並沒有嘗試過多個實例。

註冊表項位於。 HKEY_CURRENT_USER \ SOFTWARE \微軟\語音\ RecoProfiles 更改 「DefaultTokenId」 鍵值HKEY_CURRENT_USER \ SOFTWARE \微軟\語音\ RecoProfiles \ {令牌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);