VC++ TTS文本转语音

2017-09-30 15:09:09  阅读 5497 次 评论 0 条

项目需要软件报数,且要支持英文,我接手这个项目之前使用的播放录音文件,只有中文,现要求支持英文,没人给录音啊,网上搜索一番文本转语音的方法,最终发现可以使用微软系统自身带的语音库来实现。废话不多说了,直接上代码


#include <sapi.h>
#include <sphelper.h>

#pragma comment(lib,"sapi.lib") 

#define LANG_CH	0
#define LANG_EN	1

ISpVoice * pVoice = NULL; //初始化COM 

//初始化
BOOL InitTTS(int nLang)
{
	if (FAILED(CoInitialize(NULL))) 
	{
		AfxMessageBox(_T("COM库初始化失败")); 
	} 

	//初始化SAPI 
	HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); 
	ISpObjectToken * pSpObjectToken = NULL; 
	WCHAR*  pReqAttr = NULL;
	if (nLang == LANG_CH)
	{
		pReqAttr = L"language=804";
	}
	else if (nLang == LANG_EN)
	{
		pReqAttr = L"language=409";
	}

	if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, pReqAttr, NULL, &pSpObjectToken)))//804代表中文   409英文
	{ 
		pVoice->SetVoice(pSpObjectToken);
		pVoice->SetRate(0);//语速		-5~5
		pSpObjectToken->Release(); 
	} else { 
		AfxMessageBox(_T("没有安装微软语音库!"));
		return  FALSE; 
	} 

	if( SUCCEEDED( hr ) ) 
	{
		return TRUE;
	}

	return TRUE;
}

//用完释放资源	
void ReleaseTTS()
{
	if (pVoice)
	{
		pVoice->Release(); 
		pVoice = NULL;
	}
	CoUninitialize(); 	
}


//在需要朗读的地方调用Speak即可
pVoice->Speak(L"我会说话啦", 0, NULL);


简单明了,代码不用过多解释了吧。SpFindBestToken函数的第二个参数 使用 language=804为中文  409英文

需要注意的是,Speak朗读的时候会阻塞线程,如果在主线程里运行,会卡界面的哟。


voice.jpg

本人使用的VS2008

源码下载:链接: https://pan.baidu.com/s/1bN3Iea 密码: 3mix


程序让测试妹子在各个干净的系统上跑了下,win7、win10都正常,vista好像也行,时间久了忘了,xp记得是没有库

本文地址:http://bloguan.com/?id=50
版权声明:本文为原创文章,版权归 博观网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?