TTS-零基础入门之停止列表中单条语音播报
做了一个语音 循环播报列表信息。当我新删除了一天列表之后,发现它仅仅有在下一轮播报中才会取消。这明显是不合理的。
一開始的代码是这样写的。
<span style="font-family:KaiTi_GB2312;font-size:18px;"> /// <summary>
/// 语音循环播报方法
/// </summary>
private static void AlarmSpeek()
{
try
{
timer.Stop();
nowAlarmLv = AlarmLevel.五;
VoiceSpeek(alarm5Lvs.Keys.ToList());//解除语音播报时的报警等级-2015-8-6
nowAlarmLv = AlarmLevel.四;
VoiceSpeek(alarm4Lvs.Keys.ToList());
nowAlarmLv = AlarmLevel.三;
VoiceSpeek(alarm3Lvs.Keys.ToList());
nowAlarmLv = AlarmLevel.二;
VoiceSpeek(alarm2Lvs.Keys.ToList());
nowAlarmLv = AlarmLevel.一;
VoiceSpeek(alarm1Lvs.Keys.ToList());
if (!isStopSpeek)
{
timer.Start();
}
}
catch
{
if (!isStopSpeek)
{
timer.Start();
}
}
}</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;"> /// <summary>
/// 播报语音方法
/// </summary>
/// <param name="voiceIDs"></param>
private static void VoiceSpeek(List<string> voiceIDs)
{
for (int i = 0; i < voiceIDs.Count; i++)
{
if (isStopSpeek)
{
break;
} try
{
//播报存在缓存字典的报警信息
if (_DictionaryTTSCache.Contain(voiceIDs[i]))
{
voice.Speak(_DictionaryTTSCache.Get<string>(voiceIDs[i]), spFlags);
}
//播报新加入的报警信息
for (int j = 0; j < addVoiceIDs.Count; j++)
{
string voiceID = addVoiceIDs[j];
if (_DictionaryTTSCache.Contain(voiceID))
{
voice.Speak(_DictionaryTTSCache.Get<string>(voiceID), spFlags);
addVoiceIDs.Remove(voiceID);
j--;
}
}
}
catch (COMException ex)
{
LogInfo.WriteLog(LogInfo.LogLevel.Error, ex.StackTrace + "<br>" + ex.Message + "<br>" + "引发该操作的位置是:" + "VoiceSpeek(List<string> voiceIDs)方法!");
}
}
}</span>
语音移除的逻辑大概也是这样。
关键的两句还是
<span style="font-family:KaiTi_GB2312;font-size:18px;">alarmVoiceIDs.Remove(voiceID);
_DictionaryTTSCache.Remove(voiceID);
</span>
至此,解释一下上面的逻辑。我主要是找了一个列表,用来存放TTS要播报的内容。
一旦我须要删除一些播报内容,那么我就像相应的实体从我的列表中删除出去。
这样播音的时候找不到这个列表。自然无法播报了。
道理是这种,可是结果却 不如人意。总发现小播有点“反应迟钝”。
列表确实是删除了,可是小播还在播报。仅仅有第二次循环的时候才会停止。
对此,猜測TTS中封装的Voice这个类的speak方法 第一次就已经将要读的全部内容 压入到自己的队列中去了,因此不管我如何改变列表,都已经无济于事了。
针对这个问题,有了一个解决方式。
就是我们将实例化的voice的对象的作用域变短。
内容由一个列表变为一个个列表中的实体。此外,对于TTS类中非常多的机制都须要研究一下,小小的特点和性能有 可能导致程序失败。
在不断的如果。调试, 验证得出结论的过程中,会越来 越明白的发现问题和解决这个问题。
TTS-零基础入门之停止列表中单条语音播报的更多相关文章
- Linux从入门到放弃、零基础入门Linux(第四篇):在虚拟机vmware中安装centos7.7
如果是新手,建议安装带图形化界面的centos,这里以安装centos7.7的64位为例 一.下载系统镜像 镜像文件下载链接https://wiki.centos.org/Download 阿里云官网 ...
- 函数:我的地盘听我的 - 零基础入门学习Python019
函数:我的地盘听我的 让编程改变世界 Change the world by program 函数与过程 在小甲鱼另一个实践性超强的编程视频教学<零基础入门学习Delphi>中,我们谈到了 ...
- 【JAVA零基础入门系列】Day5 Java中的运算符
运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...
- 【JAVA零基础入门系列】Day11 Java中的类和对象
今天要说的是Java中两个非常重要的概念--类和对象. 什么是类,什么又是对象呢?类是对特定集合的概括描述,比如,人,这个类,外观特征上,有名字,有年龄,能说话,能吃饭等等,这是我们作为人类的相同特征 ...
- 008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字
008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字 关键字 关键字就是一些有特殊意义的词 之前学习的程序中涉及到的关键字 Java中 ...
- 【JAVA零基础入门系列】Day9 Java中的那个大数值
什么是大数值?用脚趾头想也知道,当然是"大"的数值(233).Java中有两个用于表示大数值的类,BigInteger和BigDecimal,那到底能表示多大的数值呢?理论上,可以 ...
- 【JAVA零基础入门系列】Day10 Java中的数组
什么是数组?顾名思义,就是数据的组合,把一些相同类型的数放到一组里去. 那为什么要用数组呢?比如需要统计全班同学的成绩的时候,如果给班上50个同学的成绩信息都命名一个变量进行存储,显然不方便,而且在做 ...
- Linux从入门到放弃、零基础入门Linux(第三篇):在虚拟机vmware中安装linux(二)超详细手把手教你安装centos6分步图解
一.继续在vmware中安装centos6.9 本次安装是进行最小化安装,即没有图形化界面的安装,如果是新手,建议安装带图形化界面的centos, 具体参考Linux从入门到放弃.零基础入门Linux ...
- 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)
092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
随机推荐
- Unity学习-碰撞检测(七)
Unity脚本说明 Unity支持语言: C#(主流),JavaScript,Boo 创建脚本: [Assets-Create-C# Script] 学习案例 布置场景: 添加一个Plane,3个Cu ...
- [ SHOI 2012 ] 随机树
\(\\\) \(Description\) 开始有一棵只有一个根节点的树.每次随机选择一个叶子节点,为他添上左右子节点,求: 生成一棵有\(N\)个叶节点的树,所有叶节点平均高度的期望. 生成一棵有 ...
- input获得焦点和失去焦点
总结:placeholder因为在IE7 8 9 浏览器不支持所以没用它效果:当input获取光标的时候如果是默认提示则input内容为空.如果不是则为输入内容 当失去光标的时候, ...
- 一文读懂架构师都不知道的isinstance检查机制
起步 通过内建方法 isinstance(object, classinfo) 可以判断一个对象是否是某个类的实例.但你是否想过关于鸭子协议的对象是如何进行判断的呢? 比如 list 类的父类是继 o ...
- S-HR之时间空间配置
<field name="entrys.bizDate" dataType = "DATE" label="生效日期" year ...
- WebService附加到IIS调试,未命中断点
写好了一个WebService,部署到IIS上,用浏览器访问发现并不能命中断点. 经过多次的查找发现是由于附加的代码类型选择错误. 下图由于错误的选择了托管代码,导致调试时不命中断点,勾选自动解决.
- 2018.03.04 晚上Atcoder比赛
C - March Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement There are N ...
- uva340 Master-Mind Hints (UVA - 340)
题目简要 题目意思很简单每个测试都由原题目在第一行,然后后面的都是去猜的答案,如果猜测的位置正确那么输出的结果的数对里面的第一个数就加一,如果仅答案正确(原题目里有这个数,但是位置不一样)那么就在输出 ...
- [LUOGU] 1108 低价购买
统计本质不同的\(LIS\)个数. 因为本题要求的是\(N^2\)级别的算法,就直接暴力统计\(LIS\)的个数了 然后统计方案数的话加入发现有之间有一个值,以它为结尾的\(LIS\)长度和当前的相等 ...
- JDK5-8特性归纳
jdk5新特性1.自动装箱和拆箱2.枚举3.静态导入4.可变参数5.內省 是Java语言对Bean类属性.事件的一种缺省处理方法.例如类A中有属性那么,那我们可以通过getName,setName ...