国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

System.Speech.Synthesis 添加暫停、繼續(xù)功能

2019-11-17 03:03:27
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

System.Speech.Synthesis 添加暫停、繼續(xù)功能

為了方便調(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里就行啦~~~


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 留坝县| 宁南县| 高淳县| 乌兰县| 青龙| 青阳县| 南安市| 康定县| 黑山县| 阜康市| 乌什县| 天长市| 雅安市| 岫岩| 松桃| 青阳县| 温州市| 青川县| 黄浦区| 綦江县| 山西省| 白玉县| 聂拉木县| 保山市| 新民市| 水城县| 盐山县| 汤阴县| 临夏县| 安康市| 阳高县| 华容县| 淮安市| 克什克腾旗| 蓝山县| 襄汾县| 尚志市| 黎川县| 习水县| 岳阳县| 汝城县|