TTS C++程序只能在开发中的PC机上运行

TTS C++ program can only run on developing PC

本文关键字:PC 运行 开发 程序 C++ TTS      更新时间:2023-10-16

我按照SAPI 5.1"文本到语音教程"给出的说明,编译了教程给出的示例代码(说明和示例代码与SAPI 5.3 TTS教程!和SAPI 5.4 TTS教程给出的相同!)。编译后的程序在构建它的XP PC上运行良好,但在其他XP和Win 7 PC上不起作用。其他两台PC没有安装Speech SDK。但是SAPI 5.1演示程序TTSApp和MS Excel 2003文本到语音功能在这两台电脑上运行得很好

为什么教程程序只能在开发PC上运行,而其他2个程序可以在所有PC上运行?

开发PC安装了XP sp3、Visual Studio 2008和SAPI 5.1。当我构建项目时,我选择了预编译的头。在下面的步骤1中,stdafx.h文件中没有"#endif",因此这些行插入在"#include"之后。

来自XP PC的错误消息:由于应用程序配置不正确,此应用程序无法启动。重新安装应用程序可能会解决此问题。

来自Win7 PC的错误消息:由于并行配置不正确,应用程序无法启动。有关的详细信息,请参阅应用程序事件日志或使用命令行sxstrace.exe工具

下面是教程。

Microsoft Speech SDKSAPI 5.1


文本到语音教程本教程介绍了一个非常基本的文本到语音(TTS)示例。控制台应用程序是最简单的语音演示之一。它相当于TTS的"Hello World"。使用TTS的事件中提供了使用图形界面(和事件泵)的Windows应用程序的等效示例。该示例从最简单(虽然没有功能)的COM框架构建到说出一个句子。为每个新功能提供了步骤。该示例甚至比演示使用XML标记修改语音更进一步。完整的示例应用程序位于页面底部。

步骤1:设置项目步骤2:初始化COM步骤3:设置语音第四步:说话!步骤5:修改语音

步骤1:设置项目虽然可以从头开始编写应用程序,但从现有项目开始更容易。在这种情况下,请使用Visual Studio的应用程序向导创建Win32控制台应用程序。当向导设置过程中出现问题时,请选择"Hello,world"作为示例。生成后,打开STDAfx.h文件,将以下代码粘贴在"#include"之后的"#endif"语句之前。这设置了SAPI所需的其他依赖项。

#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
//You may derive a class from CComModule and use it if you want to override something, 
//but do not change the name of _Module
extern CComModule _Module;
#include <atlcom.h>

代码清单1接下来,添加SAPI.h和SAPI.lib文件的路径。显示的路径用于标准SAPI SDK安装。如果编译器找不到任何一个文件,或者执行了非标准安装,请使用文件的新路径。更改项目设置以反映路径。使用项目->设置。菜单项,设置SAPI.h路径。单击"C/C++"选项卡,然后从"类别"下拉列表中选择"预处理器"。在"其他包含目录"中输入以下内容:C:\Program Files\Microsoft Speech SDK 5.1\include。要设置SAPI.lib路径,请执行以下操作:1.从"相同设置"对话框中选择"链接"选项卡。2.从"类别"下拉列表中选择"输入"。3.将以下路径添加到"附加库路径":C: \Program Files\Microsoft Speech SDK 5.1\Lib\i386。4.在"对象/库模块"行中添加"sapi.lib"。请确保名称之间用空格分隔。

步骤2:初始化COMSAPI是一个基于COM的应用程序,在使用之前和SAPI处于活动状态期间都必须初始化COM。在大多数情况下,这是针对主机应用程序的生命周期。下面的代码(来自清单2)初始化COM。当然,应用程序除了初始化之外不会做任何事情,但它确实确保COM成功启动。

#include <stdafx.h>
#include <sapi.h>
int main(int argc, char* argv[])
{
if (FAILED(::CoInitialize(NULL)))
return FALSE;
::CoUninitialize();
return TRUE;
}

代码清单2步骤3:设置声音COM运行后,下一步就是创建语音。语音只是一个COM对象。此外,SAPI使用智能默认值。在对象初始化期间,SAPI会自动分配大多数值,以便在初始化后立即使用该对象。这是对早期版本的重要改进。默认值是从"控制面板"中的"语音"属性中检索的,包括语音(如果系统中有多个可用)和语言(英语、日语等)等信息。虽然有些默认值很明显,但其他默认值则不明显(语速、音高等)。不过,所有默认值都可以通过编程或在"控制面板的语音"属性进行更改。不需要将pVoice指针设置为NULL,但对检查错误很有用;这样可以确保无效的指针不会被重复使用,或者提醒指针已经被分配或解除分配

#include <stdafx.h>
#include <sapi.h>
int main(int argc, char* argv[])
{
ISpVoice * pVoice = NULL;
if (FAILED(::CoInitialize(NULL)))
return FALSE;
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
pVoice->Release();
pVoice = NULL;
}
::CoUninitialize();
return TRUE;
}

代码清单3。粗体文本表示本例中的新代码。第四步:说话!短语的实际发音是一项同样简单的任务:一行调用Speak函数。当不再需要该语音实例时,可以释放该对象。

#include <stdafx.h>
#include <sapi.h>
int main(int argc, char* argv[])
{
ISpVoice * pVoice = NULL;
if (FAILED(::CoInitialize(NULL)))
return FALSE;
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak(L"Hello world", 0, NULL);
pVoice->Release();
pVoice = NULL;
}
::CoUninitialize();
return TRUE;
}

代码清单4。粗体文本表示本例中的新代码。步骤5:修改语音语音可以使用多种方法进行修改。最直接的方法是将XML命令直接应用于流。这些命令在XML模式中进行了概述。在这种情况下,10的相对评级将降低声音的音高。

#include <stdafx.h>
#include <sapi.h>
int main(int argc, char* argv[])
{
ISpVoice * pVoice = NULL;
if (FAILED(::CoInitialize(NULL)))
return FALSE;
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
hr = pVoice->Speak(L"Hello world", 0, NULL);
// Change pitch
hr = pVoice->Speak(L"This sounds normal <pitch middle = '-10'/> but the pitch drops half way through", SPF_IS_XML, NULL );
pVoice->Release();
pVoice = NULL;
}
::CoUninitialize();
return TRUE;
}

代码清单5。粗体文本表示本例中的新代码。这是完整的代码示例。

您必须安装C++运行时,它附带了一个安装程序(redist)。

VC++2008再贴现

VC++2008 SP1 redist

要安装哪一个取决于VS service pack-如果是SP1,则是SP1,如果不是。

EDIT:第二种方法是静态链接运行库。这增加了可执行文件的大小,但您不需要对目标计算机有额外的要求。