您的位置:首页 > Web前端

语音系统前端—利用SAPI进行声音识别与发声

2014-10-26 13:45 323 查看
在前一章,自然语言问答系统的构造中将整个分为7大模块。这里讲解语音识别与发声模块。

在现有的技术中,windows平台能比较快速上手的应该就是微软的SAPI了。

SAPI中提供的两个主要接口是:

1.SR(Speech Recognition),能直接将语音信号转化成文字;

2.TTS(Text-To-Speech),能直接将文字读出来。(当然,你需要有语音包)

部分测试代码如下:

//语音识别的初始化函数
//主要是创建识别器、上下文环境等
HRESULT InitializeSpeech()
{
HRESULT hr=E_FAIL;
if (SUCCEEDED(hr = ::CoInitialize(NULL)))
{
/****/
//自己加一个recognizer,避免对系统自带语音的使用
hr=cpReconizer.CoCreateInstance(CLSID_SpInprocRecognizer);
if(FAILED(hr))
{
printf("Recognizer创建失败!");
//return;

}
CComPtr<ISpObjectToken> cpAudioToken;
hr = SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN, &cpAudioToken); //建立默认的音频输入对象
if (SUCCEEDED(hr))
{
hr = cpReconizer->SetInput(cpAudioToken, TRUE);
}
hr=cpReconizer->CreateRecoContext(&cpRecoCtxt);
/**/
//hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);

if(SUCCEEDED(hr))
{
hr = cpRecoCtxt->GetVoice(&cpVoice);
}
//设置播放音量和速度
cpVoice->SetVolume(100);
cpVoice->SetRate(3);
return (cpRecoCtxt && cpVoice &&
SUCCEEDED(hr=LoadGrammarFile())&&
SUCCEEDED(hr = cpGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE)) &&
SUCCEEDED(hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION))) &&
SUCCEEDED(hr = cpRecoCtxt->SetNotifyWin32Event()) &&
SUCCEEDED(hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL)));
}
return hr;
}


//在离线模式下
//在xml进行匹配找到相应的字符串
void ProcessSpeech()
{
const float ConfidenceThreshold = 0.3f;

SPEVENT curEvent;
ULONG fetched=0;
HRESULT hr=S_OK;
cpRecoCtxt->GetEvents(1,&curEvent,&fetched);
while(fetched>0)
{
switch(curEvent.eEventId)
{
case SPEI_RECOGNITION:
if(SPET_LPARAM_IS_OBJECT==curEvent.elParamType)
{
ISpRecoResult *result=reinterpret_cast <ISpRecoResult*>(curEvent.lParam);
SPPHRASE* pPhrase=NULL;
hr=result->GetPhrase(&pPhrase);
if(SUCCEEDED(hr))
{
if ((pPhrase->pProperties != NULL) && (pPhrase->pProperties->pFirstChild != NULL))
{
const SPPHRASEPROPERTY* pSemanticTag = pPhrase->pProperties->pFirstChild;
//直接将xml中tag识别的值取出来
printf("读取到的信息是:.%s.",pSemanticTag->pszValue);
//调用相应的反馈函数
DoAction(pSemanticTag->pszValue);
}
::CoTaskMemFree(pPhrase);
}
}
break;
}
cpRecoCtxt->GetEvents(1,&curEvent,&fetched);
}
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: