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

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);

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

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/79090590