Text-to-Speech Tutorial

 

Text-to-Speech Tutorial
原文:来自SAPI5.1 文档
翻译:seasun /   openpaper / google  论坛 日期:2007-10-21
 
       本文介绍一个最基本的文语转换应用实例。这是一个基于控制台的语音程序示例。在另一篇文章--“使用事件的文语转换实例”中,介绍了一个基于图形界面和事件驱动的实例。
       这个例子中,使用了最简单的COM框架,并让计算机“说”一句简单的话。同时也介绍了如何使用XML标签,来对语音进行修改。在文章的最后,给出了完整的程序代码。
 
--Step1:建立工程项目
--Step2:初始化COM接口
--Step3:创建语音对象
--Step4:开始说话
--Step5:用XML标签修改语音
  语音识别与控制应用技术
Step1:建立工程
       虽然可以从零开始编写程序的代码,但是如果从现有的例子中开始就快些。所以,我们先利用Visual Studio的开发环境中的应用程序向导,来建立一个Win32控制台(console)程序。在创建过程中时,选择一个简单的“Hello world”应用程序工程项目。创建完成后,打开“stdafx.h”头文件,把以下的内容粘贴在“#include  ”与“#end if”之间。这样就把SAPI所需的其它依赖信息包含进来。
#define _ATL_APARTMENT_THREADED
 
程序清单1:
#include 
//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 
 
       接下来,在工程中增加两个文件(sapi.h和sapi.lib)的路径。假设读者在安装sapi5.1过程中,是按照默认路径安装的。如果是非默认安装,或者编译器无法找到这两个文件路径时,请更改为其它实际的存放的路径。在菜单栏中,选择“Project”|“Settings”|“C/C++”标签页,接着在“Category”下拉列表中选择“Preprocessor”,在“Additional include directories”编辑框中填入实际头文件路径,比如:“C:/Program Files/Microsoft Speech SDK 5.1/Include”。
       下面再介绍如何设置sapi.lib的路径。
       1  ,在同样的“Settints”对话框中,选择“Link”标签页。
       2  ,接着在“Category”下拉列表中选择“Input”。
       3  ,在“Additional library path”编辑框中填入sapi.lib的路径。比如“C:/Program Files/Microsoft Speech SDK 5.1/Lib/i386  。
       4  ,在同样的“Link”标签页中的“Object/library modules”栏中增加“sapi.lib”,注意,这里的各个库名字之间用空格隔开。
Step2:初始化COM接口
       SAPI  是基于COM框架的,所以使用SAPI相关函数之前和SAPI对象被激活时,程序必须初始化COM接口。下面的代码虽然除了初始化之外没有任何其它的功能,但是它确保COM能被正常启动。
 
程序清单2:
#include 
#include 
int main(int argc, char* argv[])
{
    if (FAILED(::CoInitialize(NULL)))
        return FALSE;
 
    ::CoUninitialize();
    return TRUE;
}
Step3:创建语音对象
       COM  运行环境建立起来之后,接下来创建语音对象。语音对象是一个简单的COM对象。另外,语音对象使用很多智能的默认配置,在自身初始化过程中,SAPI自动为其配置大多数的默认值,语音对象创建完成后就可以立即被程序使用。相比于旧版本,这是一个新版本的比较重要改进。这些默认的参数是从“控制面板”的“语言属性”中获得的,包括语言种类等。所有的默认参数,包括显见的和非显见的(比如说话速度,基音周期等),都可以用编程的方式改变,或从控制面板中的语言属性中修改。
       程序中把pVoice设置为NULL空值不是必须的,但是这样做,有助于检查错误,也可以作为一个提示,表示这个指针的空间已经分配了或者被释放了。
 
程序清单3:加粗字体的内容为新增的。
#include 
#include 
 
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;
}
Step4:开始说话
       让计算机开始说一个短语是相当简单的:只需在一行代码中调用“Speak”函数!倘若在你的程序中不再使用语音对象(Voice),你可以释放它。
 
程序清单4:加粗字体的内容为新增的。
#include 
#include 
 
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;
}
 
Step5:用XML标签修改语音
       修改语音有多种方法,最直接的是在语音流中使用XML命令。这些命令是用XML模式来描述的。在下面的例子中,后部分的语音基音频率会比前部分的低10个等级。
 
程序清单5:加粗字体部分是新增的,这也是本文完整的例子。
#include 
#include 
 
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  but the pitch drops half way through", SPF_IS_XML, NULL );
        pVoice->Release();
        pVoice = NULL;
    }
    ::CoUninitialize();
    return TRUE;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值