使用 SAPI 将文本转换为音频文件

问题描述 投票:0回答:1

我想在 C++ 控制台应用程序中将给定文本转换为音频文件。我正在 Windows 10 上的 Visual Studio 中开发应用程序。我在 Microsoft 的学习挑战简单 tts 指南 sapi 5.4 网页上找到了相关代码。下面是我正在使用的代码。

#include <iostream>
#include <sphelper.h>


using namespace std;


int main()
{
    HRESULT             hr = S_OK;
    CComPtr <ISpVoice>      cpVoice;
    CComPtr <ISpStream>     cpStream;
    CSpStreamFormat         cAudioFmt;

    //Create a SAPI Voice
    hr = cpVoice.CoCreateInstance(CLSID_SpVoice);

    //Set the audio format
    if (SUCCEEDED(hr))
    {
        hr = cAudioFmt.AssignFormat(SPSF_22kHz16BitMono);
    }

    //Call SPBindToFile, a SAPI helper method,  to bind the audio stream to the file
    if (SUCCEEDED(hr))
    {

        hr = SPBindToFile(L"c:\\ttstemp.wav", SPFM_CREATE_ALWAYS,
            &cpStream; , &cAudioFmt.FormatId(), cAudioFmt.WaveFormatExPtr());
    }

    //set the output to cpStream so that the output audio data will be stored in cpStream
    if (SUCCEEDED(hr))
    {
        hr = cpVoice->SetOutput(cpStream, TRUE);
    }

    //Speak the text "hello world" synchronously
    if (SUCCEEDED(hr))
    {
        hr = cpVoice->Speak(L"Hello World", SPF_DEFAULT, NULL);
    }

    //close the stream
    if (SUCCEEDED(hr))
    {
        hr = cpStream->Close();
    }

    //Release the stream and voice object
    cpStream.Release();
    cpVoice.Release();
}

据我了解,这段代码必须在 c 盘下生成一个 wav 文件:说“hello world”。

除了这段代码之外,我还使用了 sphelper.h 头文件。我在 github 上找到了 sphelper.h 文件的原始代码。但我的解决方案不起作用。

当我在 Visual Studio 中用 C++ 编译此代码时,编译器给出错误。一个错误是“GetVersionExW”:已声明已弃用。另一个错误是该行的“预期表达式”

hr = SPBindToFile(L"c:\\ttstemp.wav", SPFM_CREATE_ALWAYS,
            &cpStream; , &cAudioFmt.FormatId(), cAudioFmt.WaveFormatExPtr());

我猜第一个错误与 sphelper.h 头文件有关。如果我这样做,第一个错误的问题就解决了:

#define FKG_FORCED_USAGE 1
#include <sphelper.h>
#undef FKG_FORCED_USAGE

或者类似的东西:

#pragma warning(disable:4996) 
#include <sphelper.h>
#pragma warning(default: 4996)

当我删除

&cpstream
之后的分号(;)时,第二个错误的问题就解决了。

当我删除这两个错误时,代码将编译。但即使在这种情况下,程序也不会在驱动器 c: 下生成 wav 文件。

c++ windows text-to-speech sapi
1个回答
1
投票
hr = SPBindToFile(L"c:\\ttstemp.wav", SPFM_CREATE_ALWAYS,
            &cpStream; , &cAudioFmt.FormatId(), cAudioFmt.WaveFormatExPtr());

&cpStream

后面有一个分号

'GetVersionExW': was declared deprecated

我的编译器不会抱怨这个;而且你应该能够忽略它,因为它是 WinAPI 使用它而不是你。

我发现的另一个错误:

在使用 COM API 之前,您必须先调用

CoInitializeEx
,因此将
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
添加到
main
的开头。

它不会在C:下生成文件

写入 C 需要管理员权限。如果您正确处理错误,您应该能够看到

SPBindToFile
返回并带有
Invalid Parameters
。将
L"c:\\ttstemp.wav"
更改为
L"c:\\users\\<your username>\\desktop\\ttstemp.wav"

© www.soinside.com 2019 - 2024. All rights reserved.