55

我需要编写一个使用语音识别引擎的应用程序——无论是内置的 vista 引擎还是第三方引擎——它可以显示一个单词或短语,并识别用户何时阅读它(或它的近似值) )。我还需要能够在语言之间快速切换,而无需更改操作系统的语言。

用户将在很短的时间内使用该系统。该应用程序需要在不需要首先针对用户的声音训练识别引擎的情况下工作。

如果这可以在 Windows XP 或更低版本的 Windows Vista 上运行,那也太棒了。

可选地,系统需要能够以用户选择的语言将屏幕上的信息读回给用户。我可以使用预先录制的画外音来解决这个规范,但首选方法是使用文本到语音引擎。

任何人都可以为我推荐一些东西吗?

4

11 回答 11

59

不久前,Joel on Software 上也有人问过类似的问题。您可以使用System.Speech.Recognition命名空间来执行此操作……但有一些限制。将 System.Speech(应该在 GAC 中)添加到您的项目中。这是 WinForms 应用程序的一些示例代码:

public partial class Form1 : Form
{
  SpeechRecognizer rec = new SpeechRecognizer();

  public Form1()
  {
    InitializeComponent();
    rec.SpeechRecognized += rec_SpeechRecognized;
  }

  void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  {
    lblLetter.Text = e.Result.Text;
  }

  void Form1_Load(object sender, EventArgs e)
  {
    var c = new Choices();
    for (var i = 0; i <= 100; i++)
      c.Add(i.ToString());
    var gb = new GrammarBuilder(c);
    var g = new Grammar(gb);
    rec.LoadGrammar(g);
    rec.Enabled = true;
  }

这会识别从 1 到 100 的数字,并在表单上显示结果数字。您需要一个带有名为 lblLetter 的标签的表单。

System.Speech 仅适用于预定义的单词或短语列表;无论是在多功能性还是在识别质量方面,它都不完全是 NaturallySpeaking。但是你不必根据用户的声音来训练它,如果你只有一些用户可以说的不同的东西,它就可以很好地工作。而且它是免费的!(如果你有 Visual Studio)

如果您使用非常短的短语,它将无法正常工作;我为我的孩子制作了一个程序,让他们说出字母表中的字母并在屏幕上看到它们,但它做得并不好,因为许多字母听起来很相似(尤其是从一个四岁孩子的嘴里)。

至于更灵活的选择……嗯,有前面提到的 NaturallySpeaking,它有一个 SDK。但是您必须联系销售人员才能获得任何形式的访问权限,并且没有列出定价,因此它会作为“它的成本是多少?嗯,你有多少?”之一出现。之类的东西。似乎没有“下载并使用它”选项。:(

至于文本到语音,System.Speech.Synthesis 会这样做。它甚至比语音识别更容易。我写了一个小程序让我输入,按 Enter,然后大声朗读文本。我四岁的孩子被它迷住了。:) (“爸爸,我想和 da wobot 聊天。”)

于 2008-10-22T19:31:49.297 回答
16

[Note: I was the development lead for the managed speech recognition API in .NET 3.0]

System.Speech is part of .NET 3.0, so it is available on both Vista and XP. In Vista you have the added benefit of having a speech recognition engine pre-installed by the OS. On XP you choices are: use the SAPI 5.1 SDK with a very old engine (but might work well enough for your command and control scenario), install Office 2003 which installs a newer version of the recognizer. There are a few SAPI 5 complient speech recognition engines available as well.

If you need to switch languages, you will want to use the System.Speech.Recognition.SpeechRecognitionEngine class which allows you to choose the SR engine for the language you need to support. Note that engines are defined by a set of languages they support (they might be using the same binary, only swapping data files to support additional languages).

Comment if you need to know more.

Philipp

于 2008-11-04T21:35:27.457 回答
10

在此之前添加“演讲”参考

系统语音

发现 Kyralessa 在 10 月 22 日发布的代码示例对我不起作用,但稍作修改的版本对我有用。将字符串添加到 Choices 对象时,使用全文英文单词而不是数字。似乎 MS 语音识别引擎无法自行识别数字。

我已经在前面的示例中添加了一些注释来标记这些修改。

public partial class Form1 : Form
{
  SpeechRecognizer rec = new SpeechRecognizer();

