微软TTS语音引擎实现文本朗读

科大讯飞和neospeech tts哪个更好

 

朋友们或许还有一个疑问,就是不知道科大讯飞和neospeech哪个更好。据我的体会,它们其实各有优点。

科大讯飞有几个语音库,比如小宇、小燕、还有一个粤语和英语的;而neospeech则有lily、liang、hui几个中文语音库。

科大的最大优点就是朗诵清楚,听起来能做到几乎每个字都让我们能听进去。而neospeech的优点则是流畅,高低起伏、抑扬顿挫,临场感很强,不过有时候某些字眼会让人听不太清楚。

提醒一下,neospeech里面的liang语音库,个人觉得是最好用的,浑厚的男声每个字都朗读的很清楚,而且临场感和流畅度都很强,是中文文字朗读里面的佼佼者!赞一个~~

要下载的朋友可以在电驴里面搜索下载。

综上所述,从总评来说,neospeech应该比讯飞语音略胜一筹的!至于各家的优点上面已经说过。要我自己来排名的话,是这样的(由高至低):

a. neospeech liang
b. 科大讯飞 小燕
c. neospeech lily
d. neospeech hui
e. 科大讯飞 小宇

当然如果说到英文,neospeech里面的Paul算是当前最好的发声效果了!连霍金都在用它,你说它有多么强悍呢!

最后说一下,文语通和方正畅听都是科大的,不过体积相比要小很多,尤其方正畅听,如果你的要求不高的话,完全可以使用方正畅听,听起来也是挺流畅滴。

最后希望大家好好爱护自己的眼睛,不要长期用眼看电脑,转“看”为“听”,既能护眼,又是一种享受,何乐不为呢?

下载地址:http://www.verycd.com/topics/2780296/(neospeech)

                  http://www.verycd.com/topics/2828273/(科大)

 

使用微软TTS语音引擎实现文本朗读

2017年11月04日 15:51:30 byxdaz 阅读数:12312

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/byxdaz/article/details/78443954

TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语音输出。TTS语音引擎有微软TTS语音引擎、科大讯飞语音引擎等。科大讯飞tts sdk参考这个页面http://www.xfyun.cn/sdk/dispatcher

文本主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件。

1、语音引擎及语音库的安装

微软TTS语音引擎提供了Windows Speech SDK开发包供编程者使用。Windows Speech SDK包含语音合成SS引擎和语音识别SR引擎两种,语音合成引擎用于将文字转换成语音输出,语音识别引擎用于识别语音命令。

Windows Speech SDK可以在微软的官网上免费下载,下载地址为:http://www.microsoft.com/download/en/details.aspx?id=10121

在该下载界面中,选择下载SpeechSDK51.exe、SpeechSDK51LangPach.exe和sapi.chm 即可。

SpeechSDK51.exe

语音合成引擎

SpeechSDK51LangPach.exe

语音库,支持日语和简体中文需要这个支持。

sapi.chm

帮助文档

speechsdk51MSM.exe

语音引擎集成到你的产品跟产品一起发布。解压出来三个文件夹1033、1041和2052。其中,1033下主要是用于英文的TTS和SR的.msm文件,1041下主要是用于日文SR的.msm文件,2052下是用于中文TTS和SR的msm文件。

Sp5TTintXP.exe

XP下Mike和Mary语音。

下载完成后,先安装语音引擎SpeechSDK51.exe,再安装中文语音库SpeechSDK51LangPach.exe。

目前最常用的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支持中英文混读。

2、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);         // 设置朗读速度,取值范围:-1010HRESULT 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);      // 设置音量,范围:0100HRESULT 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表示英文。

4)、设置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表示朗读结束等。
   可以根据需要进行判断使用。

5)、speech sdk语音识别,识别语音生成英文/中文等字符串。

具体参考这篇文章:http://blog.csdn.net/artemisrj/article/details/8723095

3、编程实例

1)、首先将需要将Windows Speech SDK开发包的头文件和库文件所在路径添加到编译器中。

 

2)、封装tts操作类。

