Speech recognition 在Visual Studio中使用sapi sdk 11进行语音识别太慢

Speech recognition 在Visual Studio中使用sapi sdk 11进行语音识别太慢,speech-recognition,sapi,Speech Recognition,Sapi,我曾在Visual Studio 2010和2012中使用framework 4.5尝试过VB。安装Speech SDK版本11后,我在参考资料中检查了“Microsoft Speech Object Library ver 11”。然后导入“SpeechLib”并用以下内容实例化语音: Public WithEvents m_Recocontext As SpInProcRecoContext Public m_Recognizer As SpInprocRecognizer

我曾在Visual Studio 2010和2012中使用framework 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   
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) 
并以表格形式加载:

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)
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) 
然后,在我的“SpeechOn”例行程序中,我将音频路径连接到电话设备,如下所示:

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) 
这是我的语法文件:

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>

+1

+2

+3个

+4

+5

+6

+7

+8

+9

+0

+是

+否

+可能

每次我从.XML语法文件中说出一个非常小的命令和控制字时,我的“OnRecognition”事件就会触发,该文件通常只有0-9,甚至只有1或2(按1表示是,按2表示否)。如果我以正常的语速说“1…2…3…4…5”,它就会每隔一个数字或每三个数字漏掉一次。如果我每秒说一个数字,就可以把它们都说出来。我错过了什么技巧,使语音识别足够快,可以使用

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) 
这是最终的工作版本。必须在标记中添加“propname”,否则将无法加载

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">
    <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>

0

1

2

3

4

5

6

7

8

9


您需要更改语法(使用规范)以指定帐号。假设您的账号长度为7-10位,您可以使用以下内容:

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) 
<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>

0

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) 

1

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) 

2

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) 

3

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) 

4

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) 

5

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) 

6

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) 

7

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) 

8

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) 

9

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) 

很可能是您的语法问题,您尚未分享。语法匹配由沉默分隔的话语。如果要识别数字序列,语法必须指定数字序列,而不仅仅是数字。我添加了语法文件。我需要得到帐号,所以号码可以是数百万个组合(“123456”、“8937493”等)。对于这部分代码,我是否需要使用听写模式而不是命令和控制模式,并返回到听写模式,以获得“这是否正确,是或否?”或“按或说1代表jim,2代表mary,3代表steve”等问题的一个单词答案?如果答案是肯定的,我可能应该发布一个单独的问题,因为dictationload()不起作用。太好了!我不得不稍微调整一下,尽管使用了Notepad++并检查了任何奇怪的字符,但它还是不起作用。手动输入所有内容可以使其正常工作。最重要的是,如果L标记后面没有“propname=“digits”,它将不会加载文件,如我在编辑原始问题时的版本所示