精华内容
下载资源
问答
  • Windows TTS语音阅读

    2019-03-07 10:40:19
    Windows TTS语音阅读
  • Win7系统下不能使用TTS语音引擎的问题。如果大家没使用正版的windows系统,那么很可能你的TTS语音是没有的。可以通过使用该补丁包解决TTS问题
  • TTS语音驱动,自带WindowsXP/WIN 7修复程序
  • winXp win7 TTS修复工具(微软tts语音引擎修复) 32位 64位
  • Windows TTS语音编程

    千次阅读 2010-12-18 10:11:00
    软件中的语音技术包括两方面的内容,一个是语音识别(speech recognition) 和语音合成(speech synthesis)。这两个技术都需要语音引擎的支持。微软推出的应用编程接口API,虽然现在不是业界标准,但是应用比较广泛。 ...

    转自:http://blog.vckbase.com/iwaswzq/archive/2009/05/22/22382.html

    一、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。

    首先从这个站点下载开发包:http://www.microsoft.com/speech/download/sdk51

    Microsoft Speech SDK 5.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 SDK 5.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 m_cpVoice;
    HRESULT hr = m_cpVoice.CoCreateInstance( CLSID_SpVoice );
    在下面的例子中都用这个m_cpVoice变量。

    CLSID_SpVoice的定义位于SPAI.H中。

    2、获取/设置输出频率。

    SAPI朗读文字的时候,可以采用多种频率方式输出声音,比如:
    8kHz 8Bit Mono、8kHz 8Bit Stereo、44kHz 16Bit Mono、44kHz 16Bit Stereo等。在音调上有所差别。具体可以参考sapi.h。

    可以使用如下代码获取当前的配置:
    CComPtr 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 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支持的语音填充在一个组合框中:
    // SAPI5 helper function in sphelper.h
    HWND hWndCombo = 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 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 cpWavStream;
    WCHAR szwWavFileName[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文件
    TCHAR szFileName[256];//假设这里面保存着目标文件的路径
    USES_CONVERSION;
    WCHAR m_szWFileName[MAX_FILE_PATH];
    wcscpy( m_szWFileName, T2W(szFileName) );//转换成宽字符串

    //创建一个输出流,绑定到wav文件
    CSpStreamFormat OriginalFmt;
    CComPtr cpWavStream;
    CComPtr 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的通知事件:

    CSpEvent event; // 使用这个类,比用 SPEVENT结构更方便

    while( event.GetFrom(m_cpVoice) == S_OK )
    {
    switch( event.eEventId )
    {
    。。。
    }
    }

    eEventID有很多种,比如SPEI_START_INPUT_STREAM表示开始朗读,SPEI_END_INPUT_STREAM表示朗读结束等。
    可以根据需要进行判断使用。

    示例程序代码下载:http://download.csdn.net/source/2918975

    Powered by Zoundry Raven

    展开全文
  • Win7系统微软TTS语音修复补丁(x86和x64) 说明:本修复补丁适用于32位或64位Win7系统,会自识别安装
  • windows Text To Speecht_tts语音引擎修复补丁集成版,修复阉割版无法使用语音播放功能。
  • Win7系统微软TTS语音修复,亲测可用,如有疑问请及时评论,我好关闭资源,其他废话没啥说的了111111111
  • Windows 语音引擎TTS修复

    千次阅读 2018-09-20 16:22:32
    现在在做文字转语音的工作,非正版的Windows系统,自带的语音引擎(或者官网下载的Speech SDK),在安装的时候,会检测是否为正版用户。如果不是,则部分TTS相关的功能就被阉割了。找了好久,都没找到原因,今天无意...

    现在在做文字转语音的工作,非正版的Windows系统,自带的语音引擎(或者官网下载的Speech SDK),在安装的时候,会检测是否为正版用户。如果不是,则部分TTS相关的功能就被阉割了。找了好久,都没找到原因,今天无意发现一篇文章写的很好,也解惑了http://blog.sina.com.cn/s/blog_88bdc35c0102vd0e.html

    需要的朋友可以借鉴,一起学习。

    这里还找到一个工具,是用C++ Builder编译的项目。可以选择语音库,实时阅读文字http://www.cppfans.com/cbknowledge/skills/media/ttsdemo.asp

     

    后来无意间又发现一篇文章,写的是同样的事情。不过写的比我详细,附上链接,一起学习https://blog.csdn.net/eriato/article/details/70768327

     

    展开全文
  • 微软TTS语音组件安装程序,原来搞过一个语音前台,后来没用,这个东西挺好的,有开发语音的很有用,一般程序用上后也很有效果
  • 微软的TTS语音功能,但是在部分用户那里无法正常使用,,是由于用户使用了选简化版的Win7和XP操作系统导致。
  • 以前看过不少软件像foxitreader,office等软件带有语音朗读功能,现在也有机会做做这方面的应用,查... Windows Speech SDK包含语音识别SR引擎和语音合成SS引擎两种语音引擎。语音识别引擎用于识别语音命令,调用接口完

            以前看过不少软件像foxitreader,office等软件带有语音朗读功能,现在也有机会做做这方面的应用,查过些资料,引用比较多的是这个网站:

    http://write.blog.csdn.net/postedit?ref=toolbar

       Windows Speech SDK包含语音识别SR引擎和语音合成SS引擎两种语音引擎。语音识别引擎用于识别语音命令,调用接口完成某个功能,实现语音控制。语音合成引擎用于将文字转换成语音输出。

           SAPI包括以下几类接口:Voice Commands API、Voice Dictation API、Voice Text API、Voice Telephone API和Audio Objects API。我们要实现语音合成需要的是Voice Text API。

           下面是根据此网站内容做了一个通用类,方便我们的工程调用。

    UserTTSAPI.h文件

    #pragma once
    #include <sapi.h>
    #include <sphelper.h>
    #pragma comment(lib,"sapi.lib")
    #pragma comment(lib,"ole32.lib")


    class CUserTTSAPI
    {
    public:
    CUserTTSAPI(void);
    ~CUserTTSAPI(void);
    public:
    ISpVoice* pSpVoice;//初始化COM对象
    IEnumSpObjectTokens *pSpEnumTokens;
    ISpObjectToken *pSpToken;


    BOOL blOpenTTSAPI(void);
    void vSysReadBySST(CString strData);
    void vCloseTTSAPI(void);
    };


    extern CUserTTSAPI m_UserTTSAPI;

    UserTTSAPI.app文件

    #include "StdAfx.h"
    #include "UserTTSAPI.h"


    CUserTTSAPI m_UserTTSAPI;


    CUserTTSAPI::CUserTTSAPI(void)
    {
    ::CoInitialize(NULL);
    pSpVoice = NULL;//初始化COM对象
    pSpEnumTokens = NULL;
    pSpToken = NULL;
    }


    CUserTTSAPI::~CUserTTSAPI(void)
    {
    ::CoUninitialize();
    }


    BOOL CUserTTSAPI::blOpenTTSAPI(void)
    {
    CLSID CLSID_SpVoice;
    CLSIDFromProgID(_T("SAPI.SpVoice"),&CLSID_SpVoice);


    //获取ISPVoice接口
    if (FAILED(CoCreateInstance(CLSID_SpVoice,NULL,CLSCTX_INPROC_SERVER,IID_ISpVoice,(void**)&pSpVoice)))
    {
    return FALSE;
    }
    //列举所有的语音token,可以通过pSpenumTokens指向的接口得到
    if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES,NULL,NULL,&pSpEnumTokens)))
    {
    pSpEnumTokens->Item(0,&pSpToken);
    pSpVoice->SetVoice(pSpToken);
    }
    return TRUE;
    }


    void CUserTTSAPI::vSysReadBySST(CString strData)
    {
    if (g_Channel.blPrompt == TRUE)
    {
    long lSpeeh = 0;
    switch(g_Channel.bySoundSpeed)
    {
    case 0:
    lSpeeh = -10;
    break;
    case 1:
    lSpeeh = -8;
    break;
    case 2:
    lSpeeh = -5;
    break;
    case 3:
    lSpeeh = -3;
    break;
    case 4:
    lSpeeh = 0;
    break;
    case 5:
    lSpeeh = 3;
    break;
    case 6:
    lSpeeh = 5;
    break;
    case 7:
    lSpeeh = 8;
    break;
    case 8:
    lSpeeh = 10;
    break;
    }
    pSpVoice->SetRate(lSpeeh);//设置声音快慢
    unsigned short usVolume = g_Channel.bySoundVolume * 10;
    pSpVoice->SetVolume(usVolume);//设置音量
    //pSpVoice->Pause();
    pSpVoice->Speak(NULL,SPF_PURGEBEFORESPEAK,0);
    pSpVoice->Speak(strData,SPF_ASYNC,NULL);//异步
    //pSpVoice->Speak(strData,SPF_DEFAULT,NULL);
    //pSpVoice->Resume();
    }
    }


    void CUserTTSAPI::vCloseTTSAPI(void)
    {
    if (g_Channel.blPrompt == TRUE)
    {
    g_Channel.blPrompt = FALSE;
    pSpToken->Release();
    pSpEnumTokens->Release();
    pSpVoice->Release();
    }
    }


    本类实现TTS语音引擎的初始化以及关闭流程,中间的g_Channel.bySoundSpeed声音速度,g_Channel.bySoundVolume 声音大小,g_Channel.blPrompt指示开启的标志。

    展开全文
  • 咱们使用的win7系统大多不是正版,都是阉割版,tts功能是不能用的,使用win7开发语音朗读功能一般都不支持,网上其他的那些方法,都是基于win10系统的,都是瞎bb,我都试过,在win7上根本不行,最后找到了这个好东西...
  • TTS语音修复

    2018-10-23 11:59:34
    修复WIN7阉割版操作系统的语音功能,按顺序安装即可。
  • tts语音库修复补丁win7/xp。 http://www.wsgosft.net/t2s/ 文字转语音助手。
  • TTS语音合成delphi示例

    热门讨论 2013-09-04 11:21:37
    TTS语音合成的delphi代码示例,语音库为windows系统语音库,可自行下载其他库。
  • JAVA TTS语音

    2020-11-30 15:37:36
    jacob-1.18-M2-x64.dll、jacob-1.18-M2-x86.dll拷贝到C:\Windows\System32
  • windows下我们将文本转语音使用的就是windows自带的COM组件,也就是TTS库,为了方便使用我将语音转文本的库封装成一个Dll库,目的也是为了后续组件化和模块化后续系统的功能,该封装库仅有三个功能: (1)语音库的...

    一、文本转语音实现

     

    本文提及的文本转语音库其实很多年前写的库,最近有才时间整理才将对应库整理成文章供各位网友参考。

    其实在windows下自带了文本转语音以及语音识别的功能,这里由于项目中需要将报警文本信息使用语音形式转化出来,所以这里仅仅只介绍文本转语音的使用。

     

    windows下我们将文本转语音使用的就是windows自带的COM组件,也就是TTS库,为了方便使用我将语音转文本的库封装成一个Dll库,目的也是为了后续组件化和模块化后续系统的功能,该封装库仅有三个功能:

    (1)语音库的初始化

    //-------------------------------------------------
    //	功  能:语音库的初始化
    //  参  数:
    //		无
    //	返回值:
    //		成功返回true反之返回false
    //	说  明:
    //		在系统初始化的时候调用该接口与TTS_UnInit对应
    //-------------------------------------------------
    TTSSDK_API bool TTS_Init();

    (2)本文转语音

    //-------------------------------------------------
    //	功  能:语音库的初始化
    //  参  数:
    //		【输入】content		:	需要播放的文字内容
    //		【输入】size		:	播放的文字内容长度
    //	返回值:
    //		无
    //	说  明:
    //		为了性能,该接口是异步接口调用后后台自动播放
    //-------------------------------------------------
    TTSSDK_API void TTS_Speak(const char* content,const int size);

    (3)语音库的反初始化

    //-------------------------------------------------
    //	功  能:语音库的反初始化
    //  参  数:
    //		无
    //	返回值:
    //		无
    //	说  明:
    //		在系统退出的时候调用该接口以使用资源
    //-------------------------------------------------
    TTSSDK_API void TTS_UnInit();

    我们将重点放在第三个接口的实现上:  

    TTSSDK_API void TTS_Speak(const char* content,const int size)
    {
    	NetCommandPtr pCmd = boost::make_shared<CNetCommand>(boost::BOOST_BIND(CTtsInstance::Speek, content));
    	CMessageEngine::get_mutable_instance().Post(pCmd);
    }
    

    该接口的实现是通过异步方式调用的,这里使用了boost封装的消息处理引擎处理对应的消息,其目的是为了上层应用调用的完成之后可以继续做自己的工作,而不影响上层应用,特别是UI相关的线程,因为语音播放如果是同步播放的,10几个文字播放出来(包括标点符号的停顿)大概需要6-10秒,所以该接口是做成了异步处理。

     

    最后,我们只需要关注TTS的实例的Speek方法实现就可以了:

    bool CTtsInstance::Speek(std::string text)
    {
    	// window 64[不能使用-只能调用32bit程序]
    	if (!CTtsInstance::Prepared())
    	{
    		TCHAR filePath[MAX_PATH] = { 0 };
    		GetModuleFileName(NULL, filePath, MAX_PATH);
    		_tcsrchr(filePath, _T('\\'))[1] = _T('\0');
    		_tcscat(filePath, _T("tts.exe"));
    
    		if (-1 == _taccess(filePath, 0))
    			return false;
    
    		STARTUPINFO   si = { 0 };
    		ZeroMemory(&si, sizeof(si));
    		si.cb = sizeof(si);
    		si.dwFlags = /*STARTF_USESHOWWINDOW*/0;
    		si.wShowWindow = /*SW_SHOW*/SW_HIDE;
    		si.lpDesktop = NULL;
    
    		PROCESS_INFORMATION   ProcessInformation;
    		ZeroMemory(&ProcessInformation, sizeof(ProcessInformation));
    		if (CreateProcess(filePath, (LPTSTR)text.c_str(), NULL, NULL, FALSE,/*CREATE_NEW_CONSOLE*/0, NULL, NULL, &si, &ProcessInformation))
    		{
    			WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    			::CloseHandle(ProcessInformation.hThread);
    			::CloseHandle(ProcessInformation.hProcess);
    		}
    	}
    	else
    	{
    		if (!m_pISpVoice)
    			return false;
    
    		// 开始进行朗读
    		BSTR content = _com_util::ConvertStringToBSTR(text.c_str());
    		HRESULT hr = m_pISpVoice->Speak(content, SPF_ASYNC, NULL);
    		SysFreeString(content);
    	}
    	return true;
    }

    这里做了两部分工作:

    (1)播放文本

    我们使用的是语音播放COM库ISpObjectToken实现的,该组件初始化如下:

    bool CTtsInstance::Init()
    {
    	// 初始化COM组件
    	if(FAILED(::CoInitialize(NULL)))
    		return false;
    
    	if(FAILED(m_pISpVoice.CoCreateInstance(CLSID_SpVoice)))
    		return false;
    
    	// 枚举所有语音Token
    	CComPtr<IEnumSpObjectTokens> cpEnum;
    	if(FAILED(SpEnumTokens(SPCAT_VOICES, L"", L"", &cpEnum)))
    		return false;
    	
    	ISpObjectToken* pToken = NULL;
    	while (cpEnum->Next(1, &pToken, NULL) == S_OK)
    	{
    		CSpDynamicString dstrDesc;
    		HRESULT hr = SpGetDescription(pToken, &dstrDesc);
    		if (SUCCEEDED(hr))
    		{
    			m_vecISpToken.push_back(pToken);
    		}
    	}
    
    	SetVoice(2052);
    
    	return true;
    }

    播放的时候我们只需要调用Speak接口即可,注意因为用的是COM组件,所以字符串也需要转换为COM的BSTR字符串!

    (2)64bit系统兼容

    因为我的程序一般都做了32bit和64bit的windows程序(包括所有dll库),经过测试发现64bit系统是调用COM库的,但是为了兼容其他的64bit库和app调用,我也必须兼容64bit的应用,我想到的好的办法是:本地调用。  

     

    既然系统仅仅支持32bit调用,那么64bit的dll封装只需要调用32bit的库就可以了,但是64bit的dll是无法调用32bit的dll的,但是可以通过进程方式调用,所以我又将该库封装成了一个32bit的exe,然后64bit的dll调用32bit的exe。该调用如下:  

    		TCHAR filePath[MAX_PATH] = { 0 };
    		GetModuleFileName(NULL, filePath, MAX_PATH);
    		_tcsrchr(filePath, _T('\\'))[1] = _T('\0');
    		_tcscat(filePath, _T("tts.exe"));
    
    		if (-1 == _taccess(filePath, 0))
    			return false;
    
    		STARTUPINFO   si = { 0 };
    		ZeroMemory(&si, sizeof(si));
    		si.cb = sizeof(si);
    		si.dwFlags = /*STARTF_USESHOWWINDOW*/0;
    		si.wShowWindow = /*SW_SHOW*/SW_HIDE;
    		si.lpDesktop = NULL;
    
    		PROCESS_INFORMATION   ProcessInformation;
    		ZeroMemory(&ProcessInformation, sizeof(ProcessInformation));
    		if (CreateProcess(filePath, (LPTSTR)text.c_str(), NULL, NULL, FALSE,/*CREATE_NEW_CONSOLE*/0, NULL, NULL, &si, &ProcessInformation))
    		{
    			WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
    			::CloseHandle(ProcessInformation.hThread);
    			::CloseHandle(ProcessInformation.hProcess);
    		}

    通过查找本地的tts.exe文件进行远程调用并传递参数给exe即可。

     

    二、测试示例

    测试实例代码如下:

    int _tmain(int argc, _TCHAR* argv[])
    {
    	if(!TTS_Init()){
    		printf("初始化语音引擎失败!\n");
    	}
    
    	while (true)
    	{
    		TTS_Speak("尊敬的李先生,早上好!", 0);
    		printf("尊敬的李先生,早上好!\n");
    		Sleep(5000);
    	}
    
    	TTS_UnInit();
    
    	return 0;
    }
    

     

    (1)32bit的程序测试如下

    可以看到播放正常!

    (2)64bit程序测试如下

    可以看到64bit的dll被调用后播放也依然正常,只不过通过进程调用方式耗时稍微长一点,不过也只能通过这种方式兼容了。

     

    三、注意问题

    不同机器测试可以发现,阉割版本的win7是没有自带语音库的,所有初始化语音COM组件正常,所以我们需要修复语音库,这里需要32bit和64bit的语音修复库,另外也可以安装自己喜欢的语音播放库(我的是男士音,不好辨识!)

     

     

    源码获取、合作、技术交流请获取如下联系方式:  
    QQ交流群:961179337  
     

    微信账号:lixiang6153  
    公众号:IT技术快餐  
    电子邮箱:lixx2048@163.com  

    展开全文
  • windows7以后系统自带TTSwindows speech SDK,只需要包含头文件,使用起来就可以。 使用中遇到char转换wchar的问题,也是最终搞定了。示例如下: #include <sapi.h> #include <sphelper.h> bool...
  • win7 tts 文本转语音,非正版系统,对win7的部分功能进行了裁剪
  • win7使用huihui语音tts

    2020-12-26 22:29:18
    win7使用huihui语音tts
  • win7语音TTS组件修复

    热门讨论 2012-02-27 10:06:18
    不少精简版的win7会把TTS组件精简掉,导致语音TTS功能无法使用,这个组件能迅速帮你修复。这是目前最简便的方法。
  • 微软TTS语音引擎提供了Windows Speech SDK开发包供编程者使用。Windows Speech SDK包含语音合成SS引擎和语音识别SR引擎两种,语音合成引擎用于将文字转换成语音输出,语音识别引擎用于识别语音命令。
  • 使用微软TTS语音引擎实现文本朗读

    万次阅读 2017-11-04 15:51:30
    使用微软TTS语音引擎实现文本朗读、语音识别
  • 适用于Windows 7的文本到语音TTS程序,采用了简约的方法。 *播放纯文本文件,复制到剪贴板以及来自程序编辑控件的文本。 *打开,保存并追加到文本文件。 *在交互模式下暂停,恢复和停止播放。 *将文本保存到“ wav...
  • TTS语音

    2013-12-25 15:46:00
    设置当前使用语音库 /// /// bool public bool setDescription( string name) { List < string > list = new List< string > (); DotNetSpeech.ISpeechObjectTokens obj = voice....
  • 微软TTS语音,speechLib实现停止当前读的话,进行下一句 C#实现, 部分电脑无法使用TTS语音异常(缺少语音功能,通常xp和win7可能会出现) 可以使用一下代码进行测试 private void speak() { ...
  • 基于Windows TTS语音实时播报终端

    千次阅读 2015-02-12 08:58:44
    语音播报终端基于Windows TTS SDK,即Text To Speech。使用ActiveMQ作为播报数据消息服务,各终端通过实时监听数据广播地址获取数据信息,再通过TTS进行语音播报。 语音播报终端主要功能:1.通过CMS监听消息服务...
  • win32com调用的windows的SAPI,所以只适用于windows平台 python3 -m pip install win32com 或python3 -m pip install pypiwin32 二、装mini小车的库 或者控制电机,这个怎么设计随意,就是在你原来程序上调用win32...
  • TTS语音播报服务及调试程序(32bit),适用于Window7Windows8.1,Windows10。部署及使用方法详见博客文章:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,768
精华内容 1,107
关键字:

windows7安装tts语音