微软TTS引擎实例
来源:互联网 发布:什么软件可以听黄歌 编辑:程序博客网 时间:2024/06/05 14:09
首先,想要实现将文本转换为语音,就得先了解微软提供的TTS(Text to 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,下载地址为:http://www.microsoft.com/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:\Program Files\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:\Program Files\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库即可。
四.SDK接口说明 1. 获取ISpVoice接口CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&pSpVoice);
2.ISpVoice的成员函数
详细说明可以查阅MSDN:https://msdn.microsoft.com/en-us/library/ms719576(v=vs.85).aspx
HRESULT Speak(LPCWSTR *pwcs, DWORD dwFlags, ULONG *pulStreamNumber);
用于读取字符串pwcs里的内容。参数pwcs为要朗读的字符串。dwFlags是用于控制朗读方式的标志,具体意义可以查看文档中的枚举SPEAKFLAGS。pulStreamNumber为输出参数,它指向本次朗读请求对应的当前输入流编号,每次朗读一个字符串时都会有一个流编号返回,异步朗读时使用。
HRESULT SetRate( long RateAdjust); // 设置朗读速度,取值范围:-10到10
HRESULT 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到100
HRESULT GetVolume(USHORT *pusVolume); // 获取音量
HRESULT SetSyncSpeakTimeout(ULONG msTimeout); // 设置同步朗读超时时间,单位为毫秒
HRESULT GetSyncSpeakTimeout(ULONG *pmsTimeout); // 获取同步朗读超时时间
因为在同步朗读时,speak函数是阻塞的,如果语音输出设备被其他程序占用,则speak则会一直等待,所以最好设置好超时时间,超时后speak函数自行返回。
1.初始化
void CTTSDlg::InitVoicePackageSelComboxCtrl()
{
//初始化COM组件
if(FAILED(::CoInitialize(NULL)))
{
MessageBox(_T("初始化COM组件失败"), _T("提示"), MB_OKCANCEL);
return;
}
if(SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL,NULL, &m_pIEnumSpObjectTokens)))
{
//得到所有语音Token的个数
ULONG ulTokensNumber = 0;
m_pIEnumSpObjectTokens->GetCount(&ulTokensNumber);
//检测该机器是否安装有语音包
if(ulTokensNumber == 0)
{
MessageBox(_T("该机器没有安装语音包!"), _T("提示"), MB_OK|MB_ICONWARNING);
return;
}
//将语音包的名字加入组合框控件
CString strVoicePackageName = _T("");
CString strTokenPrefixText = _T("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\");
for(ULONG i=0; i<ulTokensNumber; i++)
{
m_pIEnumSpObjectTokens->Item(i, &m_pISpObjectToken);
LPWSTR* pChar = new LPWSTR;
m_pISpObjectToken->GetId(pChar);
USES_CONVERSION;
LPCTSTR lpStr = W2A(*pChar);
strVoicePackageName = lpStr;
strVoicePackageName.Delete(0, strTokenPrefixText.GetLength());
m_ComboxVoiceSel.InsertString(i, strVoicePackageName);
}
//设置默认的语音包选择
m_ComboxVoiceSel.SetCurSel(0);
}
GetISpVoice();
}
BOOL CTTSDlg::GetISpVoice()
{
//获取ISpVoice接口
if(FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&m_pISpVoice)))
{
MessageBox(_T("获取ISpVoice接口失败"), _T("提示"), MB_OKCANCEL);
return FALSE;
}
return TRUE;
}
2.将文字转换为语音
void CTTSDlg::OnBnClickedButtonStart()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
//设置语音
m_pIEnumSpObjectTokens->Item(m_ComboxVoiceSel.GetCurSel(), &m_pISpObjectToken);
m_pISpVoice->SetVoice(m_pISpObjectToken);
//设置播放速度
m_pISpVoice->SetRate(m_voiceSpeed.GetPos() - 5);
//设置播放音量
m_pISpVoice->SetVolume((100 - m_voiceSize.GetPos()) * 10);
CString text;
m_editSpeekText.GetWindowTextA(text);
if(text.IsEmpty())
{
MessageBox(_T("播放内容不能为空"), _T("提示"), MB_OKCANCEL);
return;
}
m_pISpVoice->Speak(text.AllocSysString(), SPF_ASYNC, NULL);
}
3.暂停和继续,ISpVoice接口中提供了开始和暂停接口
void CTTSDlg::OnBnClickedButtonStopContinue()
{
// TODO: 在此添加控件通知处理程序代码
if(!m_bPause)
{
m_pISpVoice->Pause();
m_bPause = TRUE;
}
else
{
m_pISpVoice->Resume();
m_bPause = FALSE;
}
return ;
}
4.将语音存成WAV文件
void CTTSDlg::OnBnClickedButtonGenerateWavFile()
{
// TODO: 在此添加控件通知处理程序代码
//获取保存文件路径
BOOL isOpen = FALSE; //是否打开(否则为保存)
CString defaultDir = _T("D:"); //默认打开的文件路径
CString fileName = _T("test.wav"); //默认打开的文件名
CString filter = _T("文件 (*.wav)||"); //文件过虑的类型
CFileDialog openFileDlg(isOpen, defaultDir, fileName, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, filter, NULL);
INT_PTR result = openFileDlg.DoModal();
CString filePath = defaultDir + _T("\\") + fileName;
if(result == IDOK)
{
filePath = openFileDlg.GetPathName();
}
//生成WAV文件
CString voiceText;
m_editSpeekText.GetWindowTextA(voiceText);
CComPtr<ISpStream> cpISpStream;
CComPtr<ISpStreamFormat> cpISpStreamFormat;
CSpStreamFormat spStreamFormat;
m_pISpVoice->GetOutputStream(&cpISpStreamFormat);
spStreamFormat.AssignFormat(cpISpStreamFormat);
HRESULT hResult = SPBindToFile(filePath,
SPFM_CREATE_ALWAYS,
&cpISpStream,
&spStreamFormat.FormatId(),
spStreamFormat.WaveFormatExPtr());
if(SUCCEEDED(hResult))
{
m_pISpVoice->SetOutput(cpISpStream, TRUE);
m_pISpVoice->Speak(voiceText.AllocSysString(), SPF_DEFAULT, NULL);
MessageBox( _T("生成WAV文件成功!"), _T("提示"), MB_OK);
}
else
{
MessageBox(_T("生成WAV文件失败!"), _T("提示"), MB_OK|MB_ICONWARNING);
}
}
效果图如下
- 微软TTS引擎实例
- C#使用微软的TTS引擎发音
- 微软TTS语音引擎(中文)5.1
- 微软TTS语音引擎编程入门
- 更换微软TTS语音引擎切换
- 使用微软TTS语音引擎实现文本朗读
- 应用 Microsoft TTS 语音引擎的 Delphi 语言实例
- TTS什么意思,缩写,微软TTS语音引擎(中文)5.1 “TTS”是“文本到语音(Text To Sound)”的简称
- 微软TTS中英混读
- 微软的TTS
- 微软TTS 使用
- ekho--TTS语音引擎
- C# COM SAPI.SpVoice 对象类封装(微软娘TTS引擎)
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
- Android TTS基础实例
- Android TTS基础实例
- Android TTS使用实例
- WINCE TTS语音合成引擎
- 确定n个元素的任何排序中逆序对数量
- display:flex用法
- Java行为型设计模式-观察者(一)
- oracle pl/sql split函数
- 阿里数据库连接池druid详解
- 微软TTS引擎实例
- (8)caffe总结之solver及其配置
- 华中第六届邀请赛G-room (set的用法)
- Oracle数据库创建存储过程
- UML常用的基本图形简介
- NYOJ-168-房间安排(第三届河南省程序设计大赛A题)
- vs2010 c# toolStripStatusLabel1显示tooltiptext的方法
- 一张图片多个链接(影像地图)
- C#142课的主要内容