`
jinvasshole
  • 浏览: 770777 次
文章分类
社区版块
存档分类
最新评论

VC编程实现文本语音转换

 
阅读更多
转自:http://www.cppblog.com/biao/archive/2009/05/15/83048.html
文本语音(Text-to-Speech,以下简称TTS),它的作用就是把通过TTS引擎把文本转化为语音输出。本文不是讲述如何建立自己的TTS引擎,而是简单介绍如何运用Microsoft Speech SDK 建立自己的文本语音转换应用程序。

   Microsoft Speech SDK简介

   Microsoft Speech SDK是微软提供的软件开发包,提供的Speech API (SAPI)主要包含两大方面:

   1. API for Text-to-Speech

   2. API for Speech Recognition

   其中API for Text-to-Speech,就是微软TTS引擎的接口,通过它我们可以很容易地建立功能强大的文本语音程序,金山词霸的单词朗读功能就用到了这写API,而目前几乎所有的文本朗读工具都是用这个SDK开发的。至于API for Speech Recognition就是与TTS相对应的语音识别,语音技术是一种令人振奋的技术,但由于目前语音识别技术准确度和识别速度不太理想,还未达到广泛应用的要求。

   Microsoft Speech SDK可以在微软的网站免费下载,目前的版本是5.1,为了支持中文,还要把附加的语言包(LangPack)一起下载。

   为了在VC中使用这SDK,必需在工程中添加SDK的include和lib目录,为免每个工程都添加目录,最好的办法是在VC的

   Option->Directoris立加上SDK的include和lib目录。

   一个最简单的例子

   先看一个入门的例子:

#include <sapi.h>

#pragma comment(lib,"ole32.lib") //CoInitialize CoCreateInstance需要调用ole32.dll
#pragma comment(lib,"sapi.lib") //sapi.lib在SDK的lib目录,必需正确配置
int main(int argc, char* argv[])
{
ISpVoice * pVoice = NULL;

//COM初始化:
if (FAILED(::CoInitialize(NULL)))
return FALSE;

//获取ISpVoice接口:
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;
}


   短短20几行代码就实现了文本语音转换,够神奇吧。SDK提供的SAPI是基于COM封装的,无论你是否熟悉COM,只要按部就班地用CoInitialize(), CoCreateInstance()获取IspVoice接口就够了,需要注意的是初始化COM后,程序结束前一定要用CoUninitialize()释放资源。

   IspVoice接口主要函数

   上述程序的流程是获取IspVoice接口,然后用ISpVoice::Speak()把文本输出为语音,可见,程序的核心就是IspVoice接口。除了Speak外IspVoice接口还有许多成员函数,具体用法请参考SDK的文档。下面择要说一下几个主要函数的用法: HRESULT Speak(const WCHAR *pwcs,DWORD dwFlags,ULONG *pulStreamNumber);

   功能:就是speak了

   参数:

    *pwcs 输入的文本字符串,必需为Unicode,如果是ansi字符串必需先转换为Unicode。

    dwFlags 用来标志Speak的方式,其中SPF_IS_XML 表示输入文本含有XML标签,这个下文会讲到。

    PulStreamNumber 输出,用来获取去当前文本输入的等候播放队列的位置,只有在异步模式才有用。

HRESULT Pause ( void );
HRESULT Resume ( void );

   功能:一看就知道了。

HRESULT SetRate(long RateAdjust );
HRESULT GetRate(long *pRateAdjust);

   功能:设置/获取播放速度,范围:-10 to 10

HRESULT SetVolume(USHORT usVolume);
HRESULT GetVolume(USHORT *pusVolume);

   功能:设置/获取播放音量,范围:0 to 100

HRESULT SetSyncSpeakTimeout(ULONG msTimeout);
HRESULT GetSyncSpeakTimeout(ULONG *pmsTimeout);

   功能:设置/获取同步超时时间。由于在同步模式中,电泳Speak后程序就会进入阻塞状态等待Speak返回,为免程序长时间没相应,应该设置超时时间,msTimeout单位为毫秒。

HRESULT SetOutput(IUnknown *pUnkOutput,BOOL fAllowFormatChanges);

   功能:设置输出,下文会讲到用SetOutput把Speak输出问WAV文件。

   这些函数的返回类型都是HRESULT,如果成功则返回S_OK,错误有各自不同的错误码。

   使用XML
引自:http://study.qqcf.com/web/198/22269.htm
   个人认为这个TTS api功能最强大之处在于能够分析XML标签,通过XML标签设置音量、音调、延长、停顿,几乎可以使输出达到自然语音效果。前面已经提过,把Speak参数dwFlags设为SPF_IS_XML,TTS引擎就会分析XML文本,输入文本并不需要严格遵守W3C的标准,只要含有XML标签就行了,下面举个例子: ……

pVoice->Speak(L"<VOICE REQUIRED=''NAME=Microsoft Mary''/>volume<VOLUME LEVEL=''100''>turn up</VOLUME>", SPF_IS_XML, NULL);
……
<VOICE REQUIRED=''NAME=Microsoft Mary''/>

   标签把声音设为Microsoft Mary,英文版SDK中一共含有3种声音,另外两种是Microsoft Sam和Microsoft Mike。 ……

<VOLUME LEVEL=''100''>

   把音量设为100,音量范围是0~100。

   另外:标志音调(-10~10): <P99vCH MIDDLE="10">text</P99vCH>

   注意:" 号在C/C++中前面要加 / ,否则会出错。
分享到:
评论

相关推荐

    VC编程实现文本转换成语音

    现今国外计算机交互能力迅速被提升,其中语音交互是很有吸引力的一种交互方式,能提高计算机的智能性。但国内能在语音方面做得很好的公司很少,方正科大讯飞就是其中的佼佼者。这篇文章是我在参加一个智能导游员程序...

    文本转化为语音的VC + +编程方法

    本文详细介绍了怎样由文本转换为语音的VC++编程方法,主要有C++ Builder来实现。

    VC++开发基于Microsoft Speech SDK的TTS软件

    基于Microsoft Speech SDK提供的SAPI函数,用VC++编写一个简单的文语转换程序,给出实现代码,完成文本朗读和语音保存为WAV文件功能。

    易语言程序免安装版下载

    修改文本语音转换支持库,增加“机读文本.重新创建并初始化()”方法。 8. 修改应用接口支持库,增强“取快捷方式目标”命令功能,可以获取目标、参数、启始位置、图标、运行方式、快捷键、备注等信息。 9. 修改...

    myagent22

    <br> 对Agent编程的方法主要有使用VB,VC等语言进行ActiveX调用,除此之外还有直接通过VC进行COM<br>编程调用。在VB中调用Agent是最简单不过了,但由于VB程序本身存在诸多缺陷,很难在实际中应用。 而在VC中,...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态...

    C#微软培训资料

    15.4 接口的实现 .182 15.5 抽象类与接口 .195 15.6 小 结 .196 第十六章 组织应用程序 .198 16.1 基 本 概 念 .198 16.2 使用名字空间 .200 16.3 使用指示符 .203 16.4 程 序 示 例 .206 16.5 小 ...

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    为了在功能和稳定性方面进一步提高和改进,v2.0版使用VC++ Unicode(MFC)编程,程序在编译时已经集成了VC运行库,可独立运行。 由于MFC越益臃肿笨重,为了提高稳定性和效率,v3.0版使用WTL VC++ Unicode编程,程序...

    Radmin自动登录器v3.0

    为了在功能和稳定性方面进一步提高和改进,v2.0版使用VC++ Unicode(MFC)编程,程序在编译时已经集成了VC运行库,可独立运行。 由于MFC越益臃肿笨重,为了提高稳定性和效率,v3.0版使用WTL VC++ Unicode编程,程序...

    易语言支持库

    F:\ISO\=]易语言视频[=模块[=\易语言支持库\电话语音支持库1.0#4版公开测试.zip F:\ISO\=]易语言视频[=模块[=\易语言支持库\动态链接库辅助支持库v1.0.rar F:\ISO\=]易语言视频[=模块[=\易语言支持库\动态选择夹支持...

Global site tag (gtag.js) - Google Analytics