C++桌面应用中文语音包功能接口

使用之前需要先安装中文语音包(男声+女声安装包下载
Voice.h文件
(头文件包含的lib库资源如果缺失,百度下载或我的资源

#pragma once
#ifdef _MSC_VER
#pragma warning (push)
#pragma warning (disable : 4005)
#include <intsafe.h>
#pragma warning (pop)
#pragma warning (default : 4005)
#endif

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

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

class CVoice
{
public:
	CVoice(void);
	~CVoice(void);
private:
	ISpVoice * pVoice ;
	bool     m_State;
	void     InitVoice();
	void     CloseVoice();
public:
	void     Speech(CString str,bool flag =true);
	void     SetRate(int rate);
	void     SetVoiceType(int voicetype);	//设置1:男声;2:女声
};

Voice.cpp文件

#include "StdAfx.h"
#include "Voice.h"

CVoice::CVoice(void)
{
	m_State =false;
	InitVoice();
}

CVoice::~CVoice(void)
{
	CloseVoice();
}

void CVoice::InitVoice()
{
	pVoice =NULL;
	if (FAILED(::CoInitialize(NULL)))
		return ; 

	HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); 
	if( SUCCEEDED( hr ) ) 
	{
		ISpObjectToken* pChineseToken; 
		WCHAR pszTokenId[] =L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\VW Liang";

        SpGetTokenFromId(pszTokenId , &pChineseToken);

		pVoice->SetVoice(pChineseToken);
		pVoice->SetVolume(100);
		pVoice->SetRate(1);
	}
	m_State =true;
}

void CVoice::CloseVoice()
{
	if(pVoice !=NULL)
	{
		pVoice->Release(); 
		pVoice = NULL; 
	}
	if(m_State ==true)
		::CoUninitialize(); 
}
	
void CVoice::SetRate(int rate)
{
	pVoice->SetRate(rate);
}

void CVoice::SetVoiceType(int voicetype)
{
	if (voicetype == 1)
	{
		ISpObjectToken* pChineseToken; 
		//		WCHAR pszTokenId[] =L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\VW Lily";
		WCHAR pszTokenId[] =L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\VW Liang";

		SpGetTokenFromId(pszTokenId , &pChineseToken);
		pVoice->SetVoice(pChineseToken);
	}
	else
	{
		ISpObjectToken* pChineseToken; 
		WCHAR pszTokenId[] =L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\VW Lily";

		SpGetTokenFromId(pszTokenId , &pChineseToken);
		
		pVoice->SetVoice(pChineseToken);
	}
}

void CVoice::Speech(CString str,bool flag)
{
	USES_CONVERSION;
    LPWSTR pwStr=new wchar_t[str.GetLength()+1];
    wcscpy_s(pwStr,str.GetLength()+1,T2W((LPCTSTR)str));
    
	if(flag ==true)
		pVoice->Speak( pwStr, SPF_ASYNC, NULL); 
	else
		pVoice->Speak( pwStr, SPF_DEFAULT, NULL); 

	delete[] pwStr;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值