標籤:播報 語音 線程 wpf tts5.1
相信大多數做wpf 的人 都曾經為介面卡頓發過愁。尤其是當WPF遇到TTS 簡直是可以回去睡一覺了。。。
關於這個問題,出過幾個解決方案,有的治小病,有的治大病,還有的去根。今天就跟大家分享一下。
TTS 是微軟開發的,在它對外為數不多的屬性中發現有一個這樣的SpeechVoiceSpeakFlags類。這個類封裝了多個播放方式,比較常用的是SVSFDefault(同步)和SVSFlagsAsync(非同步),它們的區別在於當我用同步執行的時候,如果當前需要播報的語音列表沒有播放完,它不會執行後面的程式。而採用非同步方式是,用戶端發出了播報語音的指令後,將立刻執行播報語音指令的下一條 語句,而不需要等到播報引擎全部將所有的播報列表讀完返回用戶端。
這樣的話,由於很多語音功能都是和介面相關的,我們通過修改這樣的屬性就能解決問題。
但,問題是我們還有更多的需求~~~~~~~~~~~~~~~~
語音播報是沒問題了。但是這語音的暫停就愁壞我了。
由於播放只有一個控制,也就是這一個播音對象執行發音的方式是同步的,那麼暫停 結束都是同步的。而我採用非同步方式,它還是一如既往的 收到我的指令之後就立馬執行我的後面的代碼。導致我想讓語音暫停時候,總表現出這個發音的小播比較呆萌的還在一直播放語音,重複幾次之後才能反應過來,我能忍,就不知道客戶聽完了是什麼感受了~
不過站在為人民服務的角度,咱們還是把問題斃掉吧。
如果聲音會影響到介面的話,那我們為什麼不把聲音獨立出來呢。讓聲音再開一個線程,同時通過調整線程的優先順序來設定它的開啟和暫停~也不失為一個好方法~
順便補充 一句 委託就是將我們用到的方法以參數的形式傳遞。
好了,貼一個核心代碼塊
<span style="font-family:KaiTi_GB2312;font-size:18px;"> /// <summary> /// TTS初始化 /// </summary> public static void InitSpeek() { Thread SpeekThread = new Thread(DelegateAlarmSpeek); SpeekThread.IsBackground = true; SpeekThread.Priority = ThreadPriority.Lowest;//設定線程的層級最低 SpeekThread.Start(); } public delegate void delegateAlarmSpeek(object obj); private static void DelegateAlarmSpeek(object obj) { delegateAlarmSpeek delegateAlarmSpeek = new TTSManage.delegateAlarmSpeek(AlarmSpeek); delegateAlarmSpeek(new object()); }</span>
此處的AlarmSpeek就是我們針對語音發音寫的具體的播音方法。
有人問,那這樣怎麼控制語音迴圈播放呢?
辦法總是很多。一個alarmspeek裡的標誌位就能解決while (!isStopSpeek)。
那有了這個線程式控制制,如果想讓語音在播放一遍之後停止一段時間繼續播報也就秒秒鐘搞定啦。Thread.Sleep(10);
雖然例子都很簡單,但是項目中有多少知識點是困難的呢?不都是這樣一點點積累的嗎?
當然本篇僅是入門級的,深入的也還在學習中。雖然好處很多,但使用也還是要根據具體情況小心使用啦,不然你看由於同步,非同步,多線程等又出問題了~下篇部落格待續~
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
TTS零基礎入門之拒絕介面卡頓--加入線程