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封装 ...
随机推荐
- SQL基本操作——函数
函数的类型:在 SQL 中,基本的函数类型和种类有若干种.函数的基本类型是:Aggregate 函数.Scalar 函数. Aggregate 函数:操作面向一系列的值,并返回一个单一的值,下面是SQ ...
- Python 之pygame飞机游戏
import pygame from pygame.locals import * import time import random # 我机 class HeroPlane(object): de ...
- AcDbTable 类
Table 例子学习笔记在这个例子中,ARX向我们展示了ACDBTABLE类的一些基本操作方法,ACDBTABLE类是ACAD2005及其以后的产品,应该是说ACDBDATATABLE的升级产品,Ac ...
- ie9以下提示用户升级浏览器
<!--[if lt IE 9]> <div style='border: 4px solid #FFF500; background: #FDFDC8; text-align: c ...
- 浏览器 <html>相关
若页面需默认用极速核,增加标签:<meta name="renderer" content="webkit"> https://blog.csdn ...
- POJ-1655 Balancing Act(树的重心)
Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the t ...
- homework week 1
第一周的作业 首先来完成第二个作业, 编写登录接口, 因为视频上并没有相关的教程, 就在网上搜了一下读写文件的语句, 粗略了解. f1 = open("data.txt",&quo ...
- 使用androidstudio 分析内存泄漏
分析内存泄漏 http://www.jianshu.com/p/c49f778e7acf
- [TYVJ1730]二逼平衡树
[TYVJ1730]二逼平衡树 题目 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查 ...
- noip模拟赛 Massacre at Béziers
题目背景 下发压缩包链接: https://pan.baidu.com/s/1geC4ooz 密码: 3vpt 所有的一切———所有的一切都被染成了红与黑. 翻卷的红莲烈焰舔舐着大地,释放出异抽的黑烟 ...