//TextToSpeech.h文件

 

 
  1. //tts

  2.  
  3. #pragma once

  4.  
  5. #include <sapi.h> //包含TTS语音引擎头文件和库文件

  6. #include <sphelper.h>

  7. #include <string.h>

  8. #pragma comment(lib, "sapi.lib")

  9.  
  10. class TextToSpeech

  11. {

  12. public:

  13. TextToSpeech(void);

  14. virtual ~TextToSpeech(void);

  15.  
  16. int Init();

  17. int UnInit();

  18.  
  19. //枚举所有语音Token

  20. int EnumAudioToken(CString arrayVoicePackageName[],int nVoicePackageNameCount);

  21.  
  22. //创建SpVoice

  23. int CreateSpVoice();

  24. //释放SpVoice

  25. int DeleteSpVoice();

  26. //重置SpVoice(用于临时清除朗读数据)

  27. int ResetSpVoice();

  28.  
  29. //设置朗读速度(取值范围:-10到10)

  30. int SetRate( long RateAdjust);

  31. //获取朗读速度

  32. int GetRate(long *pRateAdjust);

  33.  
  34. //设置使用的语音库

  35. int SetVoice(ISpObjectToken *pToken);

  36. //获取语音库

  37. int GetVoice(unsigned int nIndex,ISpObjectToken** ppToken);

  38.  
  39. //设置音量(取值范围:0到100)

  40. int SetVolume(USHORT usVolume);

  41. //获取音量

  42. int GetVolume(USHORT *pusVolume);

  43.  
  44. //朗读

  45. int Speak(CString strContent,DWORD dwFlags=SPF_DEFAULT);

  46. //朗读生成文件

  47. int SpeakToWaveFile(CString strContent,char *pFilePathName,DWORD dwFlags=SPF_DEFAULT);

  48. //暂停朗读

  49. int Pause();

  50. //继续朗读

  51. int Resume(); 

  52. //跳过部分朗读

  53.  int Skip(CString strItemType="Sentence",long lNumItems=65535, ULONG *pulNumSkipped=NULL);

  54.  
  55. protected:

  56. IEnumSpObjectTokens * m_pIEnumSpObjectTokens;

  57. ISpObjectToken * m_pISpObjectToken;

  58. ISpVoice * m_pISpVoice;

  59. BOOL m_bComInit;

  60. };

 

 

 

