【开发实例】C#调用SAPI实现语音合成的两种方法_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 【开发实例】C#调用SAPI实现语音合成的两种方法

【开发实例】C#调用SAPI实现语音合成的两种方法

 2014/6/30 18:28:23  GC2013  程序员俱乐部  我要评论(0)
  • 摘要:我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种:1、使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑。(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了)2、使用WIN7的windowsapi,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑。其实不管是哪一种,都是调用SAPI
  • 标签:C# 方法 API 实现 开发 实例 SAP 开发实例
我们都知道现在的语音合成TTS是可以通过微软的SAPI实现的,好处我就不多说了,方便而已,因为在微软的操作系统里面就自带了这个玩意,主要的方式有两种:class="Apple-converted-space">  1、使用COM组件技术,不管是C++,C#,Delphi都能玩的转,开发出来的东西在XP和WIN7都能跑。(要引入SpeechLib,好像在项目上点引用,然后选到系统COM吧,好久没弄,记不清楚了)  2、使用WIN7的windows api,其实最终还是调用了SAPI,所以开发出来的东西就只能在WIN7上面跑。  其实不管是哪一种,都是调用SAPI,可能后一种代码比较简单,使用已经安装的TTS引擎,现在一般用NeoSpeech,这个就不解释了,太强大了这个发音。。。  COM组件技术:  C#代码 javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash">instance()%20%0A%7B%20%0Aif%20(_Instance%20%3D%3D%20null)%20%0A_Instance%20%3D%20new%20Speach()%20%3B%20%0Areturn%20_Instance%20%3B%20%0A%7D%0A%0Aprivate%20void%20SetChinaVoice()%20%0A%7B%20%0Avoice.Voice%20%3D%20voice.GetVoices(string.Empty%2Cstring.Empty).Item(0)%20%3B%20%0A%7D%20%0A%0Aprivate%20void%20SetEnglishVoice()%20%0A%7B%20%0Avoice.Voice%20%3D%20voice.GetVoices(string.Empty%2Cstring.Empty).Item(1)%20%3B%20%0A%7D%20%0A%0Aprivate%20void%20SpeakChina(string%20strSpeak)%20%0A%7B%20%0ASetChinaVoice()%20%3B%20%0ASpeak(strSpeak)%20%3B%20%0A%7D%20%0A%0Aprivate%20void%20SpeakEnglishi(string%20strSpeak)%20%0A%7B%20%0ASetEnglishVoice()%20%3B%20%0ASpeak(strSpeak)%20%3B%20%0A%7D%20%0A%0A%0A%0Apublic%20void%20AnalyseSpeak(string%20strSpeak)%20%0A%7B%20%0Aint%20iCbeg%20%3D%200%20%3B%20%0Aint%20iEbeg%20%3D%200%20%3B%20%0Abool%20IsChina%20%3D%20true%20%3B%20%0Afor(int%20i%3D0%3Bi%3CstrSpeak.Length%3Bi%2B%2B)%20%0A%7B%20%0Achar%20chr%20%3D%20strSpeak%5Bi%5D%20%3B%20%0Aif%20(IsChina)%20%0A%7B%20%0Aif%20(chr%3C%3D122%26%26chr%3E%3D65)%20%0A%7B%20%0Aint%20iLen%20%3D%20i%20-%20iCbeg%20%3B%20%0Astring%20strValue%20%3D%20strSpeak.Substring(iCbeg%2CiLen)%20%3B%20%0ASpeakChina(strValue)%20%3B%20%0AiEbeg%20%3D%20i%20%3B%20%0AIsChina%20%3D%20false%20%3B%20%0A%7D%20%0A%7D%20%0Aelse%20%0A%7B%20%0Aif%20(chr%3E122%7C%7Cchr%3C65)%20%0A%7B%20%0Aint%20iLen%20%3D%20i%20-%20iEbeg%20%3B%20%0Astring%20strValue%20%3D%20strSpeak.Substring(iEbeg%2CiLen)%20%3B%20%0Athis.SpeakEnglishi(strValue)%20%3B%20%0AiCbeg%20%3D%20i%20%3B%20%0AIsChina%20%3D%20true%20%3B%20%0A%7D%20%0A%7D%20%0A%7D%2F%2Fend%20for%20%0Aif%20(IsChina)%20%0A%7B%20%0Aint%20iLen%20%3D%20strSpeak.Length%20-%20iCbeg%20%3B%20%0Astring%20strValue%20%3D%20strSpeak.Substring(iCbeg%2CiLen)%20%3B%20%0ASpeakChina(strValue)%20%3B%20%0A%7D%20%0Aelse%20%0A%7B%20%0Aint%20iLen%20%3D%20strSpeak.Length%20-%20iEbeg%20%3B%20%0Astring%20strValue%20%3D%20strSpeak.Substring(iEbeg%2CiLen)%20%3B%20%0ASpeakEnglishi(strValue)%20%3B%20%0A%7D%20%0A%7D%20%0A%0Aprivate%20void%20BuildSpeach()%20%0A%7B%20%0Aif%20(voice%20%3D%3D%20null)%20%0Avoice%20%3D%20new%20SpVoiceClass()%20%3B%20%0A%7D%0A%0Apublic%20int%20Volume%20%0A%7B%20%0Aget%20%0A%7B%20%0Areturn%20voice.Volume%20%3B%20%0A%7D%20%0A%0Aset%20%0A%7B%20%0Avoice.SetVolume((ushort)(value))%20%3B%20%0A%7D%20%0A%7D%20%0A%0Apublic%20int%20Rate%20%0A%7B%20%0Aget%20%0A%7B%20%0Areturn%20voice.Rate%20%3B%20%0A%7D%20%0Aset%20%0A%7B%20%0Avoice.SetRate(value)%20%3B%20%0A%7D%20%0A%7D%20%0A%0Aprivate%20void%20Speak(string%20strSpeack)%20%0A%7B%20%0Atry%20%0A%7B%20%0Avoice.Speak(strSpeack%2CSpeechVoiceSpeakFlags.SVSFlagsAsync)%20%3B%20%0A%7D%20%0Acatch(Exception%20err)%20%0A%7B%20%0Athrow(new%20Exception(%22%E5%8F%91%E7%94%9F%E4%B8%80%E4%B8%AA%E9%94%99%E8%AF%AF%EF%BC%9A%22%2Berr.Message))%20%3B%20%0A%7D%20%0A%7D%20%0A%0Apublic%20void%20Stop()%20%0A%7B%20%0Avoice.Speak(string.Empty%2CSpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak)%20%3B%20%0A%7D%20%0A%0Apublic%20void%20Pause()%20%0A%0A%7B%20%0Avoice.Pause()%20%3B%20%0A%7D%20%0A%0Apublic%20void%20Continue()%20%0A%7B%20%0Avoice.Resume()%20%3B%20%0A%7D%20%0A%7D%2F%2Fend%20class%20%0A" />ways" /> 收藏代码
  1. public class Speach   
  2. {   
  3. private static Speach _Instance = null ;   
  4. private SpeechLib.SpVoiceClass voice =null; //SAPI5.1  
  5. private SpeechLib.SpVoice voice = null;//SAPI 5.4  
  6. private Speach()   
  7. {   
  8. BuildSpeach() ;   
  9. }   
  10. public static Speach instance()   
  11. {   
  12. if (_Instance == null)   
  13. _Instance = new Speach() ;   
  14. return _Instance ;   
  15. }  
  16.   
  17. private void SetChinaVoice()   
  18. {   
  19. voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ;   
  20. }   
  21.   
  22. private void SetEnglishVoice()   
  23. {   
  24. voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ;   
  25. }   
  26.   
  27. private void SpeakChina(string strSpeak)   
  28. {   
  29. SetChinaVoice() ;   
  30. Speak(strSpeak) ;   
  31. }   
  32.   
  33. private void SpeakEnglishi(string strSpeak)   
  34. {   
  35. SetEnglishVoice() ;   
  36. Speak(strSpeak) ;   
  37. }   
  38.   
  39.   
  40.   
  41. public void AnalyseSpeak(string strSpeak)   
  42. {   
  43. int iCbeg = 0 ;   
  44. int iEbeg = 0 ;   
  45. bool IsChina = true ;   
  46. for(int i=0;i<strSpeak.Length;i++)   
  47. {   
  48. char chr = strSpeak[i] ;   
  49. if (IsChina)   
  50. {   
  51. if (chr<=122&&chr>=65)   
  52. {   
  53. int iLen = i - iCbeg ;   
  54. string strValue = strSpeak.Substring(iCbeg,iLen) ;   
  55. SpeakChina(strValue) ;   
  56. iEbeg = i ;   
  57. IsChina = false ;   
  58. }   
  59. }   
  60. else   
  61. {   
  62. if (chr>122||chr<65)   
  63. {   
  64. int iLen = i - iEbeg ;   
  65. string strValue = strSpeak.Substring(iEbeg,iLen) ;   
  66. this.SpeakEnglishi(strValue) ;   
  67. iCbeg = i ;   
  68. IsChina = true ;   
  69. }   
  70. }   
  71. }//end for   
  72. if (IsChina)   
  73. {   
  74. int iLen = strSpeak.Length - iCbeg ;   
  75. string strValue = strSpeak.Substring(iCbeg,iLen) ;   
  76. SpeakChina(strValue) ;   
  77. }   
  78. else   
  79. {   
  80. int iLen = strSpeak.Length - iEbeg ;   
  81. string strValue = strSpeak.Substring(iEbeg,iLen) ;   
  82. SpeakEnglishi(strValue) ;   
  83. }   
  84. }   
  85.   
  86. private void BuildSpeach()   
  87. {   
  88. if (voice == null)   
  89. voice = new SpVoiceClass() ;   
  90. }  
  91.   
  92. public int Volume   
  93. {   
  94. get   
  95. {   
  96. return voice.Volume ;   
  97. }   
  98.   
  99. set   
  100. {   
  101. voice.SetVolume((ushort)(value)) ;   
  102. }   
  103. }   
  104.   
  105. public int Rate   
  106. {   
  107. get   
  108. {   
  109. return voice.Rate ;   
  110. }   
  111. set   
  112. {   
  113. voice.SetRate(value) ;   
  114. }   
  115. }   
  116.   
  117. private void Speak(string strSpeack)   
  118. {   
  119. try   
  120. {   
  121. voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ;   
  122. }   
  123. catch(Exception err)   
  124. {   
  125. throw(new Exception("发生一个错误:"+err.Message)) ;   
  126. }   
  127. }   
  128.   
  129. public void Stop()   
  130. {   
  131. voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak) ;   
  132. }   
  133.   
  134. public void Pause()   
  135.   
  136. {   
  137. voice.Pause() ;   
  138. }   
  139.   
  140. public void Continue()   
  141. {   
  142. voice.Resume() ;   
  143. }   
  144. }//end class   
