语音合成:
#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分为两种模式的监听:第一种模式:任意监听,即随意输入语音,监听对象将最为接近的字或者词,句反馈出来;第二种模式:划定范围监听,制定一组被选项做为监听的,用户的语音输入被反馈成最为接近的一个选项。说得通俗一些:第一种是填空题,第二种是选择题目。
下面是第一种模式的代码:
#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++使用SAPI实现语音合成和语音识别代码,语音识别必是手机未来的主流方向。
通过微软的SAPI,不仅仅可以实现语音合成TTS,同样可以实现语音识别SR。下面我们就介绍并贴出相关代码。主要有两种方式: 1、使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑。...
语音合成让计算机声文并茂、有声有色.语音合成让计算机声文并茂、有声有色.
计算机语音合成的关键技术及展望;计算机语音合成的关键技术及展望;
基于MS Agent的语音识别与合成.基于MS Agent的语音识别与合成.
基于统计韵律模型的汉语语音合成系统的研究.基于统计韵律模型的汉语语音合成系统的研究.
语音合成的应用系统设计;语音合成的应用系统设计;语音合成的应用系统设计
简单的介绍了如何使用windows自带的语音阅读及语音识别工具,讲的比较详细,还有自带demo。值得一看
基于Microsoft Speech SDK开发的Text_To_Speech语音合成软件;
用户通过语音识别控制程序运行,程序通过语音合成通知现在运行状况。而作为被控制的对象是一个网络服务模型。 用户登陆上AgentNet服务器上以后,可以要求读新闻,与同时登陆到AgentNet的其他客户通讯等等。 在客户端...
基于Microsoft Speech SDK开发的语音合成软件及源码,是你开放语音合成的好源码!
基于Microsoft Speech SDK开发的Text to Wave语音合成之文本到WAV的转换(VC源码);Text to Wave语音合成之文本到WAV的转换(VC源码)
基于Microsoft Speech SDK开发的开发的BlueTTS语音合成软件源码;基于Microsoft Speech SDK开发的开发的BlueTTS语音合成软件源码;
第5五讲 语音合成中的关键技术(北京交通大学);第5五讲 语音合成中的关键技术(北京交通大学);
屏幕文本的语音合成并利用Win32 API 截获技术和清华大学SinoSonic 系统实现了一个桌面文本的语音输出系统,可以合成桌面上鼠标指针下的任意文本;