相信大多数做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);
虽然例子都很简单,但是项目中有多少知识点是困难的呢?不都是这样一点点积累的么?
当然本篇仅是入门级的,深入的也还在学习中。虽然好处很多,但使用也还是要根据具体情况小心使用啦,不然你看由于同步,异步,多线程等又出问题了~下篇博客待续~
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u010176014/article/details/47986101