大家好,我参考了《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);
...
}
...
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);
...
}
{
CComPtr<ISpStream> cpWavStream; //USES_CONVERSION;
//wcscpy( szwWavFileName, T2W( szAFileName ) );//从ANSI将WAV文件的名字转换成宽字符串 //使用sphelper.h 提供的这个函数打开 wav 文件,并得到一个 IStream 指针
HRESULT hr = SPBindToFile( szWavePath, SPFM_OPEN_READONLY, &cpWavStream );
if( SUCCEEDED( hr ) )
{
m_Speak->SpeakStream( cpWavStream, SPF_ASYNC, NULL );//播放WAV文件
} return TRUE;
}