Visual Studio 中使用 sapi sdk 11 的语音识别速度太慢
Speech recognition is too slow using sapi sdk 11 in Visual Studio
我在 Visual Studio 2010 年和 2012 年使用框架 4.5 尝试过 VB 我在安装 Speech SDK 版本 11 后在我的参考资料中检查 "Microsoft Speech Object Library ver 11"。然后我导入 "SpeechLib" 并实例化语音:
Public WithEvents m_Recocontext As SpInProcRecoContext
Public m_Recognizer As SpInprocRecognizer
Public m_Grammar As ISpeechRecoGrammar
并在 Form_Load 中:
m_Recocontext = New SpInProcRecoContext
m_Recognizer = CType(m_Recocontext.Recognizer, SpInprocRecognizer)
m_Grammar = m_Recocontext.CreateGrammar(0)
Dim grammarfile As String = Application.StartupPath & "\grammartest.xml"
m_Grammar.CmdLoadFromFile(grammarfile, SpeechLoadOption.SLODynamic)
m_Recocontext.EventInterests = SpeechRecoEvents.SREAllEvents
m_Recocontext.RetainedAudio = CType((m_Recocontext.RetainedAudio = SpeechRetainedAudioOptions.SRAORetainAudio), SpeechRetainedAudioOptions)
然后在我的 "SpeechOn" 例程中,我通过 phone 调用将音频路径连接到我的电话设备,如下所示:
m_AudioIn = New SpMMAudioIn
m_AudioIn.DeviceId = TelePhoneLine.WaveRecordID
m_AudioIn.Format.Type = SpeechAudioFormatType.SAFT8kHz16BitMono
m_Recognizer.AudioInputStream = m_AudioIn
m_Grammar.CmdSetRuleIdState(1, SpeechRuleState.SGDSActive)
这是我的语法文件:
<GRAMMAR LANGID="409">
<RULE ID="1" Name="number" TOPLEVEL="ACTIVE">
<L PROPNAME="number">
<P VAL="1">+one</P>
<P VAL="2">+two</P>
<P VAL="3">+three</P>
<P VAL="4">+four</P>
<P VAL="5">+five</P>
<P VAL="6">+six</P>
<P VAL="7">+seven</P>
<P VAL="8">+eight</P>
<P VAL="9">+nine</P>
<P VAL="0">+zero</P>
</L>
</RULE>
<RULE ID="2" Name="yesno" TOPLEVEL="ACTIVE">
<L PROPNAME="yesno">
<P VAL="1">+yes</P>
<P VAL="2">+no</P>
<P VAL="3">+maybe</P>
</L>
</RULE>
</GRAMMAR>
我的 "OnRecognition" 事件每次我说出我的 .XML 语法文件中的命令和控制词时都会触发,该文件非常小,通常只有 0-9,甚至只有 1 或 2(按1 表示是,2 表示否)。如果我以正常速度说“1...2...3...4...5”,它会漏掉每隔一个数字或每隔三个数字。如果我每秒说 1 个数字,它就会得到所有的数字。我缺少什么技巧可以使语音识别速度足够快以供使用?
这是最终的工作版本。 "propname" 必须添加到标签中,否则无法加载。
<GRAMMAR LANGID="409">
<RULE ID="1" Name="number" TOPLEVEL="ACTIVE">
<PHRASE min="5" max="7">
<RULEREF Name="digits" propname="digits"/>
</PHRASE>
</RULE>
<RULE Name="digits">
<L PROPNAME="digits">
<P VAL="0">0</P>
<P VAL="1">1</P>
<P VAL="2">2</P>
<P VAL="3">3</P>
<P VAL="4">4</P>
<P VAL="5">5</P>
<P VAL="6">6</P>
<P VAL="7">7</P>
<P VAL="8">8</P>
<P VAL="9">9</P>
</L>
</RULE>
</GRAMMAR>
您需要更改语法(使用 SAPI Grammar 规范)以指定帐号。假设您的帐号长度为 7-10 位,您可以使用如下内容:
<rule name="accountno">
<phrase min="7" max="10">
<ruleref name="digit" propname="digit"/>
</phrase>
</rule>
<rule name="digit">
<l>
<p val="0">0</p>
<p val="1">1</p>
<p val="2">2</p>
<p val="3">3</p>
<p val="4">4</p>
<p val="5">5</p>
<p val="6">6</p>
<p val="7">7</p>
<p val="8">8</p>
<p val="9">9</p>
</l>
</rule>
我在 Visual Studio 2010 年和 2012 年使用框架 4.5 尝试过 VB 我在安装 Speech SDK 版本 11 后在我的参考资料中检查 "Microsoft Speech Object Library ver 11"。然后我导入 "SpeechLib" 并实例化语音:
Public WithEvents m_Recocontext As SpInProcRecoContext
Public m_Recognizer As SpInprocRecognizer
Public m_Grammar As ISpeechRecoGrammar
并在 Form_Load 中:
m_Recocontext = New SpInProcRecoContext
m_Recognizer = CType(m_Recocontext.Recognizer, SpInprocRecognizer)
m_Grammar = m_Recocontext.CreateGrammar(0)
Dim grammarfile As String = Application.StartupPath & "\grammartest.xml"
m_Grammar.CmdLoadFromFile(grammarfile, SpeechLoadOption.SLODynamic)
m_Recocontext.EventInterests = SpeechRecoEvents.SREAllEvents
m_Recocontext.RetainedAudio = CType((m_Recocontext.RetainedAudio = SpeechRetainedAudioOptions.SRAORetainAudio), SpeechRetainedAudioOptions)
然后在我的 "SpeechOn" 例程中,我通过 phone 调用将音频路径连接到我的电话设备,如下所示:
m_AudioIn = New SpMMAudioIn
m_AudioIn.DeviceId = TelePhoneLine.WaveRecordID
m_AudioIn.Format.Type = SpeechAudioFormatType.SAFT8kHz16BitMono
m_Recognizer.AudioInputStream = m_AudioIn
m_Grammar.CmdSetRuleIdState(1, SpeechRuleState.SGDSActive)
这是我的语法文件:
<GRAMMAR LANGID="409">
<RULE ID="1" Name="number" TOPLEVEL="ACTIVE">
<L PROPNAME="number">
<P VAL="1">+one</P>
<P VAL="2">+two</P>
<P VAL="3">+three</P>
<P VAL="4">+four</P>
<P VAL="5">+five</P>
<P VAL="6">+six</P>
<P VAL="7">+seven</P>
<P VAL="8">+eight</P>
<P VAL="9">+nine</P>
<P VAL="0">+zero</P>
</L>
</RULE>
<RULE ID="2" Name="yesno" TOPLEVEL="ACTIVE">
<L PROPNAME="yesno">
<P VAL="1">+yes</P>
<P VAL="2">+no</P>
<P VAL="3">+maybe</P>
</L>
</RULE>
</GRAMMAR>
我的 "OnRecognition" 事件每次我说出我的 .XML 语法文件中的命令和控制词时都会触发,该文件非常小,通常只有 0-9,甚至只有 1 或 2(按1 表示是,2 表示否)。如果我以正常速度说“1...2...3...4...5”,它会漏掉每隔一个数字或每隔三个数字。如果我每秒说 1 个数字,它就会得到所有的数字。我缺少什么技巧可以使语音识别速度足够快以供使用?
这是最终的工作版本。 "propname" 必须添加到标签中,否则无法加载。
<GRAMMAR LANGID="409">
<RULE ID="1" Name="number" TOPLEVEL="ACTIVE">
<PHRASE min="5" max="7">
<RULEREF Name="digits" propname="digits"/>
</PHRASE>
</RULE>
<RULE Name="digits">
<L PROPNAME="digits">
<P VAL="0">0</P>
<P VAL="1">1</P>
<P VAL="2">2</P>
<P VAL="3">3</P>
<P VAL="4">4</P>
<P VAL="5">5</P>
<P VAL="6">6</P>
<P VAL="7">7</P>
<P VAL="8">8</P>
<P VAL="9">9</P>
</L>
</RULE>
</GRAMMAR>
您需要更改语法(使用 SAPI Grammar 规范)以指定帐号。假设您的帐号长度为 7-10 位,您可以使用如下内容:
<rule name="accountno">
<phrase min="7" max="10">
<ruleref name="digit" propname="digit"/>
</phrase>
</rule>
<rule name="digit">
<l>
<p val="0">0</p>
<p val="1">1</p>
<p val="2">2</p>
<p val="3">3</p>
<p val="4">4</p>
<p val="5">5</p>
<p val="6">6</p>
<p val="7">7</p>
<p val="8">8</p>
<p val="9">9</p>
</l>
</rule>