【C++】调用Windows的TTS实现字符串语音合成

voice_func.h

#pragma once
#include <string>
using namespace std;
wstring string2wstring(string str);
void speakWString(const wstring& text, int speed);
void speakString(string text, int speed = 5);
extern bool voiceMode;

voice_func.cpp

#include <iostream>
#include "voice_func.h"
#include <windows.h>
#include <atlbase.h>
#include <sapi.h>
using namespace std;

bool voiceMode = true;
//将string转换成wstring
wstring string2wstring(string str) {
	wstring result;
	//获取缓冲区大小,并申请空间,缓冲区大小按字符计算  
	int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), NULL, 0);
	TCHAR* buffer = new TCHAR[len + 1];
	//多字节编码转换成宽字节编码  
	MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.size(), buffer, len);
	buffer[len] = '\0';             //添加字符串结尾  
	//删除缓冲区并返回值  
	result.append(buffer);
	delete[] buffer;
	return result;
}
// 传入wstring类型的字符串,并进行语音朗读的函数
void speakWString(const wstring& text, int speed) {
	CoInitialize(NULL);       // 初始化COM库
	CComPtr<ISpVoice> pVoice;   // 创建语音合成接口指针

	// 尝试创建一个语音合成对象
	HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);
	if (SUCCEEDED(hr)) {
		// 设置语音合成对象使用默认语音
		pVoice->SetVoice(NULL);
		// 设置语速为中等速度(2)
		pVoice->SetRate(speed);
		// 调用Speak方法进行文本朗读,0代表默认的朗读标志
		hr = pVoice->Speak(text.c_str(), 0, NULL);
		if (FAILED(hr)) {    // 如果朗读失败,输出错误信息
			printf("Error speaking text.\n");
		}
	}
	else {
		// 创建语音合成对象失败时的错误信息
		printf("Error creating voice object.\n");
	}

	pVoice.Release();   // 释放语音合成接口指针
	CoUninitialize();   // 关闭及清理COM库
	return;
}
// 传入string然后语言播放
void speakString(string text, int speed) {
	speakWString(string2wstring(text), speed);
}

string类型转换到wstring参考了这个文章。调用时只引入voice_func.h头文件即可。

效果视频

© 版权声明
THE END
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容