//TextToSpeech.cpp文件

 

 
  1. #include "StdAfx.h"

  2. #include "TextToSpeech.h"

  3.  
  4. TextToSpeech::TextToSpeech(void)

  5. {

  6. m_pIEnumSpObjectTokens = NULL;

  7. m_pISpObjectToken = NULL;

  8. m_pISpVoice = NULL;

  9. m_bComInit = FALSE;

  10. }

  11.  
  12. TextToSpeech::~TextToSpeech(void)

  13. {

  14. }

  15.  
  16. int TextToSpeech::Init()

  17. {

  18. //初始化COM组件

  19. if(FAILED(::CoInitializeEx(NULL,0)))

  20. {

  21. //MessageBox("初始化COM组件失败!", "提示", MB_OK|MB_ICONWARNING);

  22. return -1;

  23. }

  24.  
  25. m_bComInit = TRUE;

  26. return 0;

  27. }

  28.  
  29. int TextToSpeech::UnInit()

  30. {

  31. if(m_bComInit)

  32. {

  33. ::CoUninitialize();

  34. }

  35.  
  36. return 0;

  37. }

  38.  
  39. int TextToSpeech::EnumAudioToken(CString arrayVoicePackageName[],int nVoicePackageNameCount)

  40. {

  41. //枚举所有语音Token

  42. if(SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &m_pIEnumSpObjectTokens)))

  43. {

  44. //得到所有语音Token的个数

  45. ULONG ulTokensNumber = 0;

  46. m_pIEnumSpObjectTokens->GetCount(&ulTokensNumber);

  47.  
  48. //检测该机器是否安装有语音包

  49. if(ulTokensNumber == 0)

  50. {

  51. //MessageBox("该机器没有安装语音包!", "提示", MB_OK|MB_ICONWARNING);

  52. return -1;

  53. }

  54. if(ulTokensNumber > nVoicePackageNameCount)

  55. {

  56. //缓冲区过小

  57. return 0;

  58. }

  59.  
  60. //将语音包的名字加入数组中

  61. CString strVoicePackageName = _T("");

  62. CString strTokenPrefixText = _T("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices\\Tokens\\");

  63. for(ULONG i=0; i<ulTokensNumber; i++)

  64. {

  65. m_pIEnumSpObjectTokens->Item(i, &m_pISpObjectToken);

  66. WCHAR* pChar;

  67. m_pISpObjectToken->GetId(&pChar);

  68. strVoicePackageName = pChar;

  69. strVoicePackageName.Delete(0, strTokenPrefixText.GetLength());

  70. arrayVoicePackageName[i] = strVoicePackageName;

  71. }

  72.  
  73. return ulTokensNumber;

  74. }

  75.  
  76. return -1;

  77. }

  78.  
  79. //创建SpVoice

  80. int TextToSpeech::CreateSpVoice()

  81. {

  82. //获取ISpVoice接口

  83. if(FAILED(CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_INPROC_SERVER, IID_ISpVoice, (void**)&m_pISpVoice)))

  84. {

  85. //MessageBox("获取ISpVoice接口失败!", "提示", MB_OK|MB_ICONWARNING);

  86. return -1;

  87. }

  88.  
  89. return 0;

  90. }

  91. //释放SpVoice

  92. int TextToSpeech::DeleteSpVoice()

  93. {

  94. if(m_pISpVoice != NULL)

  95. {

  96. m_pISpVoice->Release();

  97. }

  98. m_pISpVoice = NULL;

  99.  
  100. return 0;

  101. }

  102. //重置SpVoice

  103. int TextToSpeech::ResetSpVoice()

  104. {

  105. DeleteSpVoice();

  106. return CreateSpVoice();

  107. }

  108.  
  109. //设置朗读速度(取值范围:-10到10)

  110. int TextToSpeech::SetRate( long RateAdjust)

  111. {

  112. if(m_pISpVoice == NULL)

  113. return -1;

  114.  
  115. //设置播放速度

  116. m_pISpVoice->SetRate(RateAdjust);

  117. return 0;

  118. }

  119. //获取朗读速度

  120. int TextToSpeech::GetRate(long *pRateAdjust)

  121. {

  122. if(m_pISpVoice == NULL)

  123. return -1;

  124.  
  125. m_pISpVoice->GetRate(pRateAdjust);

  126. return 0;

  127. }

  128.  
  129. //设置使用的语音库

  130. int TextToSpeech::SetVoice(ISpObjectToken *pToken)

  131. {

  132. if(m_pISpVoice == NULL)

  133. return -1;

  134.  
  135. m_pISpVoice->SetVoice(pToken);

  136. return 0;

  137. }

  138. //获取语音库

  139. int TextToSpeech::GetVoice(unsigned int nIndex,ISpObjectToken** ppToken)

  140. {

  141. if(m_pIEnumSpObjectTokens == NULL)

  142. return -1;

  143.  
  144. //设置语言

  145. m_pIEnumSpObjectTokens->Item(nIndex, ppToken);

  146. m_pISpObjectToken = *ppToken;

  147. return 0;

  148. }

  149.  
  150. //设置音量(取值范围:0到100)

  151. int TextToSpeech::SetVolume(USHORT usVolume)

  152. {

  153. if(m_pISpVoice == NULL)

  154. return -1;

  155.  
  156. //设置音量大小

  157. m_pISpVoice->SetVolume(usVolume);

  158. return 0;

  159. }

  160. //获取音量

  161. int TextToSpeech::GetVolume(USHORT *pusVolume)

  162. {

  163. if(m_pISpVoice == NULL)

  164. return -1;

  165.  
  166. //设置音量大小

  167. m_pISpVoice->GetVolume(pusVolume);

  168. return 0;

  169. }

  170.  
  171. //开始朗读

  172. int TextToSpeech::Speak(CString strContent, DWORD dwFlags)

  173. {

  174. if(m_pISpVoice == NULL)

  175. return -1;

  176.  
  177. //开始进行朗读

  178. HRESULT hSucess = m_pISpVoice->Speak(strContent.AllocSysString(), dwFlags, NULL);

  179.  
  180. return 0;

  181. }

  182. //朗读生成文件

  183. int TextToSpeech::SpeakToWaveFile(CString strContent,char *pFilePathName,DWORD dwFlags)

  184. {

  185. if(m_pISpVoice == NULL || pFilePathName == NULL)

  186. return -1;

  187.  
  188. //生成WAV文件

  189. CComPtr<ISpStream> cpISpStream;

  190. CComPtr<ISpStreamFormat> cpISpStreamFormat;

  191. CSpStreamFormat spStreamFormat;

  192. m_pISpVoice->GetOutputStream(&cpISpStreamFormat);

  193. spStreamFormat.AssignFormat(cpISpStreamFormat);

  194. HRESULT hResult = SPBindToFile(pFilePathName, SPFM_CREATE_ALWAYS,

  195. &cpISpStream, &spStreamFormat.FormatId(), spStreamFormat.WaveFormatExPtr());

  196. if(SUCCEEDED(hResult))

  197. {

  198. m_pISpVoice->SetOutput(cpISpStream, TRUE);

  199. m_pISpVoice->Speak(strContent.AllocSysString(), dwFlags, NULL);

  200. return 0;

  201. //MessageBox("生成WAV文件成功!", "提示", MB_OK);

  202. }

  203. else

  204. {

  205. //MessageBox("生成WAV文件失败!", "提示", MB_OK|MB_ICONWARNING);

  206. return 1;

  207. }

  208. }

  209.  
  210. //暂停朗读

  211. int TextToSpeech::Pause()

  212. {

  213. if(m_pISpVoice != NULL)

  214. {

  215. m_pISpVoice->Pause();

  216. }

  217.  
  218. return 0;

  219. }

  220. //继续朗读

  221. int TextToSpeech::Resume()

  222. {

  223. if(m_pISpVoice != NULL)

  224. {

  225. m_pISpVoice->Resume();

  226. }

  227.  
  228. return 0;

  229. }

