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

来源:互联网 发布:jsonarray清空数据 编辑:程序博客网 时间:2024/04/29 20:05

在前一章,自然语言问答系统的构造中将整个分为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;}


0 0