admin 管理员组

文章数量: 887021

由于工作需要,需要文字转语音功能的支持。由于各种原因限制,所以选择了使用Windows平台自带的语音引擎。

首先使用场景是局域网,无法访问互联网。所以通过网络接口提供的服务就被排除了,比如百度的tts服务。

由于应用范围也很有限,规模小,所以付费的语音引擎也不考虑了。比如科大讯飞的语音引擎。

再者个人经验\阅历有限,目前不知道其他开源的语音引擎,所以,只能选择平台自带的语音引擎(非windows正版用户功能有阉割),还好,找到了修复工具,解决了这个问题,修复工具见上一篇文章,附带好多语音库可以下载使用,还提供了demo工具可以测试。

下面说一下使用流程。

  • 安装SpeechSDK5.1

这个直接到微软官网下载https://www.microsoft/en-us/download/confirmation.aspx?id=27226,可以下载汉语的语音包,不过是用英语的语调读汉语,比较别扭。下载安装后,需要下载补丁工具。

  • 下载修复工具和测试工具

http://blog.sina/s/blog_88bdc35c0102vd0e.html --------------------- 本文来自 moyebaobei1 的CSDN 博客 ,全文地址请点击:https://blog.csdn/moyebaobei1/article/details/82789362?utm_source=copy

这是个测试工具,可以用来测试服务是否可用,以及语音库是佛安装成功。http://www.cppfans/cbknowledge/skills/media/ttsdemo.asp --------------------- 本文来自 moyebaobei1 的CSDN 博客 ,全文地址请点击:https://blog.csdn/moyebaobei1/article/details/82789362?utm_source=copy

语音库可以看到我安装了哪些语音,语音库都是符合一定标准的就可以识别。然后输入朗读内容,单击【朗读】就可以按照这种语音库的规律朗读文字。如果朗读成功,则说明语音库安装成功了。

Windows平台,是基于COM和DCOM组织起来的,所以实现上就是需要创建出对应的组件,然后调用接口上的方法。哦通过SDK调用TTS服务,需要设置默认的语音库。

  • 设置系统语音服务(默认语音库)

控制面板 - 语音(32位)- 文字转语音

  • 封装调用

然后对SDK调用做一下简单的封装。

#pragma once
#include<iostream>
#include <sapi.h> //导入语音头文件
#include <string>
#pragma comment(lib,"sapi.lib") //导入语音头文件库

using namespace std;

void  MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调用此函数即可将文字转为语音
{
	ISpVoice *pVoice = NULL;

	//初始化COM接口
	if (FAILED(::CoInitialize(NULL)))
		MessageBox(NULL, (LPCWSTR)L"COM接口初始化失败!", (LPCWSTR)L"提示", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);

	//获取SpVoice接口
	HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);
	if (SUCCEEDED(hr))
	{
		pVoice->SetVolume((USHORT)100); //设置音量,范围是 0 -100
		pVoice->SetRate(0); //设置速度,范围是 -10 - 10
		hr = pVoice->Speak(speakContent, 0, NULL);
		pVoice->Release();
		pVoice = NULL;
	}

	//释放com资源
	::CoUninitialize();
}

//string转换车wstring  
std::wstring  StringToWString(const std::string& s)
{
	std::wstring wszStr;
	int nLength = MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, NULL, NULL);
	wszStr.resize(nLength);
	LPWSTR lpwszStr = new wchar_t[nLength];
	MultiByteToWideChar(CP_ACP, 0, s.c_str(), -1, lpwszStr, nLength);
	wszStr = lpwszStr;
	delete[] lpwszStr;
	return wszStr;
}

void read(string temp){
	wstring a = StringToWString(temp);
	LPCWSTR str = a.c_str();
	/*不知道为什么Cstr不行*/
	MSSSpeak(str);
	cout << "朗读结束\n";
}

 

本文标签: Speech Windows XP