//跳过部分朗读 int TextToSpeech::Skip(CString strItemType,long lNumItems, ULONG *pulNumSkipped) {  if(m_pISpVoice == NULL || strItemType.GetLength() == 0)   return -1;

 m_pISpVoice->Skip(strItemType.AllocSysString(), lNumItems,pulNumSkipped);  return 0; }

 

 

 

 

3)调用实例代码。

 
  1. TextToSpeech ttsSpeech;

  2. ttsSpeech.Init();

  3. CString arrayVoicePackageName[50] = {0};

  4. int nVoicePackageNameCount = 50;

  5. int nCount = ttsSpeech.EnumAudioToken(arrayVoicePackageName,nVoicePackageNameCount);

  6. ttsSpeech.CreateSpVoice();

  7. ISpObjectToken* ppToken = NULL;

  8. ttsSpeech.GetVoice(0,&ppToken);

  9. ttsSpeech.SetVoice(ppToken);

  10. ttsSpeech.SetRate(0);

  11. ttsSpeech.SetVolume(100);

  12. ttsSpeech.Speak("我是中国人");

  13. //ttsSpeech.SpeakToWaveFile("我是中国人","d:\\11.wav");

  14. ttsSpeech.DeleteSpVoice();

  15. ttsSpeech.UnInit();

 

4、注意事项

1)、sphelper.h编译错误解决方案

SAPI 包含sphelper.h编译错误解决方案 在使用Microsoft Speech SDK 5.1开发语音识别程序时,包含了头文件“sphelper.h”和库文件“sapi.lib”。编译时出错: 1>c:\program files\microsoft speech sdk 5.1\include\sphelper.h(769): error C4430: missing type specifier - int assumed. Note: C++ does not supportdefault-int 1>c:\program files\microsoft speech sdk5.1\include\sphelper.h(1419) : error C4430: missing type specifier - intassumed. Note: C++ does not support default-int 1>c:\program files\microsoftspeech sdk 5.1\include\sphelper.h(2373) : error C2065: 'psz' : undeclaredidentifier 1>c:\program files\microsoft speech sdk5.1\include\sphelper.h(2559) : error C2440: 'initializing' : cannot convert from'CSpDynamicString' to 'SPPHONEID *' 1> No user-defined-conversion operatoravailable that can perform this conversion, or the operator cannot be called1>c:\program files\microsoft speech sdk 5.1\include\sphelper.h(2633) : errorC2664: 'wcslen' : cannot convert parameter 1 from 'SPPHONEID *' to 'constwchar_t *' 1> Types pointed to are unrelated; conversion requiresreinterpret_cast, C-style cast or function-style cast 搜索了一圈,根据大家的经验汇总,应该是Speech代码编写时间太早,语法不严密。而VS2008对于语法检查非常严格,导致编译无法通过。修改头文件中的以下行即可正常编译:

 Ln769 const ulLenVendorPreferred = wcslen(pszVendorPreferred);

             const unsigned long ulLenVendorPreferred = wcslen(pszVendorPreferred);

