L o a d i n g . . .
主打一个C++
文章详情

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

作者近期文章
  • 随手笔记
  • 主打一个C++   2025-01-11 20:02:01
  • 都2000000025年了。还有不能随意访问guthub的,仔细看。在国内其实是可以正常访问的,gfw并没屏蔽。这里给出其中一个简单直接的方法稳定访问。1. 随便百度一个”dn
提示
×
确定
数据库执行: 8次 总耗时: 0.01s
页面加载耗时: 



wechat +447752296473
wechat cpp-blog