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封装 ...
随机推荐
- Select2插件ajax方式加载数据并刷新页面数据回显
今天在优化项目当中,有个要在下拉框中搜索数据的需求:最后选择使用selec2进行开发: 官网:http://select2.github.io/ 演示: 准备工作: 文件需要引入select2.ful ...
- Oracle12C用户创建、授权、登录
Oracle12C用户创建.授权.登录 1.以系统用户登录 C:\Users\LEI>sqlplus sys/dwh as sysdba; SQL*Plus: Release 12.1.0.2. ...
- Ajax——瀑布流
基本概念 1.宽度是一致的,高度上参差不齐 2.新增内容优先放置在最矮的地方 核心难点 1.用一个数组存储每列的高度值 2.新值添加到值最小索引上,每次替换更新数组 插件使用 1.$.fn.exten ...
- Json——一般应用
引用命名空间 using Newtonsoft.Json; 序列化类或者类的集合 string jsonData1 = JsonConvert.SerializeObject(p1);//序列化类 s ...
- 脚本添加删除nginx配置中的内容
[root@nodejs script]# more editnginx.sh #!/bin/bash # function back_check(){ # 备份配置和覆盖配置文件 cp -rf /e ...
- CAD调用移动命令
主要用到函数说明: _DMxDrawX::SendStringToExecuteFun 把命令当着函数执行,可以传参数,详细说明如下: 参数 说明 IDispatch* pParam 命令参数,IMx ...
- 04 学习java养成良好的写作习惯
1, 驼峰命名法 首字母大写 2, 写的时候大小中括号都补全,不忘记分号 不要都放在一行上 3, 缩进对其,tab键 4, 严格要求自己,养成良好的写作风格 5, javadoc可以将文档注释,直接生 ...
- bootstrap中chosen控件样式有时会冲突
加上这句话试试 $(".chosen-container").css("width","100%"); 或者 100%改成 100px试试
- thinkphp里模版文件js无法使用if condition的问题
/** * @example thinkphp里模版文件js无法使用if condition的问题 * @example 参考地址:https://segmentfault.co ...
- SolidWorks学习笔记(一)
一.草图绘制 1.简单命令 先直线后圆弧,几何约束.尺寸标定 2.圆周阵列 3.几何关系——对称 添加几何约束:圆弧相等.关于竖直中心线的对称 4.捕捉圆心 5.尺寸锁定,有圆弧的,先直后圆 6. 7 ...