文章详情
C++文字转为语音播放的小方法
Posted on 2021-08-08 08:32:22 by 主打一个C++
//将一串文本用windows系统的语音库播放出来,包含设置播放的音量,语速等。
下面简单封装和调用例子:
//包含一些头文件
#pragma warning(disable:4996)
#include <iostream>
#include <windows.h>
#include <sapi.h>
#include <atlbase.h>
#pragma comment(lib, "sapi.lib")
#include <sphelper.h>
//小小封装,用于查找指定的语音和设置语音操作
class CTextToVoice
{
public:
CTextToVoice(){}
~CTextToVoice() {}
private:
static bool SetMaleVoice(ISpVoice* pVoice, HRESULT& _hr, const char* _name)
{
CComPtr<IEnumSpObjectTokens> cpEnum;
HRESULT hr = SpEnumTokens(SPCAT_VOICES, NULL, NULL, &cpEnum);
if (SUCCEEDED(hr))
{
// 遍历所有语音引擎
ULONG voicesCount = 0;
hr = cpEnum->GetCount(&voicesCount);
if (SUCCEEDED(hr))
{
for (ULONG i = 0; i < voicesCount; i++)
{
CSpDynamicString voiceName;
CComPtr<ISpObjectToken> cpVoiceToken;
hr = cpEnum->Next(1, &cpVoiceToken, NULL);
if (SUCCEEDED(hr))
{
hr = cpVoiceToken->GetStringValue(L"", &voiceName);
if (SUCCEEDED(hr))
{
char* str = voiceName.CopyToChar();
if (str == nullptr) {
return false;
}
//看看有哪些语音库
printf("%s\n", str);
std::string cstr = str;
CoTaskMemFree(str);
if (cstr.find(_name) != -1)
{
// 找到想要的,设置声音引擎
_hr = pVoice->SetVoice(cpVoiceToken);
if (SUCCEEDED(hr))
{
return true;
}
}
}
}
}
}
}
return false;
}
public:
static bool Play(const wchar_t* _str,const char* _name = "Huihui")
{
CoInitialize(nullptr); // 初始化COM库
// 创建ISpVoice对象
CComPtr<ISpVoice> pVoice;
HRESULT hr = pVoice.CoCreateInstance(CLSID_SpVoice);
if (FAILED(hr)) {
std::cerr << "无法创建语音对象: " << hr << std::endl;
CoUninitialize();
return 1;
}
if (!SetMaleVoice(pVoice, hr, _name)) {
pVoice.Detach();
CoUninitialize();
return 1;
}
hr = pVoice->SetRate(3);
if (FAILED(hr))
{
printf("设置语速失败: 0x%X\n", hr);
}
// 更改音量(例如,设置为最大音量的80%)
hr = pVoice->SetVolume(100); // 0 到 100 是音量范围
if (FAILED(hr))
{
printf("设置音量失败: 0x%X\n", hr);
}
// 使用ISpVoice的Speak方法将文字转换为语音
hr = pVoice->Speak(_str, SPF_DEFAULT, NULL);
if (FAILED(hr)) {
std::cerr << "Speak失败: " << hr << std::endl;
}
// 清理并关闭COM库
CoUninitialize();
return 0;
}
};
//调用例子
int main()
{
CTextToVoice::Play(L"你好,我,主打一个CPP"/*默认慧慧引擎*/);
return 0;
}
//根据自己需求可直接使用,觉得不好听可以安装别的语音引擎,这感觉还不错~~~💩
*转载请注明出处:原文链接:https://cpp.vin/page/12.html