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上运行的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在加载 dll 时调试发布版本?

无法在某些 PC 中运行 c#application(使用 c++ dll)

从 R 调用时,C++ 程序不会运行(符号查找错误)

关于C++编译的程序无法在新一台电脑上运行总结

在PC上编译c++程序与DJI phantom 4 pro通讯

.NET Core 应用程序无法加载 C++ DLL