微软TTS语音引擎(speech api sapi)深度开发入门
java实现微软文本转语音(TTS)经验总结
java实现微软⽂本转语⾳(TTS)经验总结⼀、使⽤背景公司项⽬之前⼀直是采⽤⼈⼯录⾳,然⽽上线⼀段时间之后发现,⼈⼯录⾳成本太⾼,⽽且每周上线的⾳频不多,⽼板发现问题后,甚⾄把⾳频功能裸停了⼀段时间。
直到最近项⽬要向海外扩展,需要内容做国际化,就想到了⽤机器翻译。
⽬前机翻已经相对成熟,做的好的国内有科⼤讯飞,国外有微软。
既然项⽬主要⾯对海外⽤户,就决定采⽤微软的TTS。
(PS:这⾥不是打⼴告,微软的TTS是真的不错,⾃⼰可以去官⽹试听下,虽然⽆法像⼈⼀样很有感情的朗读诗歌什么的,但是朗读新闻咨询类⽂章还是抑扬顿挫的。
)⼆、上代码使⽤背景已经啰嗦了⼀⼤堆,我觉得读者还是会关注的,但是我想作为资深CV码农,我想你们更关注还是如何应⽤,所以还是⽼规矩,简简单单的上代码。
(申请账号这些就不介绍了)1.依赖<dependency><groupId>com.microsoft.cognitiveservices.speech</groupId><artifactId>client-sdk</artifactId><version>1.12.1</version></dependency>2.配置常量public class TtsConst {/*** ⾳频合成类型(亲测这种效果最佳,其他的你⾃⼰去试试)*/public static final String AUDIO_24KHZ_48KBITRATE_MONO_MP3 = "audio-24khz-48kbitrate-mono-mp3";/*** 授权url*/public static final String ACCESS_TOKEN_URI = "https:///sts/v1.0/issuetoken";/*** api key*/public static final String API_KEY = "你⾃⼰的 api key";/*** 设置accessToken的过期时间为9分钟*/public static final Integer ACCESS_TOKEN_EXPIRE_TIME = 9 * 60;/*** 性别*/public static final String MALE = "Male";/*** tts服务url*/public static final String TTS_SERVICE_URI = "https:///cognitiveservices/v1";}3.https连接public class HttpsConnection {public static HttpsURLConnection getHttpsConnection(String connectingUrl) throws Exception {URL url = new URL(connectingUrl);return (HttpsURLConnection) url.openConnection();}}3.授权@Component@Slf4jpublic class Authentication {@Resourceprivate RedisCache redisCache;public String genAccessToken() {InputStream inSt;HttpsURLConnection webRequest;try {String accessToken = redisCache.get(RedisKey.KEY_TTS_ACCESS_TOKEN);if (StringUtils.isEmpty(accessToken)) {webRequest = HttpsConnection.getHttpsConnection(TtsConst.ACCESS_TOKEN_URI);webRequest.setDoInput(true);webRequest.setDoOutput(true);webRequest.setConnectTimeout(5000);webRequest.setReadTimeout(5000);webRequest.setRequestMethod("POST");byte[] bytes = new byte[0];webRequest.setRequestProperty("content-length", String.valueOf(bytes.length));webRequest.setRequestProperty("Ocp-Apim-Subscription-Key", TtsConst.API_KEY);webRequest.connect();DataOutputStream dop = new DataOutputStream(webRequest.getOutputStream());dop.write(bytes);dop.flush();dop.close();inSt = webRequest.getInputStream();InputStreamReader in = new InputStreamReader(inSt);BufferedReader bufferedReader = new BufferedReader(in);StringBuilder strBuffer = new StringBuilder();String line = null;while ((line = bufferedReader.readLine()) != null) {strBuffer.append(line);}bufferedReader.close();in.close();inSt.close();webRequest.disconnect();accessToken = strBuffer.toString();//设置accessToken的过期时间为9分钟redisCache.set(RedisKey.KEY_TTS_ACCESS_TOKEN, accessToken, TtsConst.ACCESS_TOKEN_EXPIRE_TIME); ("New tts access token {}", accessToken);}return accessToken;} catch (Exception e) {log.error("Generate tts access token failed {}", e.getMessage());}return null;}}4.字节数组处理public class ByteArray {private byte[] data;private int length;public ByteArray(){length = 0;data = new byte[length];}public ByteArray(byte[] ba){data = ba;length = ba.length;}/**合并数组*/public void cat(byte[] second, int offset, int length){if(this.length + length > data.length) {int allocatedLength = Math.max(data.length, length);byte[] allocated = new byte[allocatedLength << 1];System.arraycopy(data, 0, allocated, 0, this.length);System.arraycopy(second, offset, allocated, this.length, length);data = allocated;}else {System.arraycopy(second, offset, data, this.length, length);}this.length += length;}public void cat(byte[] second){cat(second, 0, second.length);}public byte[] getArray(){if(length == data.length){return data;}byte[] ba = new byte[length];System.arraycopy(data, 0, ba, 0, this.length);data = ba;return ba;}public int getLength(){return length;}}5.创建SSML⽂件@Slf4jpublic class XmlDom {public static String createDom(String locale, String genderName, String voiceName, String textToSynthesize){ Document doc = null;Element speak, voice;try {DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder builder = dbf.newDocumentBuilder();doc = builder.newDocument();if (doc != null){speak = doc.createElement("speak");speak.setAttribute("version", "1.0");speak.setAttribute("xml:lang", "en-us");voice = doc.createElement("voice");voice.setAttribute("xml:lang", locale);voice.setAttribute("xml:gender", genderName);voice.setAttribute("name", voiceName);voice.appendChild(doc.createTextNode(textToSynthesize));speak.appendChild(voice);doc.appendChild(speak);}} catch (ParserConfigurationException e) {log.error("Create ssml document failed: {}",e.getMessage());return null;}return transformDom(doc);}private static String transformDom(Document doc){StringWriter writer = new StringWriter();try {TransformerFactory tf = TransformerFactory.newInstance();Transformer transformer;transformer = tf.newTransformer();transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");transformer.transform(new DOMSource(doc), new StreamResult(writer));} catch (TransformerException e) {log.error("Transform ssml document failed: {}",e.getMessage());return null;}return writer.getBuffer().toString().replaceAll("\n|\r", "");}}6.正主来了!TTS服务@Slf4j@Componentpublic class TtsService {@Resourceprivate Authentication authentication;/*** 合成⾳频*/public byte[] genAudioBytes(String textToSynthesize, String locale, String gender, String voiceName) {String accessToken = authentication.genAccessToken();if (StringUtils.isEmpty(accessToken)) {return new byte[0];}try {HttpsURLConnection webRequest = HttpsConnection.getHttpsConnection(TtsConst.TTS_SERVICE_URI);webRequest.setDoInput(true);webRequest.setDoOutput(true);webRequest.setConnectTimeout(5000);webRequest.setReadTimeout(300000);webRequest.setRequestMethod("POST");webRequest.setRequestProperty("Content-Type", "application/ssml+xml");webRequest.setRequestProperty("X-Microsoft-OutputFormat", TtsConst.AUDIO_24KHZ_48KBITRATE_MONO_MP3);webRequest.setRequestProperty("Authorization", "Bearer " + accessToken);webRequest.setRequestProperty("X-Search-AppId", "07D3234E49CE426DAA29772419F436CC");webRequest.setRequestProperty("X-Search-ClientID", "1ECFAE91408841A480F00935DC390962");webRequest.setRequestProperty("User-Agent", "TTSAndroid");webRequest.setRequestProperty("Accept", "*/*");String body = XmlDom.createDom(locale, gender, voiceName, textToSynthesize);if (StringUtils.isEmpty(body)) {return new byte[0];}byte[] bytes = body.getBytes();webRequest.setRequestProperty("content-length", String.valueOf(bytes.length));webRequest.connect();DataOutputStream dop = new DataOutputStream(webRequest.getOutputStream());dop.write(bytes);dop.flush();dop.close();InputStream inSt = webRequest.getInputStream();ByteArray ba = new ByteArray();int rn2 = 0;int bufferLength = 4096;byte[] buf2 = new byte[bufferLength];while ((rn2 = inSt.read(buf2, 0, bufferLength)) > 0) {ba.cat(buf2, 0, rn2);}inSt.close();webRequest.disconnect();return ba.getArray();} catch (Exception e) {log.error("Synthesis tts speech failed {}", e.getMessage());}return null;}}由于项⽬中需要将⾳频上传到OSS,所以这⾥⽣成的是字节码⽂件,你也可以选择下载或保存⾳频⽂件。
VC++基于微软语音引擎开发语音识别总结
关于SAPI的简介API 概述SAPI API在一个应用程序和语音引擎之间提供一个高级别的接口。
SAPI 实现了所有必需的对各种语音引擎的实时的控制和管理等低级别的细节。
SAPI引擎的两个基本类型是文本语音转换系统(TTS)和语音识别系统。
TTS系统使用合成语音合成文本字符串和文件到声音音频流。
语音识别技术转换人类的声音语音流到可读的文本字符串或者文件。
文本语音转换API应用程序能通过IspVoice的对象组建模型(COM)接口控制文本语音转换。
一旦一个应用程序有一个已建立的IspVoice对象(见Text-to-Speech指南),这个应用程序就只需要调用ISpVoice::Speak 就可以从文本数据得到发音。
另外,ISpVoice接口也提供一些方法来改变声音和合成属性,如语速ISpVoice::SetRate,输出音量ISpVoice::SetVolume,改变当前讲话的声音ISpVoice::SetVoice 等。
特定的SAPI控制器也可以嵌入输入文本使用来实时的改变语音合成器的属性,如声音,音调,强调字,语速和音量。
这些合成标记在sapi.xsd中,使用标准的XML格式,这是一个简单但很强大定制TTS语音的方法,不依赖于特定的引擎和当前使用的声音。
ISpVoice::Speak方法能够用于同步的(当完全的完成朗读后才返回)或异步的(立即返回,朗读在后台处理)操作。
当同步朗读(SPF_ASYNC)时,实时的状态信息如朗读状态和当前文本位置可以通过ISpVoice::GetStatus得到。
当异步朗读时,可以打断当前的朗读输出以朗读一个新文本或者把新文本自动附加在当前朗读输出的文本的末尾。
除了ISpVoice接口之外SAPI也为高级TTS应用程序提供许多有用的COM接口。
事件SAPI用标准的回调机制(Window消息, 回调函数or Win32 事件)来发送事件来和应用程序通信。
对于TTS,事件大多用于同步地输出语音。
TTS开发步骤_基于图形界面
事件驱动的文本语音转换(TTS)实例介绍一个基本的文字转语音的例子,应用程序使用图形界面(非控制台应用程序)建立项目首先,创建一个新的windows 32平台应用程序项目,在向导中,选择一个典型的“Hello world!”应用。
由此产生的项目代码比命令行版本的长,且大多数新的复杂代码与sapi关系不大,但是是实现图形界面所必须的代码。
设置sapi的路径与SAPI相关的文件路径必须在项目中声明。
以下是设置“sapi.h”路径的步骤:1,在菜单上,选择工具“Tools”,然后单击选项“Options”。
2,单击“Directories”选项卡。
3,选择“Include Files”下拉式选单4,单击最后一行闲置在路径清单,并输入“sapi.h”的文件路径:“C:/ProgramFiles/Microsoft Speech SDK 5.1/Include”5,选择“Library Files”下拉式选单,并输入“sapi.lib”的文件路径:“C:/ProgramFiles/Microsoft Speech SDK 5.1/Lib/i386”。
最后单击确定。
创建“Speak”菜单命令为了使应用程序响应我们发出“Speak”命令,并且发出声音,需要对自动生成的菜单项做一些修改。
读者可以通过VC6.0的资源管理器,在“File”菜单下面,增加一个“Speak”命令项,并且将该命令项的资源ID设置为“IDM_SPEAK”。
后文再讲述如何处理这个命令事件的代码。
现在先来编译和运行这个应用程序,确保以上的设置准确无误。
程序除了在屏幕上面显示“Hello world”之外,其它什么事情也没做,但是它确实可以运行起来了。
使用这个实例第1步:初始化com第2步:设置声音第3步:讲!第4步:设置感兴趣的事件第5步:确定事件类型第6步:响应事件第1步:初始化com用一个winmain中的程序段说明。
唯一的限制是在使用任何sapi的特定代码前com必须是初始化完成了,并且在运行sapi过程中,COM一直都是活动的。
winXP控制面板TTS语音打不开卡顿-SDK开发无法播放中文解决方法-MFC调用代码
winXP控制⾯板TTS语⾳打不开卡顿-SDK开发⽆法播放中⽂解决⽅法-MFC调⽤代码winXP控制⾯板TTS语⾳打不开卡顿解决⽅法下载安装:1.安装Microsoft Speech SDK 5.1.msi2. 安装Microsoft Speech SDK 5.1 Language Pack.msi打开“C:\Windows\Inf”,右键单击⽂件“sapi5.inf#include "StdAfx.h"#include "Class_PlayAudio.h"Class_PlayAudio::Class_PlayAudio(void){}Class_PlayAudio::~Class_PlayAudio(void){}void Class_PlayAudio::ReadAudioConfig(){char szReadText[100];try{GetPrivateProfileStringA("Config", "RepeatTimes", "admin", szReadText, sizeof(szReadText), "./AudioConfig.ini");PlayAudio_RepeatTimes= _bstr_t(szReadText).operator TCHAR *();GetPrivateProfileStringA("Config", "PlayInterval", "admin", szReadText, sizeof(szReadText), "./AudioConfig.ini");PlayAudio_PlayInterval= _bstr_t(szReadText).operator TCHAR *();GetPrivateProfileStringA("Config", "PlayContent", "admin", szReadText, sizeof(szReadText), "./AudioConfig.ini");PlayAudio_PlayContent= _bstr_t(szReadText).operator TCHAR *();}catch(CFileException ex){MessageBox(L"读取⽂件失败");}}void Class_PlayAudio::MSSSpeak(LPCTSTR speakContent)// speakContent为LPCTSTR型的字符串,调⽤此函数即可将⽂字转为语⾳{ISpVoice *pVoice = NULL;//初始化COM接⼝if (FAILED(::CoInitialize(NULL)))//MessageBox(NULL, (LPCWSTR)L"COM接⼝初始化失败!",(LPCWSTR)L"提⽰", MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);MessageBox(L"COM初始化失败");//获取SpVoice接⼝HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&pVoice);ISpObjectToken * pSpObjectToken = NULL;if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804", NULL, &pSpObjectToken)))//804代表中⽂//if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=409", NULL, &pSpObjectToken)))//804代表中⽂//if (SUCCEEDED(hr)){pVoice->SetVolume((USHORT)100); //设置⾳量,范围是 0 -100 pVoice->SetRate(0); //设置速度,范围是 -10 - 10hr = pVoice->Speak(speakContent, 0, NULL);pVoice->Release();pVoice = NULL;}//释放com资源::CoUninitialize();}//void Class_PlayAudio::OnBnClickedButton1()//{//// TODO: 在此添加控件通知处理程序代码////MSSSpeak(L"⼤家好");// MSSSpeak(L"nice⼤家好");////}。
SAPI介绍功能详解
SAPI介绍功能详解简介SAPI〔Speech API〕是一种应用程序接口,用于在计算机上实现语音识别和语音合成功能。
它能够让开发者通过编程的方式与语音技术进行交互,从而创立各种语音相关的应用程序。
功能语音识别SAPI提供了强大的语音识别功能,可以将人类的语音转换为文本。
这对于开发需要接收和理解用户语音输入的应用程序非常有用。
通过使用SAPI,开发者可以简单地实现语音识别功能,而无需从头开始编写自己的语音识别引擎。
SAPI的语音识别功能支持多种语言,包括英语、中文、西班牙语等。
它还具备良好的鲁棒性,可以在不同的语音环境下进行准确的语音识别。
语音合成SAPI还提供了语音合成功能,可以将文本转换为模拟人类声音的语音输出。
这对于开发需要向用户提供语音反响的应用程序非常有用。
通过使用SAPI,开发者可以轻松地将文本转换为语音,并控制语音的音调、语速等参数。
SAPI的语音合成功能支持多种语言,可以根据需要选择不同的语音合成引擎。
开发者可以通过编程的方式指定所需的语音合成引擎,并调整合成参数以实现更加自然和逼真的语音效果。
SAPI还支持语音命令功能,可以通过语音输入来执行特定的操作。
开发者可以通过定义特定的语音命令和对应的操作,实现语音控制应用程序的功能。
这对于需要允许用户通过语音进行交互的应用程序非常有用。
SAPI的语音命令功能可以根据开发者的需求进行定制,如定义特定的关键词、短语或关键字以触发特定的操作。
同时,开发者还可以使用SAPI提供的语音识别功能识别用户的语音输入,并将其与语音命令进行匹配,从而实现语音控制的应用程序。
使用场景SAPI提供的语音识别、语音合成和语音命令功能可应用于多个场景。
SAPI的语音识别功能可以用于构建辅助技术应用程序,帮助视力受损或身体受限的用户进行语音输入。
通过语音识别,用户可以通过语音命令控制计算机并执行各种操作,如发送电子邮件、浏览网页等。
语音交互SAPI的语音识别和语音合成功能可以用于构建语音交互应用程序,提供更加自然和便捷的用户体验。
SAPI培训教材1228
SAPI培训教材12281. 简介本文档是关于SAPI〔Speech Application Programming Interface〕培训的教材。
SAPI是微软开发的一套语音应用程序接口,它允许开发人员在他们的应用程序中集成语音识别、文本到语音转换和语音合成功能。
在本教材中,我们将介绍SAPI的根本概念、使用方法、核心功能以及代码例如。
通过学习本教材,您将能够了解如何使用SAPI开发出具有语音交互功能的应用程序。
2. SAPI概述2.1 SAPI的定义SAPI是Speech Application Programming Interface的缩写,它是一种软件开发接口,用于开发语音应用程序。
SAPI提供了一系列的函数和接口,使开发人员能够在应用程序中集成语音识别、文本到语音转换和语音合成功能。
2.2 SAPI的主要组成局部SAPI由以下几个主要组成局部构成:•语音识别〔Speech Recognition〕:能够将语音转换为文本的功能。
开发人员可以通过SAPI实现语音命令和语音输入功能。
•文本到语音转换〔Text-to-Speech〕:能够将文本转换为语音的功能。
开发人员可以通过SAPI实现文字转语音的功能,使应用程序能够播放语音信息。
•语音合成〔Speech Synthesis〕:能够生成自然语音的功能。
开发人员可以通过SAPI实现语音合成,使应用程序能够根据需要生成语音。
2.3 SAPI的应用领域SAPI可以应用于许多领域,例如:•语音助手〔Voice Assistant〕:通过语音输入和语音命令,帮助用户完成各种任务,如日程管理、天气查询等。
•智能客服〔Intelligent Customer Service〕:通过语音识别来实现自动语音导航和客户问题自动处理。
•语音交互应用〔Speech Interaction Applications〕:通过语音识别、语音合成和文本到语音转换来实现与用户的自然交互。
SAPI功能详解
SAPI功能详解SAPI(Speech Application Programming Interface)是一种用于语音识别和语音合成的编程接口。
它提供了一组功能丰富的方法和属性,使开发人员能够轻松地在应用程序中集成语音识别和合成功能。
本文将详细介绍SAPI的功能和用法。
1. SAPI概述SAPI是一种用于语音识别和语音合成的标准编程接口。
它由一组COM (Component Object Model) 接口组成,使开发人员能够在应用程序中使用语音技术。
SAPI能够识别语音并将其转化为文本,也可以将文本转化为语音。
它提供了一些基本的语音识别和合成功能,同时也支持更高级的功能,如语音指令响应和多语言支持。
2. SAPI的基本功能2.1 语音识别通过SAPI,开发人员可以将语音输入转化为文本。
SAPI提供了一组识别引擎,可以根据需要选择合适的引擎进行语音识别。
开发人员可以使用SAPI接口中的方法来控制识别过程,如指定语音输入的格式、设定识别引擎的参数等。
识别结果可以获取为文本,并可以进行进一步处理。
2.2 语音合成SAPI还提供了语音合成的功能,开发人员可以将文本转化为语音输出。
通过SAPI的接口,开发人员可以选择语音合成引擎、设置输出的音频格式和音质等。
合成的结果可以保存为音频文件或直接输出到音频设备。
2.3 语音指令响应除了基本的语音识别和合成功能外,SAPI还支持语音指令响应。
开发人员可以通过定义一组语音指令,并使用SAPI接口来进行语音指令的识别。
当识别到某个特定的指令时,可以触发相应的动作或逻辑。
2.4 多语言支持SAPI支持多种语言的语音识别和语音合成。
通过SAPI接口,开发人员可以选择不同的语言和语音引擎,来适应不同的应用场景和用户需求。
同时,SAPI还提供了文本翻译和语音翻译的功能,使得开发人员可以更轻松地实现多语言交互。
3. SAPI的用法示例下面是一个简单的示例,展示了如何使用SAPI进行语音识别和语音合成:```python import win32com.client创建SAPI语音对象sp_voice = win32com.client.Dispatch(。
Speech API使用方法
Speech API使用方法微软语音识别分两种模式:文本识别模式和命令识别模式.此两种模式的主要区别,主要在于识别过程中使用的匹配字典不同.前者使用的是通用字典,特点是内容多,覆盖的词汇量大,字典由sdk提供.适用于没有预定目标的随机听写之类的应用.同时因为词汇量大直接导致识别的精度降低,识别速度较慢.后者的字典需要开发者自己编写,就是你们所说的xml文件.xml文件作为一种数据存储的方式,有一定的格式,定义了sdk需要确定的一些标签,和用以匹配的词汇.这种方式由开发者定义词汇的数量,大大降低匹配过程中需要检索的词汇量,提高了识别速度.同时因为侯选项极少,所以一般不会识别错误.其缺点也是明显的:词汇量小,只有预先输入字典的词汇可以被识别出来,所以一般用来作为常用命令的识别,方便用户操作,代替菜单命令等.利用微软Speech SDK 5.1在MFC中进行语音识别开发时的主要步骤,以Speech API 5.1+VC6为例:1、初始化COM端口一般在CWinApp的子类中,调用CoInitializeEx函数进行COM初始化,代码如下:::CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); // 初始化COM注意:调用这个函数时,要在工程设置(project settings)->C/C++标签,Category中选Preprocessor,在Preprocessor definitions:下的文本框中加上“,_WIN32_DCOM”。
否则编译不能通过。
2、创建识别引擎微软Speech SDK 5.1 支持两种模式的:共享(Share)和独享(InProc)。
一般情况下可以使用共享型,大的服务型程序使用InProc。
如下:hr = m_cpRecognizer.CoCreateInstance(CLSID_SpSharedRecognizer);//Sharehr = m_cpRecognizer.CoCreateInstance(CLSID_SpInprocRecognizer);// InProc如果是Share型,可直接进到步骤3;如果是InProc型,必须使用ISpRecognizer::SetInput 设置语音输入。
VC实现TTS文字语音朗读MicrosoftSpeechSDK
VC实现TTS文字语音朗读MicrosoftSpeechSDK一. TTS概述随着语音技术的发展,微软也推出了相应的语音开发工具,即Microsoft Speech SDK,这个SDK中包含了语音应用设计接口(SAPI)、微软的连续语音识别引擎(MCSR)以及微软的语音合成(TTS)引擎等等。
它其中的 TTS(text-to-speech)引擎可以用于实现语音合成,我们通过TTS引擎可以分析文本内容并且将其朗读出。
实现TTS技术的方法有很多种,现在主要采用三种:连词技术、语音合成技术、子字连接技术。
目前的5.1版本的SDK一共可以支持3种语言的识别 (英语,汉语和日语)以及2种语言的合成(英语和汉语)。
其中还包括对于低层控制和高度适应性的直接语音管理、训练向导、事件、语法编译、资源、语音识别(SR)管理以及TTS管理等强大的设计接口。
二. 实现原理以下是SpeechAPI的总体结构:从图中我们可以看出语音引擎则通过DDI层(设备驱动接口)和SAPI(SpeechAPI)进行交互,应用程序通过API层和SAPI通信。
通过使用这些API,用户可以快速开发在语音识别或语音合成方面应用程序。
应用程序使用ISpVoice接口来控制TTS,通过调用其中的Speak 方法可以朗读出文本内容,通过调用SetVoice / GetVoice方法(在.NET中已经转变成Voice属性)来获取或设置朗读的语音,而通过调用GetVolume / SetVolume、GetRate / SetRate等方法(在.NET中已经转变成Volume和Rate属性)来获取或设置朗读的音量和语速。
功能强大之处在于TTS能识别XML标记,通过给文本加上XML 标记,我们让TTS朗读出更加符合语言阅读习惯的句子。
例如:l 用于设置文本朗读的音量;l 、分别用于设置文本朗读的绝对速度和相对速度;l 、分别用于设置文本朗读的绝对语调和相对语调;l 在他们之间的句子被视为强调;l 可以将单词逐个字母的拼写出来;l 表示停止发声,并保持500微秒;l 02/03/07 可以按要求朗读出日期l 用于设置朗读所用的语言,其中409表示使用英语,804表示使用汉语,而411表示日语。
微软Windows+Speech+SDK编程入门
微软Windows Speech SDK编程入门2009-02-24 13:33一、SAPI简介软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis)。
这两个技术都需要语音引擎的支持。
微软推出的应用编程接口API,虽然现在不是业界标准,但是应用比较广泛。
SAPI全称 The Microsoft Speech API.相关的SR和SS引擎位于Speech SDK开发包中。
这个语音引擎支持多种语言的识别和朗读,包括英文、中文、日文等。
SAPI包括以下组件对象(接口):(1)Voice Commands API。
对应用程序进行控制,一般用于语音识别系统中。
识别某个命令后,会调用相关接口是应用程序完成对应的功能。
如果程序想实现语音控制,必须使用此组对象。
(2)Voice Dictation API。
听写输入,即语音识别接口。
(3)Voice Text API。
完成从文字到语音的转换,即语音合成。
(4)Voice Telephone API。
语音识别和语音合成综合运用到电话系统之上,利用此接口可以建立一个电话应答系统,甚至可以通过电话控制计算机。
(5)Audio Objects API。
封装了计算机发音系统。
SAPI是架构在COM基础上的,微软还提供了ActiveX控件,所以不仅可用于一般的windows程序,还可以用于网页、VBA甚至EXCEL的图表中。
如果对COM感到陌生,还可以使用微软的C++ WRAPPERS,它用C++类封装了语音SDK COM对象。
二、安装SAPI SDK。
首先从这个站点下载开发包:/speech/download/sdk51Microsoft Speech SDK 5.1添加了Automation支持。
所以可以在VB,ECMAScript 等支持Automation的语言中使用。
版本说明:Version: 5.1发布日期: 8/8/2001语音: English下载尺寸: 2.0 MB - 288.8 MB这个SDK开发包还包括了可以随便发布的英文和中文的语音合成引擎(TTS),和英文、中文、日文的语音识别引擎(SR)。
微软TTS语音引擎(speechapisapi)深度开发入门
微软TTS语音引擎(speechapisapi)深度开发入门Windows TTS开发介绍开篇介绍:我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的Windows的TTS(Text T o Speech)语音引擎。
它包含在Windows Speech SDK开发包中。
我们也可以使用此开发包根据自己的需要开发程序。
鸡啄米下面对TTS功能的软件开发过程进行详细介绍。
一.SAPI SDK的介绍SAPI,全称是The Microsoft Speech API。
就是微软的语音API。
由Windows Speech SDK提供。
Windows Speech SDK包含语音识别SR引擎和语音合成SS引擎两种语音引擎。
语音识别引擎用于识别语音命令,调用接口完成某个功能,实现语音控制。
语音合成引擎用于将文字转换成语音输出。
SAPI包括以下几类接口:Voice Commands API、Voice Dictation API、Voice Text API、Voice Telephone API和Audio Objects API。
我们要实现语音合成需要的是Voice Text API。
目前最常用的Windows Speech SDK版本有三种:5.1、5.3和5.4。
Windows Speech SDK 5.1版本支持xp系统和server 2003系统,需要下载安装。
XP系统默认只带了个Microsoft Sam英文男声语音库,想要中文引擎就需要安装Windows Speech SDK 5.1。
Windows Speech SDK 5.3版本支持Vista系统和Server 2008系统,已经集成到系统里。
Vista和Server 2003默认带Microsoft lili 中文女声语音库和Microsoft Anna英文女声语音库。
Windows Speech SDK 5.4版本支持Windows7系统,也已经集成到系统里,不需要下载安装。
Microsoft Speech SDK概述
Microsoft Speech SDK提供关于语音(Speech)处理的一套应用程序编程接口SAPI(Speech Application Programming Interface)。
SAPI提供了实现文字-语音转换(Text-to-Speech)和语音识别(Speech Recognition)程序的基本函数,大大简化了语音编程的难度,降低了语音编程的工作量。
Speech SDK可以免费从如下网址下载:/speech。
由于Speech SDK是以COM接口的方式提供服务的,所以首先介绍COM的有关基础知识。
11.1.1 COM基础Speech SDK提供了完善的COM接口,所以具备一定的COM编程基础对进行Speech SDK 编程来说是非常必要的。
笔者将简要介绍COM编程的基础知识。
虽然这些知识对阅读本书来说是足够了,但是如果你没有进行过任何的COM编程实践,笔者还是建议你先阅读一本COM的教科书。
1.什么是COM组件对象模型(Component Object Model,COM)对象是符合COM规范的可重用的软件组件。
符合COM规范的COM对象相互之间可以很好地工作,并且可以很容易地集成到应用程序中。
从应用的观点来看,一个COM对象就是一个黑箱,应用程序可以使用它来创建一项或多项任务。
COM对象常常用动态链接库(Dynamic Link Libraries,DLLs)的形式来实现。
与传统的DLL 一样,COM对象暴露其方法,应用程序能调用这些方法来实现对象所支持的功能。
应用程序与COM对象的关系就像应用程序与C++对象的关系,但其中也存在一些区别。
1)COM对象执行严格的封装。
你不能简单地创建一个对象就调用其中的公用方法。
COM 对象的公用方法聚合为一个或多个接口。
为了使用一个方法,必须先创建一个对象,并从对象中获得相应的接口。
一个接口一般包含一组方法,通过它们能使用对象的特定功能。
不能通过接口来调用不属于该接口的方法。
TTS(windows语音初步)
软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis)。这两个技术都需要语音引擎的支持。微软推出的应用编程接口API,虽然现在不是业界标准,但是应用比较广泛。
短短20几行代码就实现了文本语音转换,够神奇吧。SDK提供的SAPI是基于COM封装的,无论你是否熟悉COM,只要按部就班地用CoInitialize(), CoCreateInstance()获取IspVoice接口就够了,需要注意的是初始化COM后,程序结束前一定要用CoUninitialize()释放资源。
二、安装SAPI SDK。
首先从这个站点下载开发包:/downloads/details.aspx?FamilyID=5e86ec97-40a7-453f-b0ee-6583171b4530&DisplayLang=en
下载整个SDK5.1(如果不能下,可能地址改变了,也只要去掉一些后搜SDK就行了)
然后就可以使用这个指针调用SAPI函数了,例如
pVoice->SetVolume(50);//设置音量
pVoice->Speak(str.AllocSysString(),SPF_ASYNC,NULL);
另外也可以使用如下方式:
CComPtr<ISpVoice> m_cpVoice;
(2)如果想要使用简体中文和日文的语音引擎,需要下载SpeechSDK51LangPack.exe。大约82M。
(3)如果想要和自己的软件一起发布语音引擎,需要下载SpeechSDK51MSM.exe,大约132M。
VC++开发基于Microsoft Speech SDK的TTS软件
3 软 件 设 计
软 件实 现 的功 能 :一 是将 文 本转 换 为语 音进 行 播放 ,二是 将 文本转 换 为语 音保 存为 WA V 文件 。软 件运 行界 面如 图 1 所示 。
S p e e c h S D K提 供 一 套 关 于 语 音 处 理 的应 用 程 序 编 程 接 1 : 3 S A P I ( S p e e c h A p p l i c a t i o n P r o g r a m m i n g I n t e r f a c e ) ,S A P I 提 供 了 开 发 文 语 转换 ( T e x t - t o — S p e e c h )程 序 和语 音 识 别 ( S p e e c h R e c o g n i t i o n ) 程 序 的基 本 函数 ,大 大 简化 语 音 编程 的难 度 ,降低 语 音编 程 的工
摘 要 :基 于 Mi c r o s o f t S p e e c h S DK提 供 的 S A P I 函数 ,用 VC+ + 编 写 文语 转换 程 序 ,给 出 了实现 代 码 ,完成 文 本 朗读 和语 音保 存 为 W A V 文件 功能 。 关键 词 :T T S软 件 ;S A P I 函数 ;I S p V o i c e 接 口;语 音库
的过程 ,这 个过 音
素 ,并 对 文 本 中的数 字 、货 币单 位 、单 词变 形 以及 标 点 等需 要 特
殊 处 理 的符 号 进 行 分 析 ,将 音 素 生 成 数 字 音 频 ,然 后 用 扬 声 器
播 放 出 来 或 者 保 存 为 声 音 文 件 用 音 频 播 放 器 播 放 。 Mi c r o s o f t
微软语音引擎TTS最基本使用
微软语⾳引擎TTS最基本使⽤TTS(TextToSpeak)需求:需要借助程序实现⽂字合成语⾳/语⾳识别。
TTS 介绍就不说了,这⾥介绍⾮常详细 >>> + (微软的TTS语⾳合成和识别接⼝,可在程序中直接调⽤)下⾯介绍⼀下,怎么来使⽤它1. 下载安装TTS引擎到微软的官⽅⽹站上去下载⼀下下载地址>>>微软官⽅ TTS进⼊下载页⾯,可以先点击Details 看⼀下下详细信息,点击Download下载完成后,安装 SDK51 和 SDK51LangPack 。
2. 可以在程序⾥⽤了(使⽤前先引⼊⼀下 sapi.lib 库)头⽂件:1 #include <sapi.h>2 #include <sphelper.h>3#pragma comment(lib, "sapi.lib")//TTS引擎函数:1//封装SAPI 功能:传⼊字符串,合成语⾳并读出。
2void Speak(CString str)3{4 ISpVoice * pVoice = NULL;5//获取ISpVoice接⼝:6 HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); 7if(SUCCEEDED(hr)) //如果创建成功8 {9 pVoice->SetVolume(100);//设置⾳量10 pVoice->SetRate(0);//[-10, 10]11 hr = pVoice->Speak(CStringToBSTR(str), 0, NULL); //读出1213 pVoice->Release(); //释放token14 pVoice = NULL;15 }16 }上⾯函数是在MFC 中使⽤ TTS 的实例。
VFB_微软TTS语音引擎ISpVoice调用例题
VFB_微软TTS语音引擎ISpVoice调用例题'全局#include Once "Afx/AfxSapi.bi"'Const MSG_SAPI_EVENT = WM_USER + 1 ' --> change meSub Form1_Command1_BN_Clicked(hWndForm As hWnd, h WndControl As hWnd) '单击Dim Shared SpVoice As Afx_ISpVoice Ptr 'Ptr:指针类型修饰符'初始SpVoice = AfxNewCom("SAPI.SpVoice")If SpVoice Then'// 将感兴趣的对象设置为单词边界SpVoice- > SetInterest(SPFEI(SPEI_WORD_BOUNDARY), SPFEI(SPEI_WORD_ BOUNDARY))'// 设置将接收MSG_SAPI_EVENT消息的窗口的句柄SpVoice- > SetNotifyWindowMessage(hWndForm, WM_USER, 0, 0) ElseAfxMsg "你的电脑里没有安装微软TTS语音引擎"End If'播放'Dim cws As CWStr = FF_Control_GetT ext(Text1.hWnd) '( HWND_FORM1_TEXT1) '同下Dim cws As String = Text1.Text'操作符 ->(指向成员访问的指针)通过指向该对象的指针返回对对象成员的引用。
'例如, "p ->member "'等价于 "x .member ",'如果x 是用户定义类型的对象,p 是指向相同类型对象的指针。
文本语音转换入门
内容简介文本语音(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 forText-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几行代码就实现了文本语音转换,够神奇吧。
SAPI培训教材V110
SAPI培训教材V110介绍本文档是针对SAPI〔Speech Application Programming Interface〕的培训教材,旨在帮助开发人员掌握SAPI的根本概念、功能和使用方法。
本教材适用于初学者和有一定开发经验的人员,通过阅读本文档,您将了解SAPI的原理、使用场景以及如何在应用程序中集成SAPI。
目录1.SAPI简介2.SAPI的工作原理3.SAPI的使用场景4.集成SAPI到应用程序中的步骤5.例如代码6.常见问题解答7.参考资料1. SAPI简介SAPI是一组面向语音识别和语音合成的API〔应用程序编程接口〕。
它是由微软开发的,在Windows操作系统上广泛使用。
SAPI提供了一种标准的方式,让应用程序可以与语音识别和合成引擎进行交互。
2. SAPI的工作原理SAPI的工作原理可以概括为以下几个步骤:•初始化:应用程序初始化SAPI,并设置要使用的语音识别和合成引擎。
•配置:配置识别和合成参数,例如语言模型、发音和音量等。
•语音输入:应用程序接收用户的语音输入,通过SAPI将其发送给语音识别引擎进行识别。
•识别结果处理:应用程序接收语音识别引擎返回的识别结果,并根据需要进行后续处理。
•语音输出:应用程序通过SAPI将需要合成的文本发送给语音合成引擎,生成相应的语音输出。
•播放语音:应用程序接收到合成的语音输出后,使用音频设备进行播放。
3. SAPI的使用场景SAPI可应用于各种语音相关的应用场景,例如:•语音识别软件:SAPI可以用于开发语音助手、语音输入工具等应用程序。
•语音合成软件:SAPI提供了丰富的接口和语音合成引擎,可以用于开发文字转语音、语音提示等应用。
•自动语音对话系统:SAPI允许应用程序与用户进行语音交互,实现自动语音对话功能。
4. 集成SAPI到应用程序中的步骤要将SAPI集成到应用程序中,可以按照以下步骤进行操作:1.引入SAPI库:在应用程序中引入SAPI库文件,例如。
SAPI初级培训教材
SAPI初级培训教材1. 简介1.1 SAPI是什么SAPI〔Speech Application Programming Interface〕是一种语音应用程序编程接口,它允许开发人员创立可以与语音交互的应用程序。
SAPI提供了一系列的接口和功能,使开发人员能够在应用程序中添加语音识别、语音合成和语音命令等功能。
1.2 学习目标本教材旨在帮助初学者快速学习SAPI的根本概念和功能,并提供相应的实例演示。
通过本培训,学员将掌握以下技能:•理解SAPI的根本原理及相关概念•掌握使用SAPI进行语音识别和语音合成的方法•学会使用SAPI实现根本的语音命令功能2. 安装和配置2.1 安装SAPISAPI是Windows操作系统的一局部,因此不需要单独安装。
只需确保在安装Windows时选择了包含SAPI的组件。
2.2 配置开发环境要使用SAPI进行开发,需要配置开发环境。
以下是配置步骤:1.安装适合你所使用的开发工具的SAPI开发包〔SDK〕。
2.在你的开发工具中设置SAPI SDK的路径。
3.创立一个新的SAPI工程。
3. SAPI根本概念3.1 语音识别SAPI提供了一个简单但功能强大的API,用于将语音转换为文本。
开发人员可以使用此功能实现语音输入的应用程序。
例如代码:```csharp using System; using System.Speech.Recognition;class Program { static void Main(string[] args) { using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine()) { // 设置语言recognizer.SetInputToDefaultAudioDevice();recognizer.LoadGrammar(new DictationGrammar());RecognitionResult result =recognizer.Recognize();if (result != null){Console.WriteLine(\。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows TTS开发介绍开篇介绍:我们都使用过一些某某词霸的英语学习工具软件,它们大多都有朗读的功能,其实这就是利用的Windows的TTS(Text To Speech)语音引擎。
它包含在Windows Speech SDK开发包中。
我们也可以使用此开发包根据自己的需要开发程序。
鸡啄米下面对TTS功能的软件开发过程进行详细介绍。
一.SAPI SDK的介绍SAPI,全称是The Microsoft Speech API。
就是微软的语音API。
由Windows Speech SDK提供。
Windows Speech SDK包含语音识别SR引擎和语音合成SS引擎两种语音引擎。
语音识别引擎用于识别语音命令,调用接口完成某个功能,实现语音控制。
语音合成引擎用于将文字转换成语音输出。
SAPI包括以下几类接口:Voice Commands API、Voice Dictation API、Voice Text API、Voice Telephone API和Audio Objects API。
我们要实现语音合成需要的是Voice Text API。
目前最常用的Windows Speech SDK版本有三种:5.1、5.3和5.4。
Windows Speech SDK 5.1版本支持xp系统和server 2003系统,需要下载安装。
XP系统默认只带了个Microsoft Sam英文男声语音库,想要中文引擎就需要安装Windows Speech SDK 5.1。
Windows Speech SDK 5.3版本支持Vista系统和Server 2008系统,已经集成到系统里。
Vista和Server 2003默认带Microsoft lili中文女声语音库和Microsoft Anna英文女声语音库。
Windows Speech SDK 5.4版本支持Windows7系统,也已经集成到系统里,不需要下载安装。
Win7系统同样带了Microsoft lili中文女声语音库和Microsoft Anna英文女声语音库。
Microsoft lili支持中英文混读。
二.SAPI SDK的下载和安装如果是在XP系统下进行开发则需要下载Microsoft Speech SDK 5.1,下载地址为:/download/en/details.aspx?id=10121。
根据微软下载说明,有几点需要注意:1.如果你想下载例子程序、文档、SAPI和用于开发的美国英文语音引擎,请下载SpeechSDK51.exe。
2.如果你想使用日文和简体中文引擎用于开发,请下载SpeechSDK51.exe和SpeechSDK51LangPach.exe。
3.如果你想将语音引擎集成到你的产品跟产品一起发布,就下载SpeechSDK51MSM.exe。
4.如果你仅想获得XP系统下的Mike和Mary语音,就下载Sp5TTIntXP.exe。
5.如果你只想要文档请下载sapi.chm。
下载完成后可先安装引擎SpeechSDK51.exe,再安装中文语言补丁包SpeechSDK51LangPach.exe,这样就可以使用其中的中文男声语音库了。
如果想要在Vista或Win7系统下使用Mike、Mary和Microsoft Simplified Chinese 中文男声语音库也可以下载相应的文件安装。
三.VC++环境配置如果是在XP系统下开发,先安装SpeechSDK51.exe再安装SpeechSDK51LangPach.exe,假设安装路径为默认的 C:\ProgramFiles\Microsoft Speech SDK 5.1,则接下来需要配置VC++,以VS2010为例,在Solution Exporer中的工程名上点右键,在右键菜单中选择properties,弹出Property Pages对话框,然后在左侧树中选择节点”VC++Directories“,在右侧列表的Include Directories处输入”C:\Program Files\Microsoft Speech SDK 5.1\Include“,Library Directories处输入”C:\ProgramFiles\Microsoft Speech SDK 5.1\lib\i386“。
VS2005、VS2008和VC6.0可以按照各自的方法设置。
最后,在程序中使用语音引擎以前包含头文件和lib库:#include "sapi.h"#include "sphelper.h"#pragma comment(lib, "sapi.lib")如果是在Vista或者Win7系统中开发的话,因为头文件和lib库所在路径已默认附加到编译器了,所以不需手动添加,直接在程序中包含头文件和lib 库即可。
四.SAPI接口的使用说明1.基本朗读过程的实现在使用语音引擎之前进行初始化:ISpVoice *pSpVoice; // 重要COM接口::CoInitialize(NULL); // COM初始化// 获取ISpVoice接口CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice);获取到ISpVoice接口以后,我们就可以通过pSpVoice指针调用SAPI 接口了。
我们可以设置音量:pSpVoice->SetVolume(80);。
SetVolume的参数即音量的范围在0到100之间。
可以这样朗读字符串内容:pSpVoice->Speak(string, SPF_DEFAULT, NULL);。
这样string里的内容就会被朗读出来了,第二个参数SPF_DEFAULT表示使用默认设置,包括同步朗读的设置。
异步朗读可以设置成 SPF_ASYNC。
同步朗读表示读完string中的内容,speak函数才会返回,而异步朗读则将字符串送进去就返回,不会阻塞。
使用完语音引擎后应执行:pSpVoice->Release();::CoUninitialize();这样资源被释放,语音朗读过程结束。
以上就完成了一个简单的语音合成朗读的功能。
2.ISpVoice的成员函数鸡啄米再简单说明几个ISpVoice接口的成员函数:HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG*pulStreamNumber);用于读取字符串pwcs里的内容。
参数pwcs为要朗读的字符串。
dwFlags 是用于控制朗读方式的标志,具体意义可以查看文档中的枚举 SPEAKFLAGS。
pulStreamNumber为输出参数,它指向本次朗读请求对应的当前输入流编号,每次朗读一个字符串时都会有一个流编号返回,异步朗读时使用。
HRESULT SetRate( long RateAdjust); // 设置朗读速度,取值范围:-10到10HRESULT GetRate(long *pRateAdjust); // 获取朗读速度HRESULT SetVoice(ISpObjectToken *pToken); // 设置使用的语音库HRESULT GetVoice(ISpObjectToken** ppToken); // 获取语音库HRESULT Pause ( void ); // 暂停朗读HRESULT Resume ( void ); // 恢复朗读// 在当前朗读文本中根据lNumItems的符号向前或者向后跳过指定数量(lNumItems的绝对值)的句子。
HRESULT Skip(LPCWSTR *pItemType, long lNumItems, ULONG*pulNumSkipped);// 播放WAV文件HRESULT SpeakStream(IStream *pStream, DWORD dwFlags, ULONG *pulStreamNumber);// 将声音输出到WAV文件HRESULT SetOutput(IUnknown *pUnkOutput,BOOL fAllowFormatChanges);HRESULT SetVolume(USHORT usVolume); // 设置音量,范围:0到100HRESULT GetVolume(USHORT *pusVolume); // 获取音量HRESULT SetSyncSpeakTimeout(ULONG msTimeout); // 设置同步朗读超时时间,单位为毫秒HRESULT GetSyncSpeakTimeout(ULONG *pmsTimeout); // 获取同步朗读超时时间因为在同步朗读时,speak函数是阻塞的,如果语音输出设备被其他程序占用,则speak则会一直等待,所以最好设置好超时时间,超时后speak函数自行返回。
3.使用XML朗读在进行TTS开发时可以使用XML,SAPI可以分析XML标签,通过XML能够实现一些ISpVoice的成员函数的功能。
比如设置语音库、音量、语速等。
此时speak函数的dwFlags参数要设置为包含SPF_IS_XML。
如:// 选择语音库Microsoft SampSpVoice->speak(L"<VOICE REQUIRED='NAME=Microsoft Sam'/>鸡啄米", SPF_DEFAULT | SPF_IS_XML, NULL);// 设置音量<VOLUME LEVEL='90'>鸡啄米</VOLUME>// 设置语言<lang langid='804'>鸡啄米</lang>804代表中文,409代表英文。
如果用函数SpGetLanguageFromToken获取语言时,0x804表示中文,0x409表示英文。
五.Microsofot Speech SDK开发程序举例::CoInitialize(NULL); // COM初始化CLSID CLSID_SpVoice;CLSIDFromProgID(_T("SAPI.SpVoice"), &CLSID_SpVoice);ISpVoice *pSpVoice = NULL;IEnumSpObjectTokens *pSpEnumTokens = NULL;// 获取ISpVoice接口if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice))){return -1;}// 列举所有的语音token,可以通过pSpEnumTokens指向的接口得到 if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL,&pSpEnumTokens))){ISpObjectToken *pSpToken = NULL;// 依次获取每个token并朗读字符串while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) && pSpToken != NULL){pSpVoice->SetVoice(pSpToken); // 设置当前语音token为pSpTokenpSpVoice->Speak(L"Hello Word 世界你好", SPF_DEFAULT, NULL); // 朗读中文和英文的混合字符串pSpToken->Release(); // 释放token}pSpEnumTokens->Release(); // 释放pSpEnumTokens接口}pSpVoice->Release();::CoUninitialize();鸡啄米通过调试和朗读效果得出结论,Vista和Win7上的Microsoft Lili语音库可以中英文混读,Microsoft Speech SDK 5.1中的中文男声Microsoft Simplified Chinese语音库朗读英文的时候只能一个字母一个字母的读,Anna、Mike、Sam只能读英文,中文略过。