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