【问题标题】:System.Speech.Recognition Choosing Recognition ProfileSystem.Speech.Recognition 选择识别配置文件
【发布时间】:2010-01-25 19:40:14
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我看不到通过 System.Speech.Recognition 实现此目的的方法,但您可以通过 Speechlib(与 SAPI IDispatch 兼容的 API)来实现。看ISpeechRecognizer::Profile

    要设置配置文件,您需要添加

    using SpeechLib;
    

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      注册表项位于。 HKEY_CURRENT_USER\Software\Microsoft\Speech\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);
      

      【讨论】:

        【解决方案3】:

        让他们每个人说出自己的名字来为给定的用户做准备怎么样?

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

        这很有趣,我得说。

        【讨论】:

        • 谢谢奥伦。我实际上有一种方法可以识别哪个用户正在连接到服务器。我想要找到的是,鉴于我知道连接了哪个用户,我如何向识别引擎指定它应该使用特定的预配置训练配置文件,以便它能够准确地识别用户所说的话。这似乎可以通过 C++ API 完成,但我希望有人知道如何通过 .NET/C# API 来完成。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        • 2023-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多