展会信息港展会大全

基于微软语音识别引擎的C++语音识别代码
来源:互联网   发布日期:2011-12-04 20:26:28   浏览:33509次  

导读:微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接...

微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接近的一个选项。说得通俗一些:第一种是填空题,第二种是选择题目。

今天我们就一起来学习如何用C++ 来完成一道语音识别的填空题:

代码如下:

#include

#include

#include

#include

#include

#include "sphelper.h"

//Copyright (c) Microsoft Corporation. All rights reserved.

inline HRESULT BlockForResult(ISpRecoContext * pRecoCtxt, ISpRecoResult ** ppResult){

HRESULT hr = S_OK;

CSpEvent event;

while (SUCCEEDED(hr) &&

SUCCEEDED(hr = event.GetFrom(pRecoCtxt)) &&

hr == S_FALSE)

{

hr = pRecoCtxt->WaitForNotifyEvent(INFINITE);

}

*ppResult = event.RecoResult();

if (*ppResult)

{

(*ppResult)->AddRef();

}

return hr;

}

const WCHAR * StopWord()

{

const WCHAR * pchStop;

LANGID LangId = ::SpGetUserDefaultUILanguage();

switch (LangId)

{

case MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT):

pchStop = L"}42N86\0b70e50fc0ea0e70fc/05708504608a087046";;

break;

default:

pchStop = L"Stop";

break;

}

return pchStop;

}

int main(int argc, char* argv[])

{

HRESULT hr = E_FAIL;

bool fUseTTS = true; // turn TTS play back on or off

bool fReplay = true; // turn Audio replay on or off

// Process optional arguments

if (argc > 1)

{

int i;

for (i = 1; i < argc; i++)

{

if (_stricmp(argv[i], "-noTTS") == 0)

{

fUseTTS = false;

continue;

}

if (_stricmp(argv[i], "-noReplay") == 0)

{

fReplay = false;

continue;

}

printf ("Usage: %s [-noTTS] [-noReplay] ", argv[0]);

return hr;

}

}

if (SUCCEEDED(hr = ::CoInitialize(NULL)))

{

{

CComPtr cpRecoCtxt;

CComPtr cpGrammar;

CComPtr cpVoice;

hr = cpRecoCtxt.CoCreateInstance(CLSID_SpSharedRecoContext);

if(SUCCEEDED(hr))

{

hr = cpRecoCtxt->GetVoice(&cpVoice);

}

if (cpRecoCtxt && cpVoice &&

SUCCEEDED(hr = cpRecoCtxt->SetNotifyWin32Event()) &&

SUCCEEDED(hr = cpRecoCtxt->SetInterest(SPFEI(SPEI_RECOGNITION), SPFEI(SPEI_RECOGNITION))) &&

SUCCEEDED(hr = cpRecoCtxt->SetAudioOptions(SPAO_RETAIN_AUDIO, NULL, NULL)) &&

SUCCEEDED(hr = cpRecoCtxt->CreateGrammar(0, &cpGrammar)) &&

SUCCEEDED(hr = cpGrammar->LoadDictation(NULL, SPLO_STATIC)) &&

SUCCEEDED(hr = cpGrammar->SetDictationState(SPRS_ACTIVE)))

{

USES_CONVERSION;

const WCHAR * const pchStop = StopWord();

CComPtr cpResult;

printf( "I will repeat everything you say. Say "%s" to exit. ", W2A(pchStop) );

while (SUCCEEDED(hr = BlockForResult(cpRecoCtxt, &cpResult)))

{

cpGrammar->SetDictationState( SPRS_INACTIVE );

CSpDynamicString dstrText;

if (SUCCEEDED(cpResult->GetText(SP_GETWHOLEPHRASE, SP_GETWHOLEPHRASE,

TRUE, &dstrText, NULL)))

{

printf("I heard: %s ", W2A(dstrText));

if (fUseTTS)

{

cpVoice->Speak( L"I heard", SPF_ASYNC, NULL);

cpVoice->Speak( dstrText, SPF_ASYNC, NULL );

}

if (fReplay)

{

if (fUseTTS)

cpVoice->Speak( L"when you said", SPF_ASYNC, NULL);

else

printf (" when you said... ");

cpResult->SpeakAudio(NULL, 0, NULL, NULL);

}

cpResult.Release();

}

if (_wcsicmp(dstrText, pchStop) == 0)

{

break;

}

cpGrammar->SetDictationState( SPRS_ACTIVE );

}

}

}

::CoUninitialize();

}

return hr;

}


赞助本站

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2025 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港