Ln 1418static CoMemCopyWFEX(const WAVEFORMATEX * pSrc, WAVEFORMATEX ** ppCoMemWFEX)

              static HRESULT CoMemCopyWFEX(const WAVEFORMATEX * pSrc, WAVEFORMATEX ** ppCoMemWFEX)

Ln 2372for (const WCHAR * psz = (const WCHAR *)lParam; *psz; psz++) {}

             const WCHAR * psz; for (psz = (const WCHAR *)lParam; *psz; psz++) {}

Ln 2559SPPHONEID* pphoneId = dsPhoneId;

              SPPHONEID* pphoneId = (SPPHONEID*)((WCHAR *)dsPhoneId);

Ln 2633pphoneId += wcslen(pphoneId) + 1;

              pphoneId+= wcslen((const wchar_t *)pphoneId) + 1; 

 

2)、Speak指定为SPF_ASYNC(异步)时,不要过早的释放ISpVoice对象,否则就没有声音,因为ISpVoice生命周期结束了,就不会播放。一般将ISpVoice对象放到类的成员变量中,类析构时才释放ISpVoice对象。

3)、Speak第一次朗读时很慢,因为加载引擎需要一段时间,可以使用线程预先Speak("",SPF_ASYNC)而加载引擎,但需要注意的是在初始化COM的时候使用CoInitializeEx,而不要使用CoInitialize。

https://blog.csdn.net/byxdaz/article/details/78443954

代码下载

C#使用微软TTS语音引擎实现文字转语音示例

 

转载:http://www.mzwu.com/article.asp?id=3845
在VS2012创建Windows窗体应用程序项目,添加引用COM组件Microsoft Speech Object Library:



TTS除了可以用于文字转语音,还可以将语音保存成文件,代码如下:

复制内容到剪贴板程序代码

using System;
using System.Threading;
using System.Windows.Forms;
using SpeechLib;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        private void btnSpeak_Click(object sender, EventArgs e)
        {
            SpVoice voice = new SpVoice();
            voice.Rate = -5; //语速,[-10,10]
            voice.Volume = 100; //音量,[0,100]
            voice.Voice = voice.GetVoices().Item(0); //语音库
            voice.Speak("木子屋网址:www.mzwu.com");
        }

        private void btnSave_Click(object sender, EventArgs e)
        {            
            SpFileStream stream = new SpFileStream();
            stream.Open(@"F:\voice.wav", SpeechStreamFileMode.SSFMCreateForWrite, false);
            SpVoice voice = new SpVoice();
            voice.AudioOutputStream = stream;
            voice.Speak("0,1,2,3,4,5,6,7,8,9");
            voice.WaitUntilDone(Timeout.Infinite);
            stream.Close();
            MessageBox.Show("ok");
        }
    }
}

 




参考资料

[1].visual c#怎么使用tts:http://zhidao.baidu.com/question/93308685.html
[2].c#之TTS发音程序:http://blog.csdn.net/kkfdsa132/article/details/5394700
[3].关于Microsoft Speech SDK 中TTS的研究 [转]:http://www.cnblogs.com/lxinxuan/archive/2007/03/17/678606.html
[4].Speech两种使用方法:http://www.cnblogs.com/MaxIE/p/3159994.html
[5].微软TTS语音引擎编程入门:http://www.jizhuomi.com/software/135.html
[6].SpVoice Interface (SAPI 5.4):http://msdn.microsoft.com/en-us/library/ee125640.aspx 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44821.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

好物推荐:文字转语音朗读软件哪个好?

