在Visual Studio中使用sapi sdk 11语音识别太慢

时间:2018-06-20 17:29:39

标签: speech-recognition sapi

我已经在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”例程中,通过如下电话将音频路径连接到电话设备:

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>

每次我说出.XML语法文件中的命令和控制字时,都会触发我的“ OnRecognition”事件,该文件很小,通常仅为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>

1 个答案:

答案 0 :(得分:1)

您将想要更改语法(使用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>