- 浏览: 896094 次
- 性别:
- 来自: 大连
文章分类
- 全部博客 (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 2010最近经常拿F同学的本本,到实验室做一些测试。 办公楼上网用的 ... -
使用AutoHotKey扩展VS2008, 打开文件时, 指定文件的编码
2010-02-23 10:44 2164最近从日本人手里拿到了一个vc的工程,打开一开,果然注视都是乱 ... -
VC++ SP6:创建socket出错 & 补丁不是白打的
2010-01-07 14:31 1946最近我需要维护的一个 ... -
原来VS2008的Breakpoints Window在这里
2009-10-28 18:37 1656我最近在使用visual studio 2008, 本来好 ... -
工具(Tray Friend):将任何程序,最小化到系统托盘
2009-10-15 13:59 3093这一需求的因由是Notes ... -
VC++: 在双显示器间,移动最大化的窗口
2009-10-10 16:32 5177最近升级成了双显示器, 以前只是知道双显示器爽,但用过之后才 ... -
搞定Windows的版本号
2009-06-16 13:29 2047我们有一个用InstallShield制作的安装器, 在vis ... -
VisualStudio2008中集成svn & csUnit
2009-05-06 15:49 3219今天整了一下我.net的环境, 配了svn和unit test ... -
WindowsXP_sp2修复过程报错:无法拷贝clbcatq.dl_
2009-03-18 13:12 1848这篇blog讲述的是由公司内部的软件vp引起的故事. 要知道现 ... -
配置Windows的开机 关机脚本
2009-02-14 17:13 4249想在windows开关机的时候 ... -
被Explorer雷到的一次经历
2008-09-04 14:19 1101在上一篇博客:"使用Excel制作逆序词典 &am ... -
Windows上消息截取
2008-08-06 16:21 2250项目中的需求:windows sh ... -
批处理文件bat 语法备忘 zz
2008-07-09 12:55 1541bat的优点大概只有不需要安装解析器,比如perl,pytho ... -
【bat脚本】 and 【 "net helpmsg..." command】
2008-07-09 12:43 3552两个问题,前一个是收获,以前不知道,后一个是被郁闷 呵呵~ ... -
Windows Service实现方案之华山论剑 - 包装一个java程序为Windows服务
2008-07-07 11:09 2189前面发表了3篇博客,围 ... -
Install Windows Service @WinServer2003
2008-07-04 17:12 1637前面介绍了Windows service wrapper,在W ... -
Java Service Wrapper
2008-07-04 17:11 2178Project name: Java Service Wrap ... -
Java程序员学习C#的最佳曲线是什么?
2008-06-27 14:45 2543作为一名java程序员,最近正好用到了C#,想学习一下。于是想 ... -
netsh命令详解 zz
2008-01-07 08:36 1949?zz一篇 http://blog.sina.com.cn/s ... -
VS默认开发语言设置
2008-01-16 01:11 2175如何将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
### Linux文本编辑器vi的使用 #### 一、vi编辑器概述 vi是Linux乃至UNIX中最常用且功能强大的文本编辑器之一。对于Linux系统管理员来说,掌握vi编辑器的使用至关重要,因为它几乎适用于所有类型的文本文件编辑,...
【pdf转换成word转换器 转转大师】Zz PDF convert是一款PDF转换为word转换器,并且是完全免费的。它体积小,转换快速,界面简洁方便,1秒钟就能上手。有了它,你可以轻松地将PDF转换成office word软件可编辑的doc...
迅雷就在地址前后分别加上“AA”和“ZZ”,然后进行Base64编码,转换前为:AA地址ZZ 转换后的地址再加上 thunder:// 快车是在地址前后分别加上了“[FLASHGET]”,然后Base64编码,转换前为:[FLASHGET]地址...
在IT领域,文本处理是一项基础且重要的任务,特别是在大数据分析、自然语言处理和信息检索等应用中。"统计多个文本长度"是一个典型的文本处理问题,它涉及到读取文件、处理文本内容以及进行数据统计和分类。这个任务...
ZZ561401.CAB ZZ561401.CAB ZZ561401.CAB
wincc SIMATIC WinCC是第一个使用最新的32位技术的过程监视系统,具有良好的开放性和灵活性。 从面市伊始,用户就对SIMATIC WinCC印象深刻。
使用LoopSim方法,我们合并ZZ和ZZ + jet的NLO QCD结果,并获得ZZ产生的近似NNLO预测。 还包括对ZZ过程的精确胶子融合环平方的贡献。 最重要的是,我们将来自胶子-胶子通道的胶子-融合ZZ + jet贡献添加到我们的合并...
统计机器翻译是计算机科学与语言学交叉领域的一门技术,旨在使用统计模型自动翻译文本或语音从一种自然语言到另一种自然语言。GIZA++是一款在统计机器翻译领域内常用的工具,主要用于词语对齐任务。词语对齐是翻译...
值得注意的是,虽然Matlab提供了强大的工具箱支持信号处理,但在某些情况下,为了获得更高的处理效率或更小的资源占用,人们可能会选择将Matlab算法转换为C/C++等更接近硬件的语言实现,或者使用专门的硬件设备来...
在这个案例中,可能是指在发电系统监控或控制过程中使用了MP3语音播报技术来播放相关信息。例如,可以通过预先录制的声音文件(如杜洋录制的语音文件),在特定条件下自动播放系统状态或报警信息。 #### 3.1 语音...
### 电子通信设计资料:单片机控制...从单片机的选择与编程到语音芯片的选型与使用,再到整个系统的集成与调试,每一步都需要细致入微地考虑各种细节问题。希望本文能够为广大电子爱好者及专业人士提供一定的参考价值。
掌握vi编辑器的使用对于Linux用户来说至关重要,它不仅能够提高文本编辑效率,也是许多系统管理任务中不可或缺的工具。通过熟练运用vi的各种命令,用户可以在没有图形界面的环境中高效地处理文本文件,进一步提升...
在CAD中想要快速测量长度,在CAD工具栏找到加载应用程序,再点击加载 加载成功后在输入栏输入“zz”(不分大小写)在选择你需要测量的线段即可。
ZZ超级画板教程.pdf 是一个功能强大且实用的绘图软件教程,旨在帮助用户快速掌握 ZZ 超级画板的使用方法和技巧。该教程涵盖了 ZZ 超级画板的主要特点和功能,包括: 1. 学科工具整合:ZZ 超级画板将不同的学科工具...
本文将详细讨论如何使用STM32的数字模拟转换器(DAC)来实现语音播放,特别是针对描述中提到的“小狗叫声”音频的播放。 首先,了解DAC的基本原理。DAC是Digital-to-Analog Converter的缩写,它的作用是将数字信号...
【标题】"zz.FindStr.rar" 是一个压缩包文件,主要功能是提供一个文本查找工具。这个工具能够帮助用户在指定的根目录及其所有子目录下进行文件搜索,特别是针对包含特定文本的文件进行高效定位。 【描述】该工具的...
语音识别是将人类语言转换为文本或命令的过程。在智能车的无线遥控中,用户可以通过语音指令来控制车辆的动作,这就需要用到语音识别技术。 - **前端处理**:包括语音采集、预处理(如噪声消除、特征提取等)。 - **...