我正在尝试开发一个基于语音的应用程序,它将接受用户输入作为语音并根据输入执行一些操作。这是我第一次尝试这项技术,我正在开发它。
我使用dotnet 4附带的Microsoft SAPI来识别语音。到目前为止,我已经了解了它支持的两种模式。
语音识别(SR)有两种操作模式:
- 听写模式 - 一种无约束,自由形式的语音解释模式,它使用识别器为特定语言提供的内置语法。这是默认识别器。
- 语法模式 - 将口语单词与一个或多个特定的无上下文语法(CFG)进行匹配。 CFG是一种定义一组特定单词的结构,以及可以使用的这些单词的组合。在基本术语中,CFG定义了对SR有效的句子。语法必须以预编译语法文件的形式由应用程序提供,或者在运行时以W3C语音识别语法规范(SRGS)标记或较旧的CFG规范的形式提供。 Windows SDK包含语法编译器:gc.exe。
基本上,无论我用语法指定什么词,引擎都只能识别那些。但我也希望包含一些自由格式文本和结构化语法。一个例子可以是人的名字。如果我想从语音中捕获名称,我需要在语法中指定该名称,但如果应用程序对任何人开放都不可能。
有没有办法可以提取一些不是语法一部分的文本?
如何让系统识别句子,例如“我的名字是加里,我25岁”。这个名字绝对是什么,我如何在我的语法中定义它?
您可以将听写模式与语法模式混合,请参阅MSDN中的此示例:
http://msdn.microsoft.com/en-us/library/ms723634(v=vs.85).aspx
<GRAMMAR>
<!-- command to handle first and last names with semantic properties -->
<!-- By using semantic properties, the application can ignore all of
the text returned, except for the text associated with the dictation
tags' semantic properties "PID_FirstName" and "PID_LastName" -->
<RULE ID="SubmitName" TOPLEVEL="ACTIVE">
<P>
my first name is
<!-- Note the implicit maximum is only one word -->
<DICTATION PROPID="PID_FirstName"/>
and my last name is
<!-- Note the implicit maximum is two words -->
<DICTATION PROPID="PID_LastName" MAX="2"/>
</P>
</RULE>
</GRAMMAR>
看看GARBAGE special rule。我不知道你会如何检索与垃圾部分匹配的单词,但我很确定有一种方法。
如果你弄清楚我是否对这个问题感兴趣,请告诉我:)。