在 private SpeechLib.SpVoiceClass voice =null;这里,我们定义个一个用来发音的类,并且在第一次调用该类时,对它用BuildSpeach方法进行了初始化。 
我们还定义了两个属性Volume和Rate,能够设置音量和语速。 
我们知道,SpVoiceClass 有一个Speak方法,我们发音主要就是给他传递一个字符串,它负责读出该字符串,如下所示。 
C#代码  收藏代码
  1. private void Speak(string strSpeack)   
  2. {   
  3. try   
  4. {   
  5. voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ;   
  6. }   
  7. catch(Exception err)   
  8. {   
  9. throw(new Exception("发生一个错误:"+err.Message)) ;   
  10. }  
  11. }   
第二种使用.NET类库和系统API的代码如下:  C#代码 Beta%0A%7B%0A%20%20%20%20public%20class%20SRead%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20public%20SpeechSynthesizer%20synth%3B%20%2F%2F%E8%AF%AD%E9%9F%B3%E5%90%88%E6%88%90%E5%AF%B9%E8%B1%A1%0A%20%20%20%20%20%20%20%20public%20SRead()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20synth%20%3D%20new%20SpeechSynthesizer()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20public%20SRead(int%20m%2C%20int%20n)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BD%BF%E7%94%A8%20synth%20%E8%AE%BE%E7%BD%AE%E6%9C%97%E8%AF%BB%E9%9F%B3%E9%87%8F%20%5B%E8%8C%83%E5%9B%B4%200%20~%20100%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20synth.Volume%20%3D%20m%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BD%BF%E7%94%A8%20synth%20%E8%AE%BE%E7%BD%AE%E6%9C%97%E8%AF%BB%E9%A2%91%E7%8E%87%20%5B%E8%8C%83%E5%9B%B4%20-10%20~%2010%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20synth.Rate%20%3D%20n%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20public%20void%20SpeakChina(string%20ggg)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FSpVoice%20Voice%20%3D%20new%20SpVoice()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20synth.SelectVoice(%22Microsoft%20Lili%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FVoice.Speak(ggg%2C%20SpFlags)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20synth.SpeakAsync(ggg)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FString%20speechPeople%20%3D%20synth.Voice%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BD%BF%E7%94%A8%20synth%20%E8%AE%BE%E7%BD%AE%E6%9C%97%E8%AF%BB%E9%9F%B3%E9%87%8F%20%5B%E8%8C%83%E5%9B%B4%200%20~%20100%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20synth.Volume%20%3D%2080%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BD%BF%E7%94%A8%20synth%20%E8%AE%BE%E7%BD%AE%E6%9C%97%E8%AF%BB%E9%A2%91%E7%8E%87%20%5B%E8%8C%83%E5%9B%B4%20-10%20~%2010%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20%20%20%20%20%20synth.Rate%20%3D%200%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%E4%BD%BF%E7%94%A8synth%20%E5%90%88%E6%88%90%20wav%20%E9%9F%B3%E9%A2%91%E6%96%87%E4%BB%B6%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2Fsynth.SetOutputToWaveFile(string%20path)%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20public%20void%20SpeakEnglish(string%20ggg)%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%2F%2FSpVoice%20Voice%20%3D%20new%20SpVoice()%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20synth.SelectVoice(%22VW%20Julie%22)%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20synth.Speak(ggg)%3B%20%2F%2Fggg%E4%B8%BA%E8%A6%81%E5%90%88%E6%88%90%E7%9A%84%E5%86%85%E5%AE%B9%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20public%20int%20m%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20synth.Volume%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20set%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20synth.Volume%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20public%20int%20n%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20synth.Rate%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20set%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20synth.Rate%20%3D%20value%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%7D%0A" /> 收藏代码
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Speech.Synthesis;  
  6. using System.Speech;  
  7.   
  8. namespace StudyBeta  
  9. {  
  10.     public class SRead  
  11.     {  
  12.         public SpeechSynthesizer synth; //语音合成对象  
  13.         public SRead()  
  14.         {  
  15.             synth = new SpeechSynthesizer();  
  16.         }  
  17.         public SRead(int m, int n)  
  18.         {  
  19.             //使用 synth 设置朗读音量 [范围 0 ~ 100]  
  20.             synth.Volume = m;  
  21.             //使用 synth 设置朗读频率 [范围 -10 ~ 10]  
  22.             synth.Rate = n;  
  23.         }  
  24.         public void SpeakChina(string ggg)  
  25.         {  
  26.             //SpVoice Voice = new SpVoice();  
  27.             synth.SelectVoice("Microsoft Lili");  
  28.             //Voice.Speak(ggg, SpFlags);  
  29.             synth.SpeakAsync(ggg);  
  30.             //String speechPeople = synth.Voice;  
  31.             //使用 synth 设置朗读音量 [范围 0 ~ 100]  
  32.             // synth.Volume = 80;  
  33.             //使用 synth 设置朗读频率 [范围 -10 ~ 10]  
  34.             //      synth.Rate = 0;  
  35.             //使用synth 合成 wav 音频文件:  
  36.             //synth.SetOutputToWaveFile(string path);  
  37.         }  
  38.         public void SpeakEnglish(string ggg)  
  39.         {  
  40.             //SpVoice Voice = new SpVoice();  
  41.             synth.SelectVoice("VW Julie");  
  42.             synth.Speak(ggg); //ggg为要合成的内容  
  43.         }  
  44.         public int m  
  45.         {  
  46.             get  
  47.             {  
  48.                 return synth.Volume;  
  49.             }  
  50.             set  
  51.             {  
  52.                 synth.Volume = value;  
  53.             }  
  54.         }  
  55.         public int n  
  56.         {  
  57.             get  
  58.             {  
  59.                 return synth.Rate;  
  60.             }  
  61.             set  
  62.             {  
  63.                 synth.Rate = value;  
  64.             }  
  65.         }  
  66. }  
 
上一篇: [DevExpress]设置RepositoryItemComboBox只可下拉选择不可编辑 下一篇: 没有下一篇了!
发表评论
用户名: 匿名