不知道大家有没有像我一样的&#xff0c;对“语音播放”、“语音朗读”是又爱又恨的。有时工作繁忙&#xff0c;而同事或客户发来语音资料需要整理时&#xff0c;就会很烦躁&#xff0c;因为语音的整理起来比文字的繁琐一些。而像有时在家休息&#xff0c;还得看一些资料时&…

分享5个宝藏文字转语音配音软件,错过太可惜

经常看到有人问如何将文字转成语音&#xff0c;以及配音软件&#xff1f;什么样的配音工具可以做到堪比真人&#xff1f;文字转语音操作起来难不难&#xff1f;新手小白不会用怎么配音呢&#xff1f; 在测试了几十款款文字转语音工具后&#xff0c;最终给选出了下面这5款超好用…

文字转语音朗读如何操作?手把手教你如何将文字转语音

有些小伙伴喜欢在闲暇时间看小说来打发时间&#xff0c;特别是上下班通勤这个时间段&#xff0c;不过每当这个时候都是高峰期&#xff0c;经常出现腾不开手看小说的现象&#xff0c;所以面对这种情况&#xff0c;有声小说就是一个不错的选择。 但有时喜欢的小说比较小众&#…

[nlp] 车载语音助手

多轮对话机器之话题意图识别_Congqing He的博客-CSDN博客 https://www.csdn.net/tags/MtTakgwsMTc3MjItYmxvZwO0O0OO0O0O.html 智能座舱系列六:一文读懂车载语音系统_对话_车机_云端 车载语音助手的人机交互的流程: ASR系统,可以接受用户发起的语音对话的音频输入,并给出…

chatgpt赋能python:Python电影票订购系统——方便快捷的电影票购买方式

Python电影票订购系统——方便快捷的电影票购买方式 电影是现代社会不可或缺的一部分&#xff0c;人们往往在闲暇之余去电影院欣赏一部好片&#xff0c;来放松身心。然而&#xff0c;电影院在繁忙时期往往出现票源紧张、排队时间长等问题&#xff0c;给观影体验带来不便。此时…

手机上的python怎么运行,python在手机上怎么操作

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python在手机上怎么操作&#xff0c;手机上的python怎么运行&#xff0c;现在让我们一起来看看吧&#xff01; 1、手机浏览器运行python 手机浏览器运行python是因为手机浏览器和python两者之间是可以互相兼容的&#…

嵌入式音视频疑惑汇总(持续更新)

小小的脑袋里&#xff0c;大大的疑问&#xff0c;该文是博主在工作中遇见问题后&#xff0c;主要面向chatGPT学习的记录笔记 1、bypass hdr 是什么&#xff1f; “Bypass HDR” 是指绕过高动态范围&#xff08;HDR&#xff09;功能的一种设置。HDR 是指一种显示技术&#xff0…

chatgpt赋能python:Python是一种广泛使用的高级编程语言,具有灵活性和易读性。借助Python可以编写各种应用和工具,其中包括用于搜索引擎优化(SEO)的应用和工具。在本文中,我们将探

Python是一种广泛使用的高级编程语言&#xff0c;具有灵活性和易读性。借助Python可以编写各种应用和工具&#xff0c;其中包括用于搜索引擎优化&#xff08;SEO&#xff09;的应用和工具。在本文中&#xff0c;我们将探讨如何配置Python以进行SEO&#xff0c;并介绍一些关键的…

chatgpt赋能python:Python运行机制及其在SEO中应用的探析

Python运行机制及其在SEO中应用的探析 Python是一种广泛应用于各类工程、数据分析、人工智能以及网络开发领域的高级编程语言&#xff0c;因其便捷易用、高效稳定等特点而深受开发者和用户的喜爱。然而&#xff0c;Python在SEO中究竟能扮演怎样的角色及其优缺点又是如何呢&…

chatgpt赋能python:Python免费版:解读Python知识的必备利器

Python免费版&#xff1a;解读Python知识的必备利器 如果你想要学习程序开发&#xff0c;你一定会听说过Python。作为一种高级编程语言&#xff0c;Python已经被广泛应用于Web开发、数据分析、科学计算和人工智能等领域。但是&#xff0c;如果你刚刚入门&#xff0c;你可能会被…

