- 浏览: 3502610 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
Windows 语音编程初步
一、SAPI简介
软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speechsynthesis)。这两个技术都需要语音引擎的支持。微软推出的应用编程接口API,虽然现在不是业界标准,但是应用比较广泛。
SAPI全称 The Microsoft Speech API.相关的SR和SS引擎位于SpeechSDK开发包中。这个语音引擎支持多种语言的识别和朗读,包括英文、中文、日文等。
SAPI包括以下组件对象(接口):
(1)Voice CommandsAPI。对应用程序进行控制,一般用于语音识别系统中。识别某个命令后,会调用相关接口是应用程序完成对应的功能。如果程序想实现语音控制,必须使用此组对象。
(2)Voice Dictation API。听写输入,即语音识别接口。
(3)Voice Text API。完成从文字到语音的转换,即语音合成。
(4)Voice TelephoneAPI。语音识别和语音合成综合运用到电话系统之上,利用此接口可以建立一个电话应答系统,甚至可以通过电话控制计算机。
(5)Audio Objects API。封装了计算机发音系统。
SAPI是架构在COM基础上的,微软还提供了ActiveX控件,所以不仅可用于一般的windows程序,还可以用于网页、VBA甚至EXCEL的图表中。如果对COM感到陌生,还可以使用微软的C++WRAPPERS,它用C++类封装了语音SDK COM对象。
二、安装SAPI SDK。
首先从这个站点下载开发包: http://www.microsoft.com/speech/download/sdk51
Microsoft Speech SDK5.1添加了Automation支持。所以可以在VB,ECMAScript等支持Automation的语言中使用。
版本说明:
Version: 5.1
发布日期: 8/8/2001
语音: English
下载尺寸: 2.0 MB - 288.8 MB
这个SDK开发包还包括了可以随便发布的英文和中文的语音合成引擎(TTS),和英文、中文、日文的语音识别引擎(SR)。
系统要求98以上版本。编译开发包中的例子程序需要vc6以上环境。
******下载说明******:
(1)如果要下载例子程序,说明文档,SAPI以及用于开发的美国英语语音引擎,需要下载SpeechSDK51.exe,大约68M。
(2)如果想要使用简体中文和日文的语音引擎,需要下载SpeechSDK51LangPack.exe。大约82M。
(3)如果想要和自己的软件一起发布语音引擎,需要下载SpeechSDK51MSM.exe,大约132M。
(在这个地址,我未能成功下载)。
(4)如果要获取XP下的 Mike 和 Mary 语音,下载Sp5TTIntXP.exe。大约3.5M。
(5)如果要获取开发包的文档说明,请下载sapi.chm。大约2.3M。这个在sdk51里面已经包含。
下载完毕后,首先安装SpeechSDK51.exe,然后安装中文语言补丁包SpeechSDK51LangPack,然后展开
msttss22l,自动将所需dll安装到系统目录。
三、配置vc环境
在vc6.0的环境下编译语音工程,首先要配置编译环境。假设sdk安装在d:\Microsoft Speech SDK5.1\路径下,打开工程设置对话框,在c/c++栏中选择Preprocessor分类,然后在"附加包含路径"中输入
d:\Microsoft Speech SDK 5.1\include
告诉vc编译程序所需的SAPI头文件的位置。
然后切换到LINK栏,在Input分类下的附加库路径中输入:
d:\Microsoft Speech SDK 5.1\lib\i386
使vc在链接的时候能够找到sapi.lib。
四、语音合成的应用。即使用SAPI实现TTS(Text to Speech)。
1、首先要初始化语音接口,一般有两种方式:
ISpVoice* pVoice;
::CoInitialize(NULL);
HRESULT hr =CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL,IID_ISpVoice,
(void **)&pVoice);
然后就可以使用这个指针调用SAPI函数了,例如
pVoice->SetVolume(50);//设置音量
pVoice->Speak(str.AllocSysString(),SPF_ASYNC,NULL);
另外也可以使用如下方式:
CComPtr<ISpVoice>m_cpVoice;
HRESULT hr = m_cpVoice.CoCreateInstance(CLSID_SpVoice );
在下面的例子中都用这个m_cpVoice变量。
CLSID_SpVoice的定义位于SPAI.H中。
2、获取/设置输出频率。
SAPI朗读文字的时候,可以采用多种频率方式输出声音,比如:
8kHz 8Bit Mono、8kHz 8BitStereo、44kHz 16Bit Mono、44kHz 16BitStereo等。在音调上有所差别。具体可以参考sapi.h。
可以使用如下代码获取当前的配置:
CComPtr<ISpStreamFormat>cpStream;
HRESULT hrOutputStream =m_cpVoice->GetOutputStream(&cpStream);
if (hrOutputStream ==S_OK)
{
CSpStreamFormat Fmt;
hr = Fmt.AssignFormat(cpStream);
if (SUCCEEDED(hr))
{
SPSTREAMFORMAT eFmt = Fmt.ComputeFormatEnum();
}
}
SPSTREAMFORMAT 是一个ENUM类型,定义位于SPAI.H中。每一个值对应了不同的频率设置。例如SPSF_8kHz8BitStereo = 5
通过如下代码设置当前朗读频率:
CComPtr<ISpAudio>m_cpOutAudio; //声音输出接口
SpCreateDefaultObjectFromCategoryId( SPCAT_AUDIOOUT,&m_cpOutAudio ); //创建接口
SPSTREAMFORMAT eFmt = 21; //SPSF_22kHz 8Bit Stereo
CSpStreamFormat Fmt;
Fmt.AssignFormat(eFmt);
if (m_cpOutAudio )
{
hr = m_cpOutAudio->SetFormat(Fmt.FormatId(), Fmt.WaveFormatExPtr() );
}
else hr = E_FAIL;
if(SUCCEEDED( hr ) )
{
m_cpVoice->SetOutput( m_cpOutAudio, FALSE );
}
3、获取/设置播放所用语音。
引擎中所用的语音数据文件一般保存在SpeechEngines下的spd或者vce文件中。安装sdk后,在注册表中保存了可用的语音,比如英文的男/女,简体中文的男音等。位置是:
HKEY_LOCAL_MACHINE\Software\Microsoft\Speech\Voices\Tokens
如果安装在中文操作系统下,则缺省所用的朗读语音是简体中文。SAPI的缺点是不能支持中英文混读,在朗读中文的时候,遇到英文,只能逐个字母读出。所以需要程序自己进行语音切换。
(1) 可以采用如下的函数把当前SDK支持的语音填充在一个组合框中:
// SAPI5helper function in sphelper.h
HWNDhWndCombo = GetDlgItem( hWnd, IDC_COMBO_VOICES ); //组合框句柄
HRESULT hr =SpInitTokenComboBox( hWndCombo , SPCAT_VOICES );
这个函数是通过IEnumSpObjectTokens接口枚举当前可用的语音接口,把接口的说明文字添加到组合框中,并且把接口的指针作为LPARAM
保存在组合框中。
一定要记住最后程序退出的时候,释放组合框中保存的接口:
SpDestroyTokenComboBox( hWndCombo );
这个函数的原理就是逐个取得combo里面每一项的LPARAM数据,转换成IUnknown接口指针,然后调用Release函数。
(2) 当组合框选择变化的时候,可以用下面的函数获取用户选择的语音:
ISpObjectToken* pToken = SpGetCurSelComboBoxToken( hWndCombo );
(3) 用下面的函数获取当前正在使用的语音:
CComPtr<ISpObjectToken>pOldToken;
HRESULT hr =m_cpVoice->GetVoice( &pOldToken);
(4) 当用户选择的语音和当前正在使用的不一致的时候,用下面的函数修改:
if(pOldToken != pToken)
{
// 首先结束当前的朗读,这个不是必须的。
HRESULT hr = m_cpVoice->Speak( NULL,SPF_PURGEBEFORESPEAK, 0);
if (SUCCEEDED (hr) )
{
hr = m_cpVoice->SetVoice( pToken );
}
}
(5) 也可以直接使用函数SpGetTokenFromId获取指定voice的Token指针,例如:
WCHAR pszTokenId[] =L"HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Speech\\Voices\\Tokens\\MSSimplifiedChineseVoice";
SpGetTokenFromId(pszTokenID , &pChineseToken);
4、开始/暂停/恢复/结束当前的朗读
要朗读的文字必须位于宽字符串中,假设位于szWTextString中,则:
开始朗读的代码:
hr =m_cpVoice->Speak( szWTextString, SPF_ASYNC |SPF_IS_NOT_XML, 0 );
如果要解读一个XML文本,用:
hr =m_cpVoice->Speak( szWTextString, SPF_ASYNC |SPF_IS_XML, 0 );
暂停的代码:m_cpVoice->Pause();
恢复的代码:m_cpVoice->Resume();
结束的代码:(上面的例子中已经给出了)
hr =m_cpVoice->Speak( NULL, SPF_PURGEBEFORESPEAK,0);
5、跳过部分朗读的文字
在朗读的过程中,可以跳过部分文字继续后面的朗读,代码如下:
ULONG ulGarbage = 0;
WCHAR szGarbage[] =L"Sentence";
hr =m_cpVoice->Skip( szGarbage, SkipNum,&ulGarbage );
SkipNum是设置要跳过的句子数量,值可以是正/负。
根据sdk的说明,目前SAPI仅仅支持SENTENCE这个类型。SAPI是通过标点符号来区分句子的。
6、播放WAV文件。SAPI可以播放WAV文件,这是通过ISpStream接口实现的:
CComPtr<ISpStream>cpWavStream;
WCHARszwWavFileName[NORM_SIZE] = L"";;
USES_CONVERSION;
wcscpy( szwWavFileName, T2W(szAFileName ) );//从ANSI将WAV文件的名字转换成宽字符串
//使用sphelper.h 提供的这个函数打开wav 文件,并得到一个 IStream 指针
hr = SPBindToFile(szwWavFileName, SPFM_OPEN_READONLY, &cpWavStream);
if( SUCCEEDED( hr ) )
{
m_cpVoice->SpeakStream( cpWavStream, SPF_ASYNC, NULL);//播放WAV文件
}
7、将朗读的结果保存到wav文件
TCHARszFileName[256];//假设这里面保存着目标文件的路径
USES_CONVERSION;
WCHARm_szWFileName[MAX_FILE_PATH];
wcscpy( m_szWFileName,T2W(szFileName) );//转换成宽字符串
//创建一个输出流,绑定到wav文件
CSpStreamFormatOriginalFmt;
CComPtr<ISpStream>cpWavStream;
CComPtr<ISpStreamFormat>cpOldStream;
HRESULT hr =m_cpVoice->GetOutputStream(&cpOldStream );
if (hr == S_OK) hr =OriginalFmt.AssignFormat(cpOldStream);
else hr =E_FAIL;
// 使用sphelper.h中提供的函数创建 wav文件
if (SUCCEEDED(hr))
{
hr = SPBindToFile( m_szWFileName, SPFM_CREATE_ALWAYS,&cpWavStream,
&OriginalFmt.FormatId(),OriginalFmt.WaveFormatExPtr() );
}
if( SUCCEEDED( hr ) )
{
//设置声音的输出到 wav 文件,而不是 speakers
m_cpVoice->SetOutput(cpWavStream, TRUE);
}
//开始朗读
m_cpVoice->Speak( szWTextString, SPF_ASYNC |SPF_IS_NOT_XML, 0 );
//等待朗读结束
m_cpVoice->WaitUntilDone( INFINITE );
cpWavStream.Release();
//把输出重新定位到原来的流
m_cpVoice->SetOutput( cpOldStream, FALSE );
8、设置朗读音量和速度
m_cpVoice->SetVolume((USHORT)hpos); //设置音量,范围是 0 -100
m_cpVoice->SetRate(hpos);//设置速度,范围是 -10 - 10
hpos的值一般位于
9、设置SAPI通知消息。SAPI在朗读的过程中,会给指定窗口发送消息,窗口收到消息后,可以主动获取SAPI的事件,
根据事件的不同,用户可以得到当前SAPI的一些信息,比如正在朗读的单词的位置,当前的朗读口型值(用于显
示动画口型,中文语音的情况下并不提供这个事件)等等。
要获取SAPI的通知,首先要注册一个消息:
m_cpVoice->SetNotifyWindowMessage( hWnd,WM_TTSAPPCUSTOMEVENT, 0, 0 );
这个代码一般是在主窗口初始化的时候调用,hWnd是主窗口(或者接收消息的窗口)句柄。WM_TTSAPPCUSTOMEVENT
是用户自定义消息。
在窗口响应WM_TTSAPPCUSTOMEVENT消息的函数中,通过如下代码获取sapi的通知事件:
CSpEventevent; // 使用这个类,比用 SPEVENT结构更方便
while(event.GetFrom(m_cpVoice) == S_OK )
{
switch( event.eEventId )
{
。。。
}
}
eEventID有很多种,比如SPEI_START_INPUT_STREAM表示开始朗读,SPEI_END_INPUT_STREAM表示朗读结束等。
可以根据需要进行判断使用。
四、结束语
SAPI的功能很多,比如语音识别、使用语法分析等,由于条件和精力有限,我未能一一尝试,感兴趣的朋友可以自己安装一个研究一下。
修正:
我发现原文中的下载地址已经失效了,我又重新找了一套:
speech sdk 5.1下载地址:
http://down8.zol.com.cn/c43eb2d32c57a17e2262833dedd92a7d/4b8fcd05/bianchenggongju/speechsdk51.exe
speech sdk 5.1 语言包下载地址:
http://heze.onlinedown.net/down/speechsdk51LangPack.exe
发表评论
-
拨打手机时提示空号的简单方法
2011-12-16 14:36 1793在不想被别人烦又不好意思关机时,让别人打你手机时提示空号 ... -
读完这7本书再投资
2011-12-13 22:52 1675一本好的投资书对 ... -
SWOT分析模型
2011-10-20 08:50 2323SWOT分析模型(SWOT Analysis) SWO ... -
职场经典故事
2011-03-24 18:01 1684(一) 一只乌鸦坐在 ... -
天涯精选语录300条,条条真理,字字珠玑
2011-03-24 17:54 21841,女人谨记:一定要吃好玩好喝好睡好,一旦 ... -
如何从Outlook"通讯簿"中删除幽灵"联系人文件夹"
2011-02-27 14:38 6214背景介绍: 在“联系人”栏目中创建新的文件夹后,会自 ... -
容易误解的英文
2011-02-25 00:34 1869sporting house 妓院(不是“体育室”) & ... -
什么才是软件开发的葵花宝典?(有点意思)
2011-01-31 09:35 1906中国人大都喜欢用武侠小说来比较软件开发,但是在实战武功中,只有 ... -
[分享]当你还不是领导的时候,怎么样做好一个下属?
2011-01-27 23:02 1900每一个人都不是天生的 ... -
【转】张飞眼中的真实三国-爆笑日记
2011-01-26 16:07 1900我写这个日记的时候 ... -
Word中嵌入Visio对象无法显示问题
2010-12-28 16:31 9367Word中嵌入Visio对象无法显示问题 - [软件技术 ] ... -
深度解析中国企业领导力的五根软肋
2010-12-21 01:34 1674http://www.enet.com.cn/cio/ ... -
EMT自律宣言
2010-10-27 13:06 2217EMT自律宣言 第196期(2008-02) 华 ... -
可以考虑授予“二奶们”集体三等功
2010-08-20 22:31 203作者:罗时汉 http://blog.sin ... -
轻松掌控Excel表头
2010-08-18 18:35 3009在Excel表格中,表头的应用非常普遍,所起的作用也很大。 ... -
保护视力健康的电脑屏幕设置
2010-08-18 16:18 4631习惯了自己设置的大字体中文系统,装了英文版的系统后,由于默 ... -
VoiceXML语音上网
2010-08-16 01:50 2411VoiceXML语音上网 朱 ... -
.Net平台下开发中文语音应用程序
2010-08-12 13:34 3033作者:陈本峰 来源: ... -
中国抗战殉国将领名录
2010-07-21 11:58 1872自1931年至1945年,中国 ... -
如何把excel表的电话薄导入G3中
2010-07-16 10:47 24221、用excel 表保存成 CSV格式 再导入 XP 通讯录 ...
相关推荐
《Windows语音编程初步》 Windows语音编程主要涉及两个关键技术,即语音识别(Speech Recognition)和语音合成(Speech Synthesis),这两者都需要语音引擎的支持。微软为此提供了一个名为Microsoft Speech API...
在本文中,我们将深入探讨如何在C#编程环境中实现基于Windows的免费语音识别技术。Windows操作系统内置了语音识别功能,开发者可以利用这个功能为应用程序添加语音输入和控制的能力。这不仅可以提升用户体验,还可以...
《Windows API开发详解:函数、接口、编程实例》颇具特色之处是将重点课程录制成了视频,配有全程语音讲解,还配有每讲的PPT课件,都收录在《Windows API开发详解:函数、接口、编程实例》所附光盘中,可作为读者学习...
在TCL编程初步中,我们将介绍TCL的基础知识、命令和结构,为读者提供系统学习TCL语言的入门指南。 第1章介绍了TCL基本知识。首先解释了什么是TCL,然后介绍了自学TCL语言的工具,例如在线教程、书籍和社区论坛。...
易语言是一种专为初学者设计的编程语言,它采用了直观的中文语法,使得编程更加简单易懂。...通过学习和实践这个例程,初学者不仅可以掌握易语言的基本编程技巧,还能对语音应用开发有初步的认识。
总结起来,这个"SoundTimerprg"整点语音报时工具的源代码是一份很好的学习材料,它涵盖了Delphi的基本编程元素,如组件、事件处理、时间操作,以及Windows API的使用。通过研究和理解这份代码,开发者不仅可以提升...
开发Windows Mobile应用的环境通常基于Visual Studio 2005,使用C#等编程语言,开发者可以利用丰富的API和SDK来创建定制化的应用程序。Windows Mobile平台的开放性允许用户自由安装和卸载应用,极大地扩展了设备的...
本文主要探讨如何利用C#编程语言结合Windows Presentation Foundation (WPF)框架与OPC技术实现对西门子PLC的数据读取与写入,并在此基础上进一步实现基于文本的语音报警功能。这种集成方案在工业自动化领域有着广泛...
国外在语音识别领域的研究历史悠久,IBM、微软等公司都有显著成果,如IBM的ViaVoice和微软Windows Vista的语音识别功能。目前,Nuance Communications公司的NaturallySpeaking是世界上最先进的语音识别软件之一,能...
VC_和Matlab混合编程的语音识别研究.pdf VC_实现Excel操作自动化的方法研究与应用.pdf VC_实现MSC_Patran二次开发的方法研究.pdf VC_平台下的虚拟仪器应用研究.pdf VC_环境下基于MapX控件的GIS应用软件的开发.pdf VC...
为了深入了解和使用这个程序,你需要对QT编程有一定的了解,熟悉C++语言,同时,对于语音识别和聊天机器人的工作原理也需要一定的认识。如果你想要修改或扩展程序,可能需要学习相关API文档,如QT的QAudioInput和...
综上所述,iFLYiatDemo是一个集成了高级语音技术的C++应用程序,专为Windows用户设计,它不仅能够实现实时语音转文字,还具备语音语义理解和自动文本修正功能,极大地提升了用户与机器之间的交互体验。
通过调用Windows API(应用程序编程接口),我们可以实现对录音机的控制,例如启动、停止、保存和播放录音。 2. **WAV音频格式**:在Windows中,录音机默认使用WAV格式保存音频文件,这是一种无损音频格式,保真度...
- 采集语音信号并进行初步处理。 - 分析语音信号的时域和频域特性。 - 实现系统初始化、等待、数据采集、报表生成等功能。 - 支持报表查看与退出操作。 #### 二、虚拟仪器与LabVIEW基础知识 ##### 2.1 虚拟仪器...
VC_和Matlab混合编程的语音识别研究.pdf VC_实现Excel操作自动化的方法研究与应用.pdf VC_实现MSC_Patran二次开发的方法研究.pdf VC_平台下的虚拟仪器应用研究.pdf VC_环境下基于MapX控件的GIS应用软件的开发.pdf VC...
2. 编程调试:使用Visual Studio进行代码编写和调试,可以利用内置的Kinect模拟器在无硬件的情况下进行初步测试。 3. 性能优化:处理大量传感器数据可能导致性能瓶颈,通过合理使用多线程和数据缓存策略可以提升...
VC_和Matlab混合编程的语音识别研究.pdf VC_实现Excel操作自动化的方法研究与应用.pdf VC_实现MSC_Patran二次开发的方法研究.pdf VC_平台下的虚拟仪器应用研究.pdf VC_环境下基于MapX控件的GIS应用软件的开发.pdf VC...
根据给定的信息,我们可以深入分析并提取出与局域网聊天软件源代码相关的知识点,特别是针对Windows编程环境下的开发要点。 ### 局域网聊天软件源代码知识点 #### 1. **初始化公共控件** - **背景**:在Windows...
在IT领域,编程语言C#的应用非常广泛,尤其是在Windows应用开发和游戏开发中。本教程将探讨如何使用C#来创建一个与图灵聊天机器人交互的程序,并实现语音播报功能。这不仅是一个有趣的项目,也对提升开发者的人工...
标签方面,“DELPHI”是一个流行的面向对象的编程语言和集成开发环境(IDE),用于创建Windows桌面应用程序。这意味着这个桌面宠物是用Delphi编写的,开发者可能利用了Delphi的组件和强大的事件驱动编程模型来构建...