[转载]C++使用SAPI实现语音合成和语音识别的方法和代码
2014-04-25 15:14
706 查看
语音合成:
C++代码
微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接近的一个选项。说得通俗一些:第一种是填空题,第二种是选择题目。
下面是第一种模式的代码:
C++代码
C++代码
#include <sapi.h> #pragma comment(lib,"ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll #pragma comment(lib,"sapi.lib") //sapi.lib在SDK的lib目录,必需正确配置 int main(int argc, char* argv[]) { ISpVoice * pVoice = NULL; //COM初始化: if (FAILED(::CoInitialize(NULL))) return FALSE; //获取ISpVoice接口: HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); if( SUCCEEDED( hr ) ) { hr = pVoice->Speak(L"Hello world", 0, NULL); pVoice->Release(); pVoice = NULL; } //千万不要忘记: ::CoUninitialize(); return TRUE; }
微软的语音识别,在这里我们简称它为SR(speech recognition),SR分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接近的一个选项。说得通俗一些:第一种是填空题,第二种是选择题目。
下面是第一种模式的代码:
C++代码
#include <windows.h> #include <sapi.h> #include <stdio.h> #include <string.h> #include <atlbase.h> #include "sphelper.h" 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<ISpRecoContext> cpRecoCtxt; CComPtr<ISpRecoGrammar> cpGrammar; CComPtr<ISpVoice> 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<ISpRecoResult> 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; }
相关文章推荐
- [语音合成技术第四讲]使用C++实现语音识别
- 用Swig将c/c++程序转为java代码(使用swig实现java调用c、c++的方法)
- TensorFlow使用C++加载使用训练好的模型,.cc文件代码实现的相关类及方法总结
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- ESC之ESC.wsf可以实现javascript的代码压缩附使用方法第1/5页
- 如何在Windows phone8 中实现iphone中的siri,实现语音合成与语音识别
- [转]Android通过NDK调用JNI,使用opencv做本地c++代码开发配置方法
- 进程间使用信号量协调对共享资源访问c++代码实现
- Java使用JNI与C/C++代码实现混合编程
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- [转载]代码编辑器Sublime Text 3 免费使用方法与简体中文汉化包下载
- android 使用代码实现 RelativeLayout布局 addRule方法
- 转载自@机智的新手:使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
- 最长公共子序列的C++实现---附二维指针的使用方法
- 在C++工程中main函数之前跑代码的廉价方法(使用全局变量和全局函数)
- ESC之ESC.wsf可以实现javascript的代码压缩附使用方法第1/5页
- 如何在Windows phone8 中实现iphone中的siri,实现语音合成与语音识别
- c++中new和delete的使用方法(转载)
- OC基础——使用category(策略)实现分类,在不改变原类代码的前提下为原类增加方法
- 线性方程组求解的几种常用方法-c++代码实现