chatgpt赋能python:简单Python游戏:加深Python语言学习、锻炼编程思维

简单Python游戏&#xff1a;加深Python语言学习、锻炼编程思维 Python是一种极为流行的编程语言&#xff0c;用于许多不同的领域和行业&#xff0c;包括Web开发、机器学习、数据分析和游戏开发等。Python语言的简洁性和易读性使它成为初学者和专业开发者的首选。在本文中&…

chatgpt赋能python:Python同一个类中的函数如何相互调用

Python同一个类中的函数如何相互调用 在Python的面向对象编程中&#xff0c;一个类通常包含多个函数&#xff0c;这些函数相互独立&#xff0c;但在某些情况下需要相互调用。那么&#xff0c;Python同一个类中的函数如何相互调用呢&#xff1f;下面我们来一探究竟。 什么是函…

chatgpt赋能python:Python后退对SEO的影响

Python后退对SEO的影响 Python作为一种流行的编程语言&#xff0c;在各种应用场景中都有着广泛的应用。但是&#xff0c;对于一些需要考虑SEO优化的网站来说&#xff0c;Python后退往往被认为是一个不利因素。那么&#xff0c;Python后退对SEO究竟有什么影响&#xff0c;我们来…

chatgpt赋能python:Python电影数据爬取:探索电影世界的数据

Python电影数据爬取&#xff1a;探索电影世界的数据 Python是一个出色的编程语言&#xff0c;可以应对各种需要数据分析和处理的任务。在这篇文章中&#xff0c;我们将讨论使用Python爬取电影数据的方法&#xff0c;以及如何使用这些数据来分析和发现有趣的信息。本文将着重介…

chatgpt赋能python:Python能连续赋值吗?

Python能连续赋值吗&#xff1f; Python是一种高级编程语言&#xff0c;广泛用于各种程序设计领域。它有许多优秀的特性&#xff0c;如动态类型、高级数据结构和灵活的语法。其中一个极为方便的特性就是连续赋值&#xff0c;也称为“多重赋值”。 什么是连续赋值&#xff1f;…

chatgpt赋能python:Python处理雷达数据

Python处理雷达数据 雷达技术是一种主要用于测量目标距离、速度和方位的技术。在雷达系统中&#xff0c;雷达接收器接收到的信号经过一系列的处理才能得到有效的数据。在这一过程中&#xff0c;Python语言得到了广泛应用。本文将介绍Python如何处理雷达数据。 雷达数据的格式…

chatgpt赋能python:Python奇偶性判断:一探究竟

Python奇偶性判断&#xff1a;一探究竟 Python是一种流行的编程语言&#xff0c;使编写代码变得容易。它的语法简单&#xff0c;易于理解&#xff0c;因此很受程序员的欢迎。Python还具有很多小技巧&#xff0c;其中之一是它的奇偶性判断。在本篇文章中&#xff0c;我们将介绍…

AIGC迈向通用人工智能时代

一、AIGC“起飞”的背后 2023年1月30日&#xff0c;AIGC概念股突飞猛涨。一时间&#xff0c;AIGC再次站上风口浪尖。 AIGC&#xff08;AI Generated Content&#xff09;是指利用人工智能技术来生成内容&#xff0c;被认为是继UGC、PGC之后的新型内容生产方式&#xff0c;常见…

AIGC 未来已来——迈向通用人工智能时代

AIGC的各大门派是谁&#xff1f;典型技术都有什么&#xff1f; AIGC为什么在绘画领域先破圈&#xff1f;ChatGPT的有哪些局限性&#xff1f; 为何科技企业争相推出大模型&#xff1f; 人类的创新能力会被AIGC取代吗…… 诸如此类的这些话题呈现爆发性增长&#xff0c;频频被科技…

冒冷汗.... GPT-5 已经看完了人类世界所有视频

比GPT4更强大的AI系统训练已经完成。 目前最新的消息是GPT5已经爬完&#xff08;准确的说叫做看完&#xff09;了人类网络上所有的视频(大约2000PB的容量)&#xff0c;可以瞬间标记出所有它看过的视频中的一切声光信息。准确到每一秒都行。 打个比方&#xff0c;如果在75亿人当…