MFC项目使用Win7自带语音库(包含COM函数返回 “没有注册类”解决方式)

13 篇文章 4 订阅
10 篇文章 1 订阅

  MFC框架下使用Win7自带语音库函数 编写语音朗读的朋友,大概都遇到过 “CoCreateInstance函数返回值 ‘没有注册类’”。针对此问题我搜了好多网址、参考了好多博客,但是并没有解决(甚至思路被带到别的问题上)。后来考虑到应该是安装的系统不是完整版本(根据这个思考,搜索相关的信息果然找到了解决方法),针对这个问题的解决方式:
    下载 “win7或xpTTS语音引擎修复2.0.exe”,我参考的博客地址:http://blog.sina.com.cn/s/blog_88bdc35c0102vd0e.html。

  下面贴上一个语音朗读的实例以供参考:

    .h文件定义:

//包含win7系统自带的语音库文件
#include <sapi.h>
#include <sphelper.h>

//定义语音类对象 使用类对象播放语音的时候不能释放(比如定义在对话框类中播放语音,需要把对象定义为类成员函数)
CComPtr<ISpVoice>   Voice;

    .cpp文件代码示例:

//COM初始化
f (FAILED(::CoInitialize(NULL)))
	return ;

//创建COM实例
hr = m_Voice.CoCreateInstance(CLSID_SpVoice );
//设置语音事件 
hr = m_Voice->SetInterest(SPFEI(SPEI_VISEME), SPFEI(SPEI_VISEME));   

CComPtr<IEnumSpObjectTokens>          nEnum; 
ULONG                                 ulCount = 0;
CComPtr<ISpObjectToken>              VoiceToken;
//枚举所有语音包 如果没有语音包 nEnum为NULL
hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &nEnum); 
if(FAILED(hr)) 
{  
	return ; 
} 

//获取到语音包的个数
hr = nEnum->GetCount(&ulCount); 
if(FAILED(hr)) 
{ 
	return ; 
} 

CString StrRead = _T("Microsoft Simplified Chinese");
//在所有语音包中 找到指定的名称的那个语音包
while (SUCCEEDED(hr) && ulCount--) 
{ 
	hr = nEnum->Next( 1, &VoiceToken, NULL ); 
	if(FAILED(hr)) 
	{ 
		return ; 
	} 

	WCHAR *pDescription; 
	hr = SpGetDescription(VoiceToken, &pDescription); 
	if(FAILED(hr)) 
	{ 
		return ; 
	} 

	if (! wcsicmp(pDescription, StrRead.AllocSysString())) 
	{ 
		hr = m_Voice->SetVoice(VoiceToken); 
		if(FAILED(hr)) 
		{ 
			return ; 
		} 
		break; 
	} 
	VoiceToken.Release(); 
}
//设置音量
m_Voice->SetVolume(80);	
//设置播放速度
m_Voice->SetRate(1);

CString Str = _T("您好123");
//播放语音
hr = m_Voice->Speak(Str.AllocSysString(), SPF_ASYNC,NULL);

  经过几天的探索以及参考网上的资料,完成了语音播报的基本功能,剩下根据需要下载相关的语音包使用(比如男声,女声等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤昱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值