c++语音播报

如果出现以下错误:

error C4996: ‘GetVersionExA': 被声明为已否决

关闭SDL:

Project Properties > Configuration Properties > C/C++ > General > SDL checks关掉

转载于

C++ 简单的语音合成(TTS,即文字转语音)类_少年磊的博客-CSDN博客_c++ tts

微软win7及以上版本自带的语音合成引擎,可以直接拿来用,不需要额外的dll文件,只需要引用头文件即可, 封装一个简单的类用来做语音合成如下:
tts.h

#pragma once
#include <Windows.h>
#include "sapi.h"
#include <list>
#include <string>
#include "sphelper.h"
#pragma comment(lib, "sapi.lib")
 
 
class TTS
{
public:
	TTS();
	~TTS();
	bool Speak(std::wstring);
	bool IsUseful();
 
private:
	ISpVoice*	m_pSpVoice;
 
	bool InitVoice();
	void StopVoice();
};
 

tts.cpp

#include "tts.h"
 
 
TTS::TTS()
{
	m_pSpVoice = nullptr;
}
 
 
TTS::~TTS()
{
	StopVoice();
	::CoUninitialize();
}
 
bool TTS::InitVoice()
{
	HRESULT ret = ::CoInitialize(NULL);
	ret = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&m_pSpVoice);
	if (0 == ret && m_pSpVoice)
	{
		m_pSpVoice->SetVolume(80);
 
		IEnumSpObjectTokens *pSpEnumTokens = NULL;
		if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens)))		//找到lili语音进行朗读, 否则就跳出
		{
			ISpObjectToken *pSpToken = NULL;
			while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) && pSpToken != NULL)
			{
				LPWSTR pId = new WCHAR[32];
				pSpToken->GetId(&pId);
 
				int nLen = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pId, -1, NULL, 0, NULL, NULL);
 
				char *s = new char[nLen + 1];
				WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)pId, -1, s, nLen, NULL, NULL);
 
				if (0 == strcmp(s, ("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\MS-Lili-2052-20-DSK")))
				{
					m_pSpVoice->SetVoice(pSpToken);      // 设置lili语音
					pSpToken->Release();
					delete[] s;
					break;
				}
				delete[] s;
				pSpToken->Release();
			}
			pSpEnumTokens->Release();
		}
		return true;
	}
	else
	{
		
	}
	return false;
}
 
bool TTS::Speak(std::wstring word)
{
	StopVoice();
	if (InitVoice())
	{
		HRESULT ret = m_pSpVoice->Speak(word.c_str(), SPF_ASYNC, NULL);
		return ret;
	}
	else
	{
		return false;
	}
 
}
 
bool TTS::IsUseful()
{
	bool bRet = InitVoice();
	StopVoice();
	return bRet;
}
 
void TTS::StopVoice()
{
	if (m_pSpVoice!=nullptr)
	{
		m_pSpVoice->Release();
	}
}

实例化对象,使用Speak函数就行了,后一次会把前一次没播放完的停掉,注意参数是wstring型 

下面链接是Qt实现的语音播报功能,可以调节音量、音色、播报速率,跨平台,功能更强大:

Qt的QTextToSpeech类实现语音播报功能

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值