TTS C++程序只能在开发PC上运行
Posted
技术标签:
【中文标题】TTS C++程序只能在开发PC上运行【英文标题】:TTS C++ program can only run on developing PC 【发布时间】:2011-11-04 17:23:46 【问题描述】:我按照SAPI 5.1“文本转语音教程”给出的说明,编译了教程给出的示例代码(说明和示例代码与SAPI 5.3 TTS Tutorial!和@987654322给出的相同) @!)。编译后的程序在构建它的 XP PC 上运行良好,但在其他 XP 和 Win 7 PC 上无法运行。其他 2 台电脑没有安装语音 SDK。但 SAPI 5.1 演示程序 TTSApp 和 MS Excel 2003 Text-to-Speech 功能在这两台 PC 上运行良好。
为什么教程程序只能在开发PC上运行而其他2个程序可以在所有PC上运行?
开发 PC 已安装 XP sp3、Visual Studio 2008 和 SAPI 5.1。当我构建项目时,我选择了预编译的头文件。在下面的步骤 1 中,stdafx.h 文件中没有“#endif”,因此这些行插入到“#include”之后。
来自 XP PC 的错误消息:此应用程序无法启动,因为应用程序配置不正确。重新安装应用程序可能会解决此问题。
来自 Win7 PC 的错误消息:应用程序无法启动,因为它的并排配置不正确。请查看应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详情
以下是教程。
微软语音 SDK SAPI 5.1
文字转语音教程 本教程介绍了一个非常基本的文本转语音 (TTS) 示例。控制台应用程序是最简单的语音演示之一。它是 TTS 的“Hello World”等价物。 Using Events with TTS 中提供了使用图形界面(和事件泵)的 Windows 应用程序的等效示例。 该示例从最简单(尽管没有功能)的 COM 框架构建到说出一个句子。为每个新功能提供了步骤。该示例甚至比演示使用 XML 标记修改语音更进一步。完整的示例应用程序位于页面底部。
第 1 步:设置项目 第 2 步:初始化 COM 第 3 步:设置声音 第四步:说话! 第五步:修改语音
第 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 语音 SDK 5.1\Lib\i386。 4. 还将“sapi.lib”添加到“对象/库模块”行。确保名称以空格分隔。
第 2 步:初始化 COM SAPI 是基于 COM 的应用程序,COM 必须在使用前和 SAPI 处于活动状态期间进行初始化。在大多数情况下,这适用于主机应用程序的生命周期。以下代码(来自清单 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 Schema 中概述了这些命令。在这种情况下,相对等级为 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。粗体文本表示此示例的新代码。这是完整的代码示例。
【问题讨论】:
【参考方案1】:您必须安装附带安装程序(redist)的 C++ 运行时。
VC++ 2008 redist
VC++ 2008 SP1 redist
安装哪一个取决于 VS 服务包 - 如果 SP1 则 SP1,否则不安装。
编辑:第二种方法是静态链接运行时库。这会增加可执行文件的大小,但您不需要对目标机器有额外的要求。
【讨论】:
以上是关于TTS C++程序只能在开发PC上运行的主要内容,如果未能解决你的问题,请参考以下文章
无法在某些 PC 中运行 c#application(使用 c++ dll)