  public Form1()
  {
    InitializeComponent();
    rec.SpeechRecognized += rec_SpeechRecognized;
  }

  void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
  {
    lblLetter.Text = e.Result.Text;
  }

  void Form1_Load(object sender, EventArgs e)
  {
    var c = new Choices();

    // Doens't work must use English words to add to Choices and
    // populate grammar.
    //
    //for (var i = 0; i <= 100; i++)
    //  c.Add(i.ToString());

    c.Add("one");
    c.Add("two");
    c.Add("three");
    c.Add("four");
    // etc...

    var gb = new GrammarBuilder(c);
    var g = new Grammar(gb);
    rec.LoadGrammar(g);
    rec.Enabled = true;
  }
于 2008-11-25T05:32:37.963 回答
7

如果引擎是您要询问的,那么我发现(请注意,我只是列出,我没有尝试过任何一个):

Lumenvox 引擎

您还拥有 Microsoft 本身的SAPI SDK,我仅尝试将其用于文本到语音,但根据其定义:

SDK 还包括可免费分发的文本转语音 (TTS) 引擎(美国英语和简体中文)和语音识别 (SR) 引擎(美国英语、简体中文和日语)。

于 2008-10-22T19:14:04.623 回答
3

请注意,如果您不首先需要培训,您将不会获得好的结果。语音识别是语音学的统计应用,这一领域非常坦率地说,信号的变化如此之大,以至于任何人都能理解其他人所说的话几乎是一个奇迹。一个现成的语音识别引擎很可能会倾向于使用更普遍的英语口音,但对于任何稍有不同的东西都会惨遭失败。

这就是为什么培训如此重要。我们可以轻松地通过过度拟合来做得很好,特别是如果我们减少问题空间。但是创建一个可扩展的机器学习解决方案?其中总是存在问题。

话虽如此,请考虑 Sphinx-4。这是一个用 Java 编写的现成解决方案,可在http://cmusphinx.sourceforge.net/sphinx4/ 获得

于 2008-10-22T19:23:25.757 回答
0

Dragon Naturally speak SDK可能值得一看。 这个项目看起来很有趣。

虽然没有和他们中的任何一个一起玩。

于 2008-10-22T19:17:47.627 回答
0

语音 API提供文本到语音。就个人而言,我可能需要 Vista 并使用System.Speech.SpeechRecognitionSystem.Speech.Synthesis.TtsEngine的托管接口,但如果您确实需要 XP 支持,则应该可以在非托管 API 中使用 P/Invoke。

于 2008-10-22T19:22:47.490 回答
0

试试Microsoft Speech Server,我认为它现在是Office Communication Server 2007的一部分。它包含一个 SR/TTS 引擎、C# API 和与 Visual Studio 集成的工具。

于 2008-11-04T21:41:52.637 回答
0

这是来自 MSDN 杂志的文章,首先讨论了使用用于 Vista 的 System.Speech API。其中一些已经过时了,因为 API 在 beta(撰写本文时)和 Vista 版本之间发生了变化,但这仍然是我找到的最好的资源之一,并且很好地介绍了 System.Speech 命名空间. 请参阅http://msdn.microsoft.com/en-us/magazine/cc163663.aspx

于 2010-06-09T18:29:35.110 回答
0

好吧,这个问题已经有很多很好的回应,但我认为用 2016 年文档中的一些信息更新 Rob Segal 和 Philipp Schmid 的回应指向这个很好的代码示例是很有价值的:

https://msdn.microsoft.com/en-us/library/office/system.speech.recognition.speechrecognitionengine.aspx

它没有使用 Windows 的共享识别器(显示在屏幕中间的小 Windows 麦克风),它使用了一个很好的应用程序 SpeechRecognitionEngine,不需要任何视觉提示。UI 完全由您控制。

于 2016-07-20T00:44:54.143 回答