我想在 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 文件。
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"