為了方便調(diào)用暫停、繼續(xù)的方法。要將speech的功能寫(xiě)成一個(gè)類。直接附上代碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Speech.Synthesis; 5 using System.Text; 6 using System.Speech; 7 8 namespace WindowsFormsapplication1 9 { 10 public class TextToSpeak 11 { 12 //想要實(shí)現(xiàn)暫停等功能,要調(diào)用朗讀時(shí)使用的SpeechSynthesizer對(duì)象 13 SpeechSynthesizer speech = new SpeechSynthesizer(); 14 15 /// <summary> 16 /// 朗讀 17 /// </summary> 18 /// <param name="text">文本</param> 19 /// <param name="rate">語(yǔ)速</param> 20 public void Speak(string text, int rate) 21 { 22 speech.Rate = rate; 23 speech.Speak(text); 24 speech.Dispose(); 25 } 26 27 /// <summary> 28 /// 朗讀 29 /// </summary> 30 /// <param name="text">文本</param> 31 /// <param name="rate">語(yǔ)速</param> 32 /// <param name="gender">性別</param> 33 public void Speak(string text, int rate, string gender) 34 { 35 36 speech.Rate = rate; 37 try 38 { 39 if (gender.ToLower() == "male") 40 { 41 speech.SelectVoice("VW Paul"); 42 } 43 else if (gender.ToLower() == "female") 44 { 45 speech.SelectVoice("VW Kate"); 46 } 47 48 } 49 //這個(gè)異常是語(yǔ)音庫(kù)未安裝 50 catch (ArgumentException) 51 { 52 53 throw; 54 } 55 finally 56 { 57 speech.Speak(text); 58 speech.Dispose(); 59 } 60 } 61 62 /// <summary> 63 /// 保存音頻文件 64 /// </summary> 65 /// <param name="path">路徑</param> 66 /// <param name="text">文本</param> 67 /// <param name="rate">語(yǔ)速</param> 68 /// <param name="gender">性別,可為null</param> 69 public void SaveWaveFile(string path, string text, int rate, string gender) 70 { 71 speech.Rate = rate; 72 try 73 { 74 if (gender.ToLower() == "male") 75 { 76 speech.SelectVoice("VW Paul"); 77 } 78 else if (gender.ToLower() == "female") 79 { 80 speech.SelectVoice("VW Kate"); 81 } 82 83 } 84 catch (ArgumentException) 85 { 86 87 throw; 88 } 89 finally 90 { 91 speech.SetOutputToWaveFile(path); 92 speech.Speak(text); 93 speech.SetOutputToNull(); 94 } 95 } 96 97 public void SpeakPause() 98 { 99 speech.Pause();100 }101 102 public void SpeakResume()103 {104 speech.Resume();105 }106 107 public void SpeakStop()108 {109 speech.Dispose();110 }111 }112 }
我使用的是WinForm實(shí)現(xiàn)這個(gè)類的。一開(kāi)始想都沒(méi)想直接給按鈕加上click事件,調(diào)用TextToSpeak類的Speak方法,給另一個(gè)按鈕添加SpeakPause功能。運(yùn)行時(shí)復(fù)制了好幾段英文,發(fā)現(xiàn)窗體出現(xiàn)假死,但是依然有聲音輸出,這叫我怎么暫停嘛,有點(diǎn)小凌亂。想想這情況應(yīng)該類似于多線程,不要笑話我,WinForm沒(méi)怎么弄過(guò),之前一直搞的時(shí)asp.net。在網(wǎng)上搜了下進(jìn)度條的實(shí)現(xiàn)方法,最后定下來(lái)使用backgroundWorker,不因?yàn)閯e的,就是看著別人寫(xiě)的比較方便~~~
簡(jiǎn)單介紹下backgroundWorker吧。它就在工具欄里躺著。它有好幾個(gè)方法。
1. 這個(gè)就是后臺(tái)運(yùn)行的進(jìn)程 backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)。在這里就放extToSpeak類的Speak方法。它用backgroundWorker1.RunWokerAsync(參數(shù),可不加)來(lái)調(diào)用。所以就把這個(gè)方法放到播放按鈕的click事件里咯。
2.backgroundWorker1_PRogressChanged這個(gè)是運(yùn)行時(shí)可以執(zhí)行的方法。用backgroundWorker1.ReportProgress(int)調(diào)用。
3.backgroundWorker1_RunWorkerCompleted這個(gè)是進(jìn)程結(jié)束時(shí)執(zhí)行的。
具體的請(qǐng)看:http://m.survivalescaperooms.com/inforasc/archive/2009/10/12/1582110.html
我是直接在WinForm里放了個(gè)richtextbox,用來(lái)寫(xiě)入要讀的英文。一開(kāi)始我想當(dāng)然在backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)里的speak中,直接把richtextbox.text的值傳進(jìn)去,但運(yùn)行時(shí)沒(méi)有一點(diǎn)反應(yīng)。一開(kāi)始不懂哪錯(cuò)了,一點(diǎn)一點(diǎn)的試。后臺(tái)代碼不好調(diào)哇,又不能直接調(diào)試到代碼,只能用個(gè)提示語(yǔ)句來(lái)幫忙了。最后才發(fā)現(xiàn)是卡在richtextbox.text,它讀取不到這個(gè)值。好像是啥原因的~~~但為啥我那個(gè)語(yǔ)速的插件值能讀到呢,就因?yàn)樗莍nt型么。。那怎么辦呢,只能在click事件里調(diào)用時(shí)傳參啦。我有兩個(gè)參數(shù),一個(gè)是text一個(gè)是性別,那就string數(shù)組了。
上代碼:
1 _ttSpeak = new TextToSpeak();2 string[] parameter = { richTextBox1.Text, cbbsex.Text };3 backgroundWorker1.RunWorkerAsync(parameter);細(xì)心的小伙伴應(yīng)該發(fā)現(xiàn)了_ttSpeak = new TextToSpeak(),這個(gè)實(shí)例化語(yǔ)句怪怪的。其實(shí)和TextToSpeak類似,都是把實(shí)例化的類對(duì)象聲明為成員變量。為啥這里要重新實(shí)例化呢,一開(kāi)始我也沒(méi)注意。運(yùn)行程序時(shí),第二次點(diǎn)朗讀按鈕時(shí)沒(méi)反應(yīng)了。原來(lái)是第一次運(yùn)行時(shí)已經(jīng)把Synthesis的資源釋放了。所以要重新實(shí)例化一個(gè),即重寫(xiě)成員變量。
之后想要使用暫停、繼續(xù)功能就很方便了。
1 _ttSpeak.SpeakPause();
_ttSpeak.SpeakResume();
還有個(gè)注意點(diǎn),在執(zhí)行朗讀功能是要把朗讀按鈕禁用,否則在執(zhí)行時(shí)再click就會(huì)報(bào)錯(cuò)哦,等運(yùn)行結(jié)束后再啟用。
就是把啟用的方法寫(xiě)在backgroundWorker1_RunWorkerCompleted里就行啦~~~
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注