System.Speech.Recognition选择识别配置文件

时间:2010-01-25 19:40:14

标签: c# .net speech-recognition sapi speech-to-text

有谁知道如何在.NET应用程序中更改识别配置文件?

我正在编写一个.NET应用程序,它使用System.Speech.Recognition命名空间中的功能进行语音识别。我输入系统的音频来自多个不同的用户。我希望能够训练系统以更准确地识别来自不同用户的语音。

我在Windows中找到了语音识别控制面板(在本例中为Windows 7),我可以在其中配置训练配置文件。为自己设置一个配置文件并进行培训过程可以显着提高识别的准确性。所以我可以为每个用户设置配置文件并让他们完成培训过程,但我需要能够在我的应用程序中选择正确的配置文件。

我的应用程序是一个“服务器”,它一次接收来自一个或多个用户的音频流并执行语音识别。因此,我需要能够以编程方式为我的应用程序创建的每个识别引擎实例指定哪个识别配置文件。这不是单个用户应用程序,因此我不能让他们从Windows控制面板中选择他们的配置文件。

3 个答案:

答案 0 :(得分:4)

我没有看到通过System.Speech.Recognition做到这一点的方法,但你可以通过speechlib(与SAPI IDispatch兼容的API)来实现。请看ISpeechRecognizer::Profile

要设置个人资料,您需要添加

using SpeechLib;

到您的代码,以及System.Speech.Recognition。

在您创建System.Speech.Recognition.RecognitionEngine时,棘手的部分是将您通过SpeechLib设置的配置文件设置为“粘贴”。我可能会将配置文件设置为默认值(通过SpeechLib),创建RecognitionEngine,然后重置默认配置文件。

(我假设您不打算使用共享识别器,这在多用户场景中无效。)

您可能需要一个关键部分来确保一次只有一个线程可以创建RecognitionEngine。

答案 1 :(得分:1)

您可以使用注册表更改默认配置文件。注册表包含配置文件列表。您可以通过语音属性对话框轻松添加它们。训练配置文件及其随时可用。

更改注册表中的默认配置文件并启动语音引擎,并且它正在使用该配置文件。这适用于不同的Windows版本,没有尝试过多个实例。

注册表项位于。 HKEY_CURRENT_USER \软件\微软\语音\ RecoProfiles 将“DefaultTokenId”键值更改为HKEY_CURRENT_USER \ Software \ Microsoft \ Speech \ RecoProfiles \ Tokens {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);

答案 2 :(得分:0)

如果要求他们每个人说出他们的名字,以便给定用户填写它?

如果您希望此解决方案具有一定数量的身份验证,那么这不是一种非常安全的方法...您可以告诉他们使用系统将识别为“某个用户”的给定短语是假的?

这很有意思,但我得说。