偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#英文語(yǔ)音合成與中文語(yǔ)音識(shí)別技術(shù)

開發(fā) 后端
在.NET中,C#英文語(yǔ)音有較好的實(shí)現(xiàn),但是對(duì)中文語(yǔ)音的支持還沒有加入進(jìn)來,我們要想實(shí)現(xiàn)中文發(fā)音或中文語(yǔ)音識(shí)別。

C#英文語(yǔ)音合成與中文語(yǔ)音識(shí)別技術(shù)的實(shí)現(xiàn),先安裝微軟的Speech Application SDK(SASDK),它的***版本是 SAPI 5.1 他能夠識(shí)別中、日、英三種語(yǔ)言,你可以在這里下載:http://www.microsoft.com/speech/download/sdk51/,需要安裝這兩個(gè)文件Speech SDK 5.1和5.1 Language Pack,其中5.1 Language Pack可以選擇安裝支持的語(yǔ)言。

安裝好以后,我們就可以開始進(jìn)行語(yǔ)音程序的開發(fā)了,當(dāng)然,在這之前我們需要把SAPI.dll通過如下圖所示添加到引用中

下面我們?cè)O(shè)計(jì)一個(gè)能夠朗讀中英文混合語(yǔ)言的類:

我們將用單例模式實(shí)現(xiàn)該類,類的代碼如下,我們將詳細(xì)解釋:

  1. public class Speach   
  2. {   
  3. private static Speach _Instance = null ;   
  4. private SpeechLib.SpVoiceClass voice =null;   
  5. private Speach()   
  6. {   
  7. BuildSpeach() ;   
  8. }   
  9. public static Speach instance()   
  10. {   
  11. if (_Instance == null)   
  12. _Instance = new Speach() ;   
  13. return _Instance ;   
  14. }   
  15. private void SetChinaVoice()   
  16. {   
  17. voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ;   
  18. }   
  19. private void SetEnglishVoice()   
  20. {   
  21. voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ;   
  22. }   
  23. private void SpeakChina(string strSpeak)   
  24. {   
  25. SetChinaVoice() ;   
  26. Speak(strSpeak) ;   
  27. }   
  28. private void SpeakEnglishi(string strSpeak)   
  29. {   
  30. SetEnglishVoice() ;   
  31. Speak(strSpeak) ;   
  32. }   
  33. public void AnalyseSpeak(string strSpeak)   
  34. {   
  35. int iCbeg = 0 ;   
  36. int iEbeg = 0 ;   
  37. bool IsChina = true ;   
  38. for(int i=0;i
  39. {   
  40. char chr = strSpeak[i] ;   
  41. if (IsChina)   
  42. {   
  43. if (chr<=122&&chr>=65)   
  44. {   
  45. int iLen = i - iCbeg ;   
  46. string strValue = strSpeak.Substring(iCbeg,iLen) ;   
  47. SpeakChina(strValue) ;   
  48. iEbeg = i ;   
  49. IsChina = false ;   
  50. }   
  51. }   
  52. else   
  53. {   
  54. if (chr>122||chr<65)   
  55. {   
  56. int iLen = i - iEbeg ;   
  57. string strValue = strSpeak.Substring(iEbeg,iLen) ;   
  58. this.SpeakEnglishi(strValue) ;   
  59. iCbeg = i ;   
  60. IsChina = true ;   
  61. }   
  62. }   
  63. }//end for   
  64. if (IsChina)   
  65. {   
  66. int iLen = strSpeak.Length - iCbeg ;   
  67. string strValue = strSpeak.Substring(iCbeg,iLen) ;   
  68. SpeakChina(strValue) ;   
  69. }   
  70. else   
  71. {   
  72. int iLen = strSpeak.Length - iEbeg ;   
  73. string strValue = strSpeak.Substring(iEbeg,iLen) ;   
  74. SpeakEnglishi(strValue) ;   
  75. }   
  76. }   
  77. private void BuildSpeach()   
  78. {   
  79. if (voice == null)   
  80. voice = new SpVoiceClass() ;   
  81. }   
  82. public int Volume   
  83. {   
  84. get   
  85. {   
  86. return voice.Volume ;   
  87. }   
  88. set   
  89. {   
  90. voice.SetVolume((ushort)(value)) ;   
  91. }   
  92. }   
  93. public int Rate   
  94. {   
  95. get   
  96. {   
  97. return voice.Rate ;   
  98. }   
  99. set   
  100. {   
  101. voice.SetRate(value) ;   
  102. }   
  103. }   
  104. private void Speak(string strSpeack)   
  105. {   
  106. try   
  107. {   
  108. voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ;   
  109. }   
  110. catch(Exception err)   
  111. {   
  112. throw(new Exception("發(fā)生一個(gè)錯(cuò)誤:"+err.Message)) ;   
  113. }   
  114. }   
  115. public void Stop()   
  116. {   
  117. voice.Speak(string.Empty,SpeechLib.SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak) ;   
  118. }   
  119. public void Pause()   
  120. {   
  121. voice.Pause() ;   
  122. }   
  123. public void Continue()   
  124. {   
  125. voice.Resume() ;   
  126. }   
  127. }//end class   
  128. 在 private SpeechLib.SpVoiceClass voice =null;這里,我們定義個(gè)一個(gè)用來發(fā)音的類,并且在第一次調(diào)用該類時(shí),對(duì)它用BuildSpeach方法進(jìn)行了初始化。   
  129. 我們還定義了兩個(gè)屬性Volume和Rate,能夠設(shè)置音量和語(yǔ)速。   
  130. 我們知道,SpVoiceClass 有一個(gè)Speak方法,我們發(fā)音主要就是給他傳遞一個(gè)字符串,它負(fù)責(zé)讀出該字符串,如下所示。   
  131.  
  132. private void Speak(string strSpeack)   
  133. {   
  134. try   
  135. {   
  136. voice.Speak(strSpeack,SpeechVoiceSpeakFlags.SVSFlagsAsync) ;   
  137. }   
  138. catch(Exception err)   
  139. {   
  140. throw(new Exception("發(fā)生一個(gè)錯(cuò)誤:"+err.Message)) ;   
  141. }   
  142. }  

其中SpeechVoiceSpeakFlags.SVSFlagsAsync表示異步發(fā)音。

但是,這個(gè)方法本身并不知道你給的字符串是什么語(yǔ)言,所以需要我們它這個(gè)字符串用什么語(yǔ)言讀出。SpVoiceClass 類的Voice 屬性就是用來設(shè)置語(yǔ)種的,我們可以通過SpVoiceClass 的GetVoices方法得到所有的語(yǔ)種列表,然后在根據(jù)參數(shù)選擇相應(yīng)的語(yǔ)種,比如設(shè)置語(yǔ)種為漢語(yǔ)如下所示:

  1. private void SetChinaVoice()   
  2. {   
  3. voicevoice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ;   
  4. }  

0表示是漢用,1234都表示英語(yǔ),就是口音不同。

這樣,我們就設(shè)置了語(yǔ)種,如果結(jié)合發(fā)音方法,我們就可以設(shè)計(jì)出一個(gè)只發(fā)漢語(yǔ)語(yǔ)音的方法

  1. private void SpeakChina(string strSpeak)   
  2. {   
  3. SetChinaVoice() ;   
  4. Speak(strSpeak) ;   
  5. }  

只發(fā)英語(yǔ)語(yǔ)音的方法也是類似的,上面程序里有。

對(duì)于一段中英文混合的語(yǔ)言,我們讓程序讀出混合語(yǔ)音的方法就是:編程把這段語(yǔ)言的中英文分開,對(duì)于中文調(diào)用SpeakChina方法,英文調(diào)用SpeakEnglishi方法;至于怎樣判斷一個(gè)字符是英文還是中文,我采用的是判斷asc碼的方法,具體的類方法是通過AnalyseSpeak實(shí)現(xiàn)的。

這樣,對(duì)于一段中英文混合文字,我們只需把它作為參數(shù)傳遞給AnalyseSpeak就可以了,他能夠完成中英文的混合發(fā)音。

當(dāng)然,對(duì)于發(fā)音的暫定、繼續(xù)、停止等操作,上面也給出了簡(jiǎn)單的方法調(diào)用,很容易明白。

下面簡(jiǎn)單介紹一下C#英文、中文語(yǔ)音識(shí)別的方法:

先把該語(yǔ)音識(shí)別的類源代碼貼在下面,然后再做說明:

  1. public class SpRecognition   
  2. {   
  3. private static SpRecognition _Instance = null ;   
  4. private SpeechLib.ISpeechRecoGrammar isrg ;   
  5. private SpeechLib.SpSharedRecoContextClass ssrContex =null;   
  6. private System.Windows.Forms.Control cDisplay ;   
  7. private SpRecognition()   
  8. {   
  9. ssrContex = new SpSharedRecoContextClass() ;   
  10. isrg = ssrContex.CreateGrammar(1) ;   
  11. SpeechLib._ISpeechRecoContextEvents_RecognitionEventHandler recHandle =   
  12. new _ISpeechRecoContextEvents_RecognitionEventHandler(ContexRecognition) ;   
  13. ssrContex.Recognition += recHandle ;   
  14. }   
  15. public void BeginRec(Control tbResult)   
  16. {   
  17. isrg.DictationSetState(SpeechRuleState.SGDSActive) ;   
  18. cDisplay = tbResult ;   
  19. }   
  20. public static SpRecognition instance()   
  21. {   
  22. if (_Instance == null)   
  23. _Instance = new SpRecognition() ;   
  24. return _Instance ;   
  25. }   
  26. public void CloseRec()   
  27. {   
  28. isrg.DictationSetState(SpeechRuleState.SGDSInactive) ;   
  29. }   
  30. private void ContexRecognition(int iIndex,object obj,SpeechLib.SpeechRecognitionType type,SpeechLib.ISpeechRecoResult result)   
  31. {   
  32. cDisplay.Text += result.PhraseInfo.GetText(0,-1,true) ;   
  33. }   
  34. }  

我們定義了ssrContex 和isrg為語(yǔ)音識(shí)別的上下文和語(yǔ)法,通過設(shè)置isrg的DictationSetState方法,我們可以開始或結(jié)束識(shí)別,在上面的程序中是BeginRec和CloseRec方法。cDisplay 是我們用來輸出識(shí)別結(jié)果的地方,為了能夠在大部分控件上都可以顯示結(jié)果,我用了一個(gè)Control 類來定義它。當(dāng)然,每次語(yǔ)音識(shí)別后都會(huì)觸發(fā)ISpeechRecoContextEvents_RecognitionEventHandler 事件,我們定義了一個(gè)這樣的方法ContexRecognition來響應(yīng)事件,并且在這個(gè)方法里輸出識(shí)別結(jié)果。

這樣,C#英文和中文語(yǔ)音處理的一些最基本的問題就有了一個(gè)簡(jiǎn)單的解決方法,當(dāng)然,這種方法還有很多不完善的地方,希望大家多提出批評(píng)意見,共同提高。

【編輯推薦】

  1. 如何用C#和ADO.NET訪問
  2. 淺析C# Switch語(yǔ)句
  3. C#驗(yàn)證輸入方法詳解
  4. 簡(jiǎn)單介紹C# 匿名方法
  5. C# FileSystemWatcher對(duì)象
責(zé)任編輯:彭凡 來源: CSDN
相關(guān)推薦

2016-02-17 10:39:18

語(yǔ)音識(shí)別語(yǔ)音合成語(yǔ)音交互

2022-12-05 07:17:14

人工智能語(yǔ)音合成

2024-11-11 08:50:24

2022-12-01 07:03:22

語(yǔ)音識(shí)別人工智能技術(shù)

2021-11-17 10:37:39

語(yǔ)音識(shí)別技術(shù)人工智能

2017-09-06 10:51:22

Facebook

2024-03-11 11:32:38

語(yǔ)音識(shí)別

2022-11-03 16:31:08

語(yǔ)音智能語(yǔ)音識(shí)別

2023-02-28 12:12:21

語(yǔ)音識(shí)別技術(shù)解碼器

2019-10-29 08:00:00

語(yǔ)音識(shí)別

2017-08-30 09:20:47

深度學(xué)習(xí)語(yǔ)音合成Siri

2022-08-29 10:57:09

語(yǔ)音識(shí)蘋果頻率

2022-09-15 09:59:55

火山語(yǔ)音語(yǔ)音建模

2025-06-27 05:00:00

AI語(yǔ)音詐騙AI語(yǔ)音識(shí)別人工智能

2011-05-31 16:38:47

Android 實(shí)現(xiàn)語(yǔ)音

2020-11-12 17:24:21

微軟智能語(yǔ)音

2022-10-19 12:47:05

深度學(xué)習(xí)語(yǔ)音合成

2015-11-03 16:31:28

搜狗

2017-03-16 16:57:56

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)