Speech SDK是以COM接口的方式提供服务的。
Speech Recognition:
语音识别编程涉及IsRecognizer,IsRecoContest/和IspRecoGrammar等多个语音识别引擎接口。
类中定义3个借口指针m_cpReconEngine,m_cpRecoCtext和m_cpDictationGrammer,分别用于引用语音识别引擎的三个重要的接口IspRecognizer,IspRecoContext和IspRecoGrammar。
初始化函数Initialize设定了语音识别的基本工作环境。包括引擎,识别上下文,语法,音频和时间等的初始化。
释放函数Destroy被类的析构函数调用,释放了类所引用的所有接口。
函数Start和Stop用来控制开始和停止接受及识别语音。它们通过引擎接口SetRecoState方法实现函。
函数GetText是获取从语音中已识别出的文字的关键,应该在响应识别引擎事件/消息的响应函数中调用。
首先声明一下,以下代码不是本人自己所写,也是好不容易搜到一些资料,给大家分享一下,帮助那些急需要这些资料的朋友们,希望那位前辈不要介意。
在相应的头文件里加上这些数据:
#include <sphelper.h>
#define GID_DICTATION 0
// Dictation grammar has grammar ID 0
#define GID_CMD_GR 33333
#define WM_RECOEVENT WM_USER+1
在定义的类里添加以下方法和数据:
void RecoEvent();
void InitSR();
BOOL b_initSR; //Have init the SR engine?
BOOL b_Dic_Grammar; //is the Dic Grammar active?
BOOL b_Cmd_Grammar; //is the Cmd Grammar active?
BOOL m_bInSound;
BOOL m_bGotReco;
CComPtr<ISpRecoContext> m_cpRecoCtxt;
CComPtr<ISpRecoGrammar> m_cpDictationGrammar;
CComPtr<ISpRecoGrammar> m_cpCmdGrammar;
CComPtr<ISpRecognizer> cpRecoEngine;
CString m_inputv;
//以下是响应函数:
afx_msg void OnStartText();
afx_msg void OnStartCMD();
在类的实现里要写以下数据:
m_inputv = _T("");
InitSR()
{ //SR Init
m_bGotReco=FALSE;
m_bInSound=FALSE;
HRESULT hr = S_OK;
hr = cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer);
//创建识别引擎COM实例
if( SUCCEEDED( hr ) )
{
hr = cpRecoEngine->CreateRecoContext( &m_cpRecoCtxt );
//创建识别上下文对象
}
else
MessageBox("error1");
// Set recognition notification for dictation
if (SUCCEEDED(hr))
{
hr = m_cpRecoCtxt->SetNotifyWindowMessage( m_hWnd, WM_RECOEVENT, 0, 0 );//设置消息机制
}
else
MessageBox("error2");
if (SUCCEEDED(hr))
{
const ULONGLONG ullInterest = SPFEI(SPEI_RECOGNITION); //我们关心的事件
hr = m_cpRecoCtxt->SetInterest(ullInterest, ullInterest);
}
else
MessageBox("error3");
// create default audio object
CComPtr<ISpAudio> cpAudio;
hr = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudio);//建立默认的音频输入对象
//设置识别引擎输入源
hr = cpRecoEngine->SetInput(cpAudio, TRUE);
b_initSR = TRUE;
//创建听写模式的语法对象
hr = m_cpRecoCtxt->CreateGrammar( GID_DICTATION, &m_cpDictationGrammar );
if (SUCCEEDED(hr))
{
//加载词典
hr = m_cpDictationGrammar->LoadDictation(NULL, SPLO_STATIC);
}
else
MessageBox("error4");
if (FAILED(hr))
{
m_cpDictationGrammar.Release();
MessageBox("start SR error");
}
//创建命令模式的语法对象
hr = m_cpRecoCtxt->CreateGrammar( GID_CMD_GR, &m_cpCmdGrammar);
if( FAILED(hr) )
{
MessageBox("Error CreateGrammar","Error",MB_OK);
}
WCHAR wszXMLFile[20]=L"";
//ANSI转UNINCODE
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)"CmdCtrl.xml" , -1, wszXMLFile, 256);
//从文件中读取语法词典
hr = m_cpCmdGrammar->LoadCmdFromFile(wszXMLFile,SPLO_DYNAMIC);
if (FAILED(hr))
{
MessageBox("Error LoadCmdFromFile","Error",MB_OK);
}
}
这些只是语音初始化的函数