BCB5使用SAPI5.1执行语音识别全攻略
经历了2个多星期的反复摸索,先后安装VS2005的VC和C#,最后终于明白了如何在BCB5中使用语音识别,现将全过程记录下来,以便BCB的死忠们免的走弯路。
首先,要下载SAPI5.1这个是好无疑问了,但记住下载后不要调用里面的任何文件,只是装上去而已。
其次,下载bccsdk0.72,这个是一个开源的软件,里面提供了所需的所有文件,包括sapi.lib。
然后在项目的.h里面添加
#include "sphelper.h"
#include "sapi.h"
#pragma comment(lib,"ole32.lib")
#define MAX_EDIT_TEXT 1000
#define GID_DICTATION 0
#define WM_RECOEVENT WM_APP
#pragma warn -8055
运行,会提示缺少一些文件,在bccsdk里面的atl目录里面找到这些文件,复制到程序目录,然后把include <>改成include "",如果运行不报错的话,那么就可以正式开始编写代码了。
.h文件里面定义以下内容:
ISpRecoContext *m_cpRecoCtxt;
ISpRecoGrammar *m_cpDictationGrammar;
ISpRecognizer *cpRecoEngine;
ISpAudio *cpAudio;
CSpEvent event;
void RecoEvent(TMessage &Message);
#pragma option push -vi-
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_RECOEVENT,TMessage,RecoEvent)
END_MESSAGE_MAP(TForm)
#pragma option pop
然后在.cpp中写代码,代码太长了,下面写了,因为网站程序的原因,只能注册后可见了。
响应函数
void TForm1::RecoEvent(TMessage &Message)
{
USES_CONVERSION;
while (event.GetFrom(m_cpRecoCtxt) == S_OK)
{
switch (event.eEventId)
{
case SPEI_SOUND_START:break;
case SPEI_SOUND_END:break;
case SPEI_RECOGNITION:
wchar_t *dstrText;
event.RecoResult()->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE, TRUE,
&dstrText, NULL);
E1->Text=String(dstrText);
break;
}
}
}
全部就是这些了。
退出
m_cpRecoCtxt->Release();
m_cpDictationGrammar->Release();
CoUninitialize();
引擎初始化
::CoInitializeEx (NULL, COINIT_MULTITHREADED);
CoCreateInstance(CLSID_SpInprocRecognizer,NULL,CLSCTX_ALL,
IID_ISpRecognizer, (void **)&cpRecoEngine);
cpRecoEngine->CreateRecoContext( &m_cpRecoCtxt );
m_cpRecoCtxt->SetNotifyWindowMessage(Form1->Handle, WM_RECOEVENT, 0, 0 );
const ULONGLONG ullInterest = SPFEI(SPEI_RECOGNITION);
m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);
SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudio);
cpRecoEngine->SetInput(cpAudio, TRUE);
cpRecoEngine->SetRecoState( SPRST_ACTIVE );
m_cpRecoCtxt->CreateGrammar( GID_DICTATION, &m_cpDictationGrammar );
m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);
m_cpDictationGrammar->SetDictationState( SPRS_ACTIVE );