大家好,我参考了《Using Wav File Input with Speech Recognition Engines》使用wav文件作为SR引擎的输入。我在程序中创建了一个按钮,并在按钮事件中载入wav文件。但是,只有第一个文件被识别到,换句话说,SR引擎只识别了一次,返回了一个SPEI_RECOGNITION或SPEI_FALSE_RECOGNITION消息,然后再点击按钮时SR引擎并不工作,如何解决这个问题?我的代码如下:
...
CComPtr<ISpRecoGrammar> m_cpCmdGrammar; 
CComPtr<ISpRecoContext> m_cpRecoCtxt;   
CComPtr<ISpRecognizer> m_cpEngine;
CComPtr<ISpStream> m_cpSpStream;
...
BOOL CSRTestDlg::OnInitDialog()
{
    ...
    InitSAPI(); //
    ...
}HRESULT CSRTestDlg::InitSAPI()
{
    ...
    hr = m_cpSpStream.CoCreateInstance(CLSID_SpStream);
    //check hr
    hr = m_cpEngine.CoCreateInstance(CLSID_SpInprocRecogniz  er);
    //check hr
    hr = m_cpEngine->CreateRecoContext( &m_cpRecoCtxt );
    //check hr
    hr = m_cpRecoCtxt->SetNotifyWindowMessage( GetSafeHwnd(),  
        WM_RECOEVENT, 0, 0 );
    //check hr
    hr = m_cpRecoCtxt->SetInterest( SPFEI(SPEI_RECOGNITION) 
        | SPFEI(SPEI_FALSE_RECOGNITION),SPFEI(SPEI_RECOGNITI  ON) 
        | SPFEI(SPEI_FALSE_RECOGNITION) );
    //check hr
    hr = m_cpRecoCtxt->CreateGrammar(GRAMMARID1, &m_cpCmdGrammar);
    //check hr
    hr = m_cpCmdGrammar->LoadCmdFromResource(...)
    //check hr
    hr = m_cpCmdGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE );
    //check hr
    ...
}
...
void CSRTestDlg::OnButton1() 
{
    ...
    m_cpEngine->SetRecoState(SPRST_INACTIVE);
    m_cpSpStream->BindToFile(FILENAME, SPFM_OPEN_READONLY,  
        NULL, NULL, NULL);
    m_cpEngine->SetInput(m_cpSpStream, TRUE);
    m_cpEngine->SetRecoState(SPRST_ACTIVE);
    ...
}