C# 语音识别 - 这是用户所说的吗?

Posted

技术标签:

【中文标题】C# 语音识别 - 这是用户所说的吗?【英文标题】:C# Speech Recognition - Is this what the user said? 【发布时间】:2010-09-18 15:13:42 【问题描述】:

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

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

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

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

谁能给我推荐一些东西?

【问题讨论】:

请澄清...你是什么意思?你是说识别引擎吗?应用程序的结构?如果你甚至应该尝试这样做? 我主要是在找一个可以使用的引擎。我需要能够告诉我的经理这个想法是否可行。我已经大致了解了如何围绕引擎构建应用程序,我所需要的只是插入引擎。 【参考方案1】:

不久前在 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 聊天。”)

【讨论】:

如何调整此代码以识别法语或德语中的 1 - 100 而无需更改操作系统显示语言? 唯一可能的语言是您的操作系统。我刚从 MSDN 读到它。 我认为您的评论“仅适用于预定义的单词或短语列表”是不正确的。 Vista 及更高版本中的桌面识别器包括一个您可以加载的听写语法。见msdn.microsoft.com/en-us/library/… +1 来自 Nuance / Dragon 的糟糕销售。我们实际上不得不乞求他们把他们的软件卖给我们(价格不菲)。 嘿...我尝试使用此代码...在我的表单中我只有标签(是否正确?),我运行应用程序,语音识别器开始工作,我说例如“四”,并且在语音识别程序中总是出现“那是什么?”标签没有任何反应。我什至在 Form1_Load 中设置了一个断点,但它永远不会到达那里......有什么建议吗?谢谢:)【参考方案2】:

[注意:我是 .NET 3.0 中托管语音识别 API 的开发负责人]

System.Speech 是 .NET 3.0 的一部分,因此可在 Vista 和 XP 上使用。在 Vista 中,您还有一个额外的好处,即操作系统预先安装了语音识别引擎。在 XP 上,您的选择是:将 SAPI 5.1 SDK 与非常旧的引擎一起使用(但对于您的命令和控制方案来说可能工作得很好),安装 Office 2003,它会安装更新版本的识别器。也有一些 SAPI 5 兼容的语音识别引擎可用。

如果您需要切换语言,您将需要使用 System.Speech.Recognition.SpeechRecognitionEngine 类,该类允许您为需要支持的语言选择 SR 引擎。请注意,引擎是由它们支持的一组语言定义的(它们可能使用相同的二进制文件,只是交换数据文件以支持其他语言)。

如果您需要了解更多信息,请发表评论。

菲利普

【讨论】:

菲利普,如果我想使用引擎并训练它学习和识别克罗地亚语,作为转录各种说话者的一种方式,是否有可能,如果是,从哪里开始? 语音识别器有两个部分:声学模型和语言模型。您可以使用 Vista 听写资源工具包(或类似的工具)来构建引用克罗地亚语单词的听写语言模型。如果克罗地亚语中存在英语(或您使用的任何现有 SR 语言)中不存在的声音,目前没有工具可以训练您想要做的声学模型。您可以为克罗地亚语单词指定自定义发音,以提高识别准确度。 Phillip,我一直在使用您建议的库,但我很难让它识别我所说的内容。我确实有点口音,但我在其他设备上没有这种经验,比如kinect等。我应该只是认为我的麦克风不够好,还是我做错了什么?所以你有什么建议吗?附言。我正在使用 MSDN 文档中的示例。 @Oakcool 你在使用基于语法的识别吗?这就是带有 Kinect 的 Xbox 所使用的。它会比听写更准确(但也更严格)。 @Philipp 这是我使用的示例msdn.microsoft.com/en-us/library/vstudio/…,我认为它不是基于语法的。我使用 kinect 的意思是,当我在我的 XBox 上使用 kinect 时,我的口音并不重要,而不是我针对它进行编程。【参考方案3】:

在此之前添加“语音”参考

发现 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;
  

【讨论】:

不知道为什么它不适合你;我发布的代码直接来自我编写和使用的程序,它对我有用。也许这与您系统上的文化设置有关? 可能是。我没有深入研究这个。【参考方案4】:

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

Lumenvox engine

你也有来自微软自己的SAPI SDK,我只尝试过将它用于文本到语音,但根据它的定义:

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

【讨论】:

Lumenvox 引擎看起来可以解决问题!我将不得不玩一下它才能确定。还需要与经理讨论定价。谢谢豪尔赫!【参考方案5】:

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

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

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

【讨论】:

+1 表示不学习的警告,我只是希望 Sphinx-4 有一个 .NET 端口。【参考方案6】:

查看 .NET 3.5 中的新语音类库

http://msdn.microsoft.com/en-us/library/system.speech.recognition.speechrecognizer.aspx

SR 和 TTS 的一般文档

http://msdn.microsoft.com/en-us/library/system.speech.recognition.aspx http://msdn.microsoft.com/en-us/library/system.speech.synthesis.aspx

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

Dragon Naturally Speaking SDK 可能值得一看。 This project 看起来很有趣。

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

【讨论】:

死链接和“这个项目”是关于文本到语音的,而不是语音识别 @Levitikon 在否决我之前,您是否阅读了问题的后半部分?他正在寻找语音识别片文本到语音。在这里,一个 3 年以上的链接已经死了也就不足为奇了。我更新了。【参考方案11】:

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

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

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

【讨论】:

以上是关于C# 语音识别 - 这是用户所说的吗?的主要内容,如果未能解决你的问题,请参考以下文章

百度语音识别TTS REST API 用C# 怎么处理下行数据 求实例

没有预定义语法的 C# 语音识别

如何在 C# 中使用 SpInprocRecoContext 识别语音事件?

c# Kinect 语音和手势识别不能一起工作

微软语音识别速度

C# - 免费离线语音识别库 (SDK)