在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Windows系统编程 → C++ tts开发实例 可调节语速,音量,切换语音库

C++ tts开发实例 可调节语速,音量,切换语音库

Windows系统编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:2.25M
  • 下载次数:23
  • 浏览次数:333
  • 发布时间:2019-03-29
  • 实例类别:Windows系统编程
  • 发 布 人:cls3300
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 实例 c++ c 语音 开发

实例介绍

【实例简介】

【实例截图】

from clipboard

【核心代码】

/*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\
|        VictorTTS, copyright © Victor Chen, http://www.cppfans.com/        |
\*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*/
#pragma hdrstop
#include "VictorTTS.h"
//---------------------------------------------------------------------------
namespace VictorTTS {
//---------------------------------------------------------------------------
TVictorTTS::TVictorTTS()
{
  _pVoice = NULL;
  _pToken = NULL;

  _bPaused = false;

  if(SUCCEEDED(_hr=CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void**)&_pVoice)))
   {
     if(SUCCEEDED(_hr=CoCreateInstance(CLSID_SpObjectToken, NULL, CLSCTX_ALL, IID_ISpObjectToken, (void**)&_pToken)))
       _hr=_pVoice->SetVoice(_pToken);
   }
  RefreshTokenList();
}
//---------------------------------------------------------------------------
TVictorTTS::~TVictorTTS()
{
  if(_pToken)
   {
     _pToken->Release();
     _pToken = NULL;
   }
  if(_pVoice)
   {
     _pVoice->Release();
     _pVoice = NULL;
   }
}
//---------------------------------------------------------------------------
String TVictorTTS::_GetTokenID(void)const
{
  String ws;
  if(_pToken)
   {
     wchar_t *lpws = NULL;
     if(SUCCEEDED(_pToken->GetId(&lpws)))
      {
        ws = lpws;
        CoTaskMemFree(lpws);
      }
   }
  return ws;
}
//---------------------------------------------------------------------------
void TVictorTTS::_SetTokenID(String id)
{
  if(_GetTokenID()!=id)
   {
     if(_pToken)
      {
        _pToken->Release();
        _pToken = NULL;
        if(SUCCEEDED(_hr=CoCreateInstance(CLSID_SpObjectToken, NULL, CLSCTX_ALL, IID_ISpObjectToken, (void **)&_pToken)))
          _hr=_pVoice->SetVoice(_pToken);
        _pToken->SetId(SPCAT_VOICES, id.c_str(), false);
      }
   }
}
//---------------------------------------------------------------------------
long TVictorTTS::_GetRate(void)const
{
  if(_pVoice)
   {
     long rt = 0;
     _pVoice->GetRate(&rt);
     return rt;
   }
  return 0;
}
//---------------------------------------------------------------------------
void TVictorTTS::_SetRate(long rt)
{
  if(_pVoice)_pVoice->SetRate(rt);
}
//---------------------------------------------------------------------------
unsigned short TVictorTTS::_GetVolume(void)const
{
  if(_pVoice)
   {
     unsigned short v = 100;
     _pVoice->GetVolume(&v);
     return v;
   }
  return 100;
}
//---------------------------------------------------------------------------
void TVictorTTS::_SetVolume(unsigned short v)
{
  if(_pVoice)_pVoice->SetVolume(v);
}
//---------------------------------------------------------------------------
bool TVictorTTS::_GetSpeaking(void)const
{
  if(_pVoice)
    return _pVoice->WaitUntilDone(0) == S_FALSE;
  return false;
}
//---------------------------------------------------------------------------
unsigned long TVictorTTS::Skip(long n)
{
  unsigned long v = 0;
  if(_pVoice)
    _pVoice->Skip(L"SENTENCE",n,&v);
  return v;
}
//---------------------------------------------------------------------------
bool TVictorTTS::Stop(void)
{
  if(_pVoice)
    return SUCCEEDED(_pVoice->Speak(L"", SPF_PURGEBEFORESPEAK, NULL));
  return false;
}
//---------------------------------------------------------------------------
bool TVictorTTS::SaveWav(String sText, String sFile)
{
  if(_pVoice)
   {
     ISpStream *pISpStream;
     HRESULT hResult = CoCreateInstance(CLSID_SpStream,NULL,CLSCTX_INPROC_SERVER, IID_ISpStream, (void**)&pISpStream);
     if(SUCCEEDED(hResult))
      {
        ISpStreamFormat *pISpStreamFormat;
        hResult = Voice->GetOutputStream(&pISpStreamFormat);
        if(SUCCEEDED(hResult))
         {
           GUID guidFormatId;
           WAVEFORMATEX *pCoMemWaveFormatEx;
           hResult = pISpStreamFormat->GetFormat(&guidFormatId,&pCoMemWaveFormatEx);
           if(SUCCEEDED(hResult))
            {
              hResult = pISpStream->BindToFile(sFile.c_str(), SPFM_CREATE_ALWAYS, &guidFormatId, pCoMemWaveFormatEx,0);
              if(SUCCEEDED(hResult))
               {
                 Voice->SetOutput(pISpStream, TRUE);
                 Voice->Speak(sText.c_str(), SPF_DEFAULT, NULL);
                 Voice->SetOutput(NULL, TRUE);
               }
              CoTaskMemFree(pCoMemWaveFormatEx);
            }
           pISpStreamFormat->Release();
         }
        pISpStream->Release();
      }
     return SUCCEEDED(hResult);
   }
  return false;
}
//---------------------------------------------------------------------------
bool TVictorTTS::Speak(String s)
{
  if(_pVoice)
   {
     Paused = false;
     return SUCCEEDED(_pVoice->Speak(s.c_str(), SPF_ASYNC|SPF_PURGEBEFORESPEAK, NULL));
   }
  return false;
}
//---------------------------------------------------------------------------
bool TVictorTTS::SpeakSync(String s)
{
  if(_pVoice)
   {
     Paused = false;
     return SUCCEEDED(_pVoice->Speak(s.c_str(), SPF_PURGEBEFORESPEAK, NULL));
   }
  return false;
}
//---------------------------------------------------------------------------
void TVictorTTS::_SetPaused(bool b)
{
  if(_pVoice)
   {
     if(b)
      {
        if(!_bPaused)
         {
           if(SUCCEEDED(_pVoice->Pause()))
             _bPaused = true;
         }
      }
     else
      {
        if(_bPaused)
         {
           if(SUCCEEDED(_pVoice->Resume()))
             _bPaused = false;
         }
      }
   }
}
//---------------------------------------------------------------------------
bool TVictorTTS::GetSpeakingWord(unsigned long &ulPos, unsigned long &ulLen)
{
  bool bOK = false;
  if(_pVoice)
   {
     SPVOICESTATUS vs;
     if(SUCCEEDED(_pVoice->GetStatus(&vs,NULL)))
      {
        ulPos = vs.ulInputWordPos;
        ulLen = vs.ulInputWordLen;
        bOK = true;
      }
   }
  return bOK;
}
//---------------------------------------------------------------------------
int TVictorTTS::RefreshTokenList(void)
{
  _wsDefTokenID = L"";
  _vtlTokenList.clear();
  if(_pVoice)
   {
     ISpObjectTokenCategory *pCategory = NULL;
     if(SUCCEEDED(CoCreateInstance(CLSID_SpObjectTokenCategory, NULL, CLSCTX_ALL, IID_ISpObjectTokenCategory, (void**)&pCategory)))
      {
        pCategory->SetId(SPCAT_VOICES, false);
        IEnumSpObjectTokens *pEnum = NULL;
        if(SUCCEEDED(pCategory->EnumTokens(NULL, NULL, &pEnum)))
         {
           ULONG ulCount = 0;
           if(SUCCEEDED(pEnum->GetCount(&ulCount))) //Get the number of voices
            {
              for(ULONG i=0; i<ulCount; i  )
               {
                 ISpObjectToken *pVoiceToken = NULL;
                 if(SUCCEEDED(pEnum->Next(1, &pVoiceToken, NULL)))
                  {
                    TVictorTokenItem vti;
                    wchar_t *lpws = NULL;
                    if(SUCCEEDED(pVoiceToken->GetId(&lpws)))
                     {
                       vti.TokenID = lpws;
                       CoTaskMemFree(lpws);
                     }
                    lpws = NULL;
                    if(SUCCEEDED(pVoiceToken->GetStringValue(NULL, &lpws)));
                     {
                       vti.TokenDesc = lpws;
                       CoTaskMemFree(lpws);
                     }
                    _vtlTokenList.push_back(vti);
                    pVoiceToken->Release();
                  }
               }
            }
           pEnum->Release();
         }
        wchar_t *lpws = NULL;
        if(SUCCEEDED(pCategory->GetDefaultTokenId(&lpws)))
         {
           _wsDefTokenID = lpws;
           CoTaskMemFree(lpws);
         }
        pCategory->Release();
      }
   }
  return _vtlTokenList.size();
}
//---------------------------------------------------------------------------
} // namespace VictorTTS
//---------------------------------------------------------------------------


标签: 实例 c++ c 语音 开发

实例下载地址

C++ tts开发实例 可调节语速,音量,切换语音库

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警