- 浏览: 882867 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (319)
- Thinking / 反思 (27)
- 我读的技术类图书 (3)
- 我读的非技术图书 (3)
- Java & Groovy (55)
- Ruby/Rails (9)
- Python (10)
- C/C++ (14)
- C# & .net (9)
- 互联网相关技术 (6)
- Database (6)
- Unix/Linux (6)
- WindowsDev (21)
- 工具使用 / Tips (62)
- 编程技术杂谈/咨讯 (6)
- 软工 / 敏捷 / 模式 (6)
- 易筋经 / 各种内功 (3)
- 充电 / 他学科知识 (6)
- 外语学习 (16)
- 我和宝宝的甜蜜生活 (24)
- 八卦 (3)
- 健康 (0)
- 无类别 (0)
- mTogether (4)
- 一页纸 (3)
- SAP (7)
- baby (2)
- abap (2)
- temp (1)
- network (1)
- 生活 (1)
最新评论
-
daliang1215:
收藏一下,好东西。 xp 的快捷键用的非常爽,到win7缺没有 ...
Windows7: 右键任务栏上的一个窗口, 用快捷键c关闭它 -
Alice南京:
感谢
Java GC 监视方法与工具 -
wjason:
今天在excel 2010上面写了一些代码,果然lookup有 ...
Excel 公式: 根据一个单元格的用户输入值, 自动设置另一个单元格的值 -
wjason:
因式分解:http://zh.wikipedia.org/wi ...
教孩子学编程: 数学题1 -
bbls:
不错 找了好久了
VS2010: 在Solution Explorer中,自动关联当前正在编辑的文件
zz sorry to 原作者 这篇帖子网上太多,出处我已无法考证 :)
最近项目需要这个,zz如下:
内容简介
文本语音(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
个人认为这个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):
<PITCH MIDDLE="10">text</PITCH>
注意:" 号在C/C++中前面要加 \ ,否则会出错。 标志语速(-10~10):
<RATE SPEED="-10">text</RATE>
逐个字母读:
<SPELL>text</SPELL>
强调:
<EMPH>text</EMPH>
停顿200毫秒(最长为65,536毫秒):
<SILENCE MSEC="200" />
控制发音:
<PRON SYM = ''h eh - l ow 1''/>
这个标签的功能比较强,重点讲一下:所有的语言发音都是由基本的音素组成,拿中文发音来说,拼音是组成发音的最基本的元素,只要知道汉字的拼音,即使不知
道怎么写,我们可知道这个字怎么都,对于TTS引擎来说,它不一定认识所有字,但是你把拼音对应的符号(SYM)给它,它就一定能够读出来,而英语发音则
可以用音标表示,''h eh - l ow
1''就是hello这个单词对应的语素。至于发音与符号SYM具体对应关系请看SDK文档中的Phoneme Table。
再另外,数字、日期、时间的读法也有一套规则,SDK中有详细的说明,这里不说了(懒得翻译了),下面随便抛个例子:
<context ID = "date_ ymd">1999.12.21</context>
会读成
"December twenty first nineteen ninety nine"
XML标签可以嵌套使用,但是一定要遵守XML标准。XML标签确实好用,效果也不错,但是……缺点:一个字―――"烦",如果给一大段文字加标签,简直痛不欲生。
把文本语音输出为WAV文件
#include <sapi.h>
#include <sphelper.h>
#pragma comment(lib,"ole32.lib")
#pragma comment(lib,"sapi.lib")
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 ) )
{
CComPtr<ISpStream> cpWavStream;
CComPtr<ISpStreamFormat> cpOldStream;
CSpStreamFormat OriginalFmt;
pVoice->GetOutputStream( &cpOldStream );
OriginalFmt.AssignFormat(cpOldStream);
hr = SPBindToFile( L"D:\\output.wav",SPFM_CREATE_ALWAYS,
&cpWavStream,&OriginalFmt.FormatId(),
OriginalFmt.WaveFormatExPtr() );
if( SUCCEEDED( hr ) )
{
pVoice->SetOutput(cpWavStream,TRUE);
WCHAR WTX[] = L"<VOICE REQUIRED=''NAME=Microsoft Mary''/>text to wave";
pVoice->Speak(WTX, SPF_IS_XML, NULL);
pVoice->Release();
pVoice = NULL;
}
}
::CoUninitialize();
return TRUE;
}
SPBindToFile把文件绑定到输出流上,而SetOutput把输出设为绑定文件的流上。
最后
看完本文后,是不是觉得很简单,微软把强大的功能封装的太好了。其实SDK中另外一个API,SR(语音识别)更有趣,有兴趣不妨试试,你会有意外的收获的。
发表评论
-
通过Windows命令行,自动设置Windows IP地址
2010-09-11 22:27 1971最近经常拿F同学的本本,到实验室做一些测试。 办公楼上网用的 ... -
使用AutoHotKey扩展VS2008, 打开文件时, 指定文件的编码
2010-02-23 10:44 2112最近从日本人手里拿到了一个vc的工程,打开一开,果然注视都是乱 ... -
VC++ SP6:创建socket出错 & 补丁不是白打的
2010-01-07 14:31 1903最近我需要维护的一个 ... -
原来VS2008的Breakpoints Window在这里
2009-10-28 18:37 1627我最近在使用visual studio 2008, 本来好 ... -
工具(Tray Friend):将任何程序,最小化到系统托盘
2009-10-15 13:59 3032这一需求的因由是Notes ... -
VC++: 在双显示器间,移动最大化的窗口
2009-10-10 16:32 5114最近升级成了双显示器, 以前只是知道双显示器爽,但用过之后才 ... -
搞定Windows的版本号
2009-06-16 13:29 2011我们有一个用InstallShield制作的安装器, 在vis ... -
VisualStudio2008中集成svn & csUnit
2009-05-06 15:49 3185今天整了一下我.net的环境, 配了svn和unit test ... -
WindowsXP_sp2修复过程报错:无法拷贝clbcatq.dl_
2009-03-18 13:12 1808这篇blog讲述的是由公司内部的软件vp引起的故事. 要知道现 ... -
配置Windows的开机 关机脚本
2009-02-14 17:13 4214想在windows开关机的时候 ... -
被Explorer雷到的一次经历
2008-09-04 14:19 1051在上一篇博客:"使用Excel制作逆序词典 &am ... -
Windows上消息截取
2008-08-06 16:21 2205项目中的需求:windows sh ... -
批处理文件bat 语法备忘 zz
2008-07-09 12:55 1505bat的优点大概只有不需要安装解析器,比如perl,pytho ... -
【bat脚本】 and 【 "net helpmsg..." command】
2008-07-09 12:43 3522两个问题,前一个是收获,以前不知道,后一个是被郁闷 呵呵~ ... -
Windows Service实现方案之华山论剑 - 包装一个java程序为Windows服务
2008-07-07 11:09 2153前面发表了3篇博客,围 ... -
Install Windows Service @WinServer2003
2008-07-04 17:12 1607前面介绍了Windows service wrapper,在W ... -
Java Service Wrapper
2008-07-04 17:11 2124Project name: Java Service Wrap ... -
Java程序员学习C#的最佳曲线是什么?
2008-06-27 14:45 2513作为一名java程序员,最近正好用到了C#,想学习一下。于是想 ... -
netsh命令详解 zz
2008-01-07 08:36 1918?zz一篇 http://blog.sina.com.cn/s ... -
VS默认开发语言设置
2008-01-16 01:11 2139如何将VS2005的默认启动语言设置成C#,而不是C++? ...
相关推荐
base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz base zz zz zz zz zz
迅雷就在地址前后分别加上“AA”和“ZZ”,然后进行Base64编码,转换前为:AA地址ZZ 转换后的地址再加上 thunder:// 快车是在地址前后分别加上了“[FLASHGET]”,然后Base64编码,转换前为:[FLASHGET]地址...
【pdf转换成word转换器 转转大师】Zz PDF convert是一款PDF转换为word转换器,并且是完全免费的。它体积小,转换快速,界面简洁方便,1秒钟就能上手。有了它,你可以轻松地将PDF转换成office word软件可编辑的doc...
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的贡献。 最重要的是,我们将来自胶子-胶子通道的胶子-融合ZZ + jet贡献添加到我们的合并...
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
zz使用mini开发板PPT教案学习.pptx
使用举例:zz 1-3 4 126 127 层号定义,与PADS类似:1~120是etch ;SolderMask: 121(top) 128(bot) ;Silkscreen: 126(top) 129(bot) ;Assembly: 127(top) 130(bot) ;PasteMask: 123(top) 122(bot) ;Display 125(top) ...
,主图指标,顶底信号,突破,转折信号,都很明显
计算某个文件夹下各个文件列表得长度,并分类统计
程序员的编辑器——VIM(zz) - 饮水思源
ZZ Fibo Trader 简单地展示了 Simple ZZ Fibo 的使用, 它在之字转向的波动中绘制斐波那契线。另外,算法还展示了通过抛物线系统进行移动止损的操作。
留言本改自柏图留言本 BTB 1.2 管理员:zz809 密 码:zz809.com
ZZ公司安全生产守则.docx
zz;ldkfjntmtmsbggyyessdd
vi编辑器的使用 一、vi的工作模式 vi有两种工作模式: 编辑模式:用来输入和编辑文件的模式,屏幕上会显示用户的键入,按键不是被解释为命令执行,而是作为文本写到用户的文件中。 指令模式:用来编辑、存盘和...
基于国家标准的endnote的输出样式,适用于学生党论文插入文献参考,较为方便。endnote论文神器。
介绍了ZZ18000/25.5/50型四柱支撑掩护式支架的主要技术参数、结构特点以及该支架作为快速搬家专用巷道支护支架在回撤巷道中的应用。该支架可实现对回撤巷道的提前支护,缩短了搬家倒面的时间,提高了综采设备的利用率...