C#语音识别 – 这是用户说的吗?
我需要编写一个应用程序,使用语音识别引擎 – 内置的Vista或第三方 – 可以显示一个单词或短语,并识别用户何时读取它(或近似值)。 我还需要能够在不同语言之间快速切换,而不必更改操作系统的语言。
用户将在很短的时间内使用该系统。 应用程序需要工作,而不需要首先训练识别引擎对用户的声音。
如果这可以在Windows XP或更低版本的Windows Vista上运行,那也是太棒了。
可选地,系统需要能够以用户select的语言将屏幕上的信息读回给用户。 我可以使用预先录制的配音来解决这个规范,但是最好的方法是使用文本到语音引擎。
谁能为我推荐一些东西?
Joel在软件上问了一个类似的问题。 您可以使用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仅适用于预先定义的单词或短语列表; 这不是天生的说法,无论是在多function性还是在认知质量。 但是,你不需要训练用户的声音,如果你只有几个不同的东西,用户可以说,它运作相当好。 它是免费的! (如果你有Visual Studio)
如果使用非常简短的短语,它将不会奏效。 我为孩子做了一个程序,让他们说出字母的字母,然后在屏幕上看到它们,但是由于许多字母听起来很相像(特别是四岁的孩子),所以没有那么好。
至于更灵活的选项…以及前面提到的具有SDK的NaturallySpeaking。 但是你必须联系销售人员才能获得任何forms的访问权限,而且没有列出任何定价,所以它就是其中的一个“多less成本?那么,你有多less? 种类的东西。 似乎没有“下载和玩”选项。 🙁
至于文本到语音, System.Speech.Synthesis是这样做的。 这比语音识别更容易。 我写了一个小程序,让我打字,按Enter,然后大声朗读文本。 我四岁的孩子被它迷住了。 :)(“爸爸,我想tawk da da机器人。”)
[注意:我是.NET 3.0中托pipe语音识别API的开发负责人]
System.Speech是.NET 3.0的一部分,因此可以在Vista和XP上使用。 在Vista中,您还拥有由操作系统预先安装的语音识别引擎。 在XP上,您可以select:使用带有一个非常旧的引擎的SAPI 5.1 SDK(但对于您的命令和控制scheme可能已经足够好了),安装安装更新版本识别器的Office 2003。 还有一些SAPI 5兼容性语音识别引擎。
如果您需要切换语言,您将需要使用System.Speech.Recognition.SpeechRecognitionEngine类,该类允许您为需要支持的语言selectSR引擎。 请注意,引擎由它们支持的一组语言定义(它们可能使用相同的二进制文件,只能交换数据文件以支持其他语言)。
评论,如果你需要知道更多。
菲利普
在此之前添加“言语”参考
发现Kyralessa在10月22日发布的代码示例对我不起作用,但稍微修改了一下。 在Choices对象中添加string时,请使用全文英文单词而不是数字。 似乎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; }
如果引擎是你问的那么我发现(要小心,我只是列出,我没有尝试过任何):
Lumenvox引擎
你也有微软本身的SAPI SDK ,我只用它来testing文本到语音,但是根据它的定义:
该SDK还包括可自由分发的文本到语音(TTS)引擎(美国英语和简体中文) 和语音识别(SR)引擎 (美国英语,简体中文和日语)。
要警告的是,如果你不需要先训练,你就不会得到好的结果。 语音识别是语音学的一个统计应用,一个非常坦率的领域是信号如此之多的变化,任何人都可以理解其他人所说的奇迹几乎是个奇迹。 现成的语音识别引擎很可能倾向于更普遍的英语口音,但是对于任何甚至稍有不同的东西都会失败。
这就是培训如此重要的原因。 我们可以很容易地过度配合,特别是如果我们减less了问题的空间。 但是创build一个可扩展的机器学习解决scheme? 其中总是存在的磨擦。
这就是说,考虑狮身人面像-4。 这是一个用Java编写的现成解决scheme,可在http://cmusphinx.sourceforge.net/sphinx4/上find
在.NET 3.5中查看新的Speech类库
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
语音API可以使用文本到语音。 就个人而言,我可能需要Vista,并使用System.Speech.SpeechRecognition和System.Speech.Synthesis.TtsEngine托pipe接口,但如果你真的需要XP的支持,一个P / Invoke应该可以进入非托pipeAPI。
尝试Microsoft Speech Server ,我认为它现在是Office Communication Server 2007的一部分 。 它包含一个SR / TTS引擎,C#API和与Visual Studio集成的工具。
这是MSDN杂志的文章,首先讨论了使用System.Speech API for Vista。 其中一些已经过时了,因为API在testing版(写文章的时候)和Vista的发布之间改变了,但是这仍然是我find的最好的资源之一,涵盖了System.Speech命名空间的一个很好的介绍。 请参阅http://msdn.microsoft.com/en-us/magazine/cc163663.aspx
Dragon Naturally Speaking SDK可能值得一看。 这个项目看起来有趣。
尽pipe他们中的任何一个都没有玩过。
那么这个问题已经有了很多好的反应,但是我认为从2016年的文档中更新一些信息是很有价值的,Rob Segal和Philipp Schmid的回应指向了这个很好的代码示例:
它没有使用Windows的共享识别器(在屏幕中间显示的小Windows麦克风),它使用一个很好的应用程序SpeechRecognitionEngine,不需要任何视觉提示。 用户界面完全由您控制。