System.Speech.Synthesis 添加暂停、继续功能
为了方便调用暂停、继续的方法。要将speech的功能写成一个类。直接附上代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Speech.Synthesis;
using System.Text;
using System.Speech; namespace WindowsFormsApplication1
{
public class TextToSpeak
{
//想要实现暂停等功能,要调用朗读时使用的SpeechSynthesizer对象
SpeechSynthesizer speech = new SpeechSynthesizer(); /// <summary>
/// 朗读
/// </summary>
/// <param name="text">文本</param>
/// <param name="rate">语速</param>
public void Speak(string text, int rate)
{
speech.Rate = rate;
speech.Speak(text);
speech.Dispose();
} /// <summary>
/// 朗读
/// </summary>
/// <param name="text">文本</param>
/// <param name="rate">语速</param>
/// <param name="gender">性别</param>
public void Speak(string text, int rate, string gender)
{ speech.Rate = rate;
try
{
if (gender.ToLower() == "male")
{
speech.SelectVoice("VW Paul");
}
else if (gender.ToLower() == "female")
{
speech.SelectVoice("VW Kate");
} }
//这个异常是语音库未安装
catch (ArgumentException)
{ throw;
}
finally
{
speech.Speak(text);
speech.Dispose();
}
} /// <summary>
/// 保存音频文件
/// </summary>
/// <param name="path">路径</param>
/// <param name="text">文本</param>
/// <param name="rate">语速</param>
/// <param name="gender">性别,可为null</param>
public void SaveWaveFile(string path, string text, int rate, string gender)
{
speech.Rate = rate;
try
{
if (gender.ToLower() == "male")
{
speech.SelectVoice("VW Paul");
}
else if (gender.ToLower() == "female")
{
speech.SelectVoice("VW Kate");
} }
catch (ArgumentException)
{ throw;
}
finally
{
speech.SetOutputToWaveFile(path);
speech.Speak(text);
speech.SetOutputToNull();
}
} public void SpeakPause()
{
speech.Pause();
} public void SpeakResume()
{
speech.Resume();
} public void SpeakStop()
{
speech.Dispose();
}
}
}
我使用的是WinForm实现这个类的。一开始想都没想直接给按钮加上click事件,调用TextToSpeak类的Speak方法,给另一个按钮添加SpeakPause功能。运行时复制了好几段英文,发现窗体出现假死,但是依然有声音输出,这叫我怎么暂停嘛,有点小凌乱。想想这情况应该类似于多线程,不要笑话我,WinForm没怎么弄过,之前一直搞的时asp.net。在网上搜了下进度条的实现方法,最后定下来使用backgroundWorker,不因为别的,就是看着别人写的比较方便~~~
简单介绍下backgroundWorker吧。它就在工具栏里躺着。它有好几个方法。
1. 这个就是后台运行的进程 backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)。在这里就放extToSpeak类的Speak方法。它用backgroundWorker1.RunWokerAsync(参数,可不加)来调用。所以就把这个方法放到播放按钮的click事件里咯。
2.backgroundWorker1_ProgressChanged这个是运行时可以执行的方法。用backgroundWorker1.ReportProgress(int)调用。
3.backgroundWorker1_RunWorkerCompleted这个是进程结束时执行的。
具体的请看:http://www.cnblogs.com/inforasc/archive/2009/10/12/1582110.html
我是直接在WinForm里放了个richtextbox,用来写入要读的英文。一开始我想当然在backgroundWorker1_DoWork(objectsender,DoWorkeventArgs e)里的speak中,直接把richtextbox.text的值传进去,但运行时没有一点反应。一开始不懂哪错了,一点一点的试。后台代码不好调哇,又不能直接调试到代码,只能用个提示语句来帮忙了。最后才发现是卡在richtextbox.text,它读取不到这个值。好像是啥原因的~~~但为啥我那个语速的插件值能读到呢,就因为它是int型么。。那怎么办呢,只能在click事件里调用时传参啦。我有两个参数,一个是text一个是性别,那就string数组了。
上代码:
_ttSpeak = new TextToSpeak();
string[] parameter = { richTextBox1.Text, cbbsex.Text };
backgroundWorker1.RunWorkerAsync(parameter);
细心的小伙伴应该发现了_ttSpeak = new TextToSpeak(),这个实例化语句怪怪的。其实和TextToSpeak类似,都是把实例化的类对象声明为成员变量。为啥这里要重新实例化呢,一开始我也没注意。运行程序时,第二次点朗读按钮时没反应了。原来是第一次运行时已经把Synthesis的资源释放了。所以要重新实例化一个,即重写成员变量。
之后想要使用暂停、继续功能就很方便了。
_ttSpeak.SpeakPause();
_ttSpeak.SpeakResume();
还有个注意点,在执行朗读功能是要把朗读按钮禁用,否则在执行时再click就会报错哦,等运行结束后再启用。
就是把启用的方法写在backgroundWorker1_RunWorkerCompleted里就行啦~~~
System.Speech.Synthesis 添加暂停、继续功能的更多相关文章
- C# 使用System.Speech 进行语音播报和识别
C# 使用System.Speech 进行语音播报和识别 using System.Speech.Synthesis; using System.Speech.Recognition; //语音识别 ...
- C#中的System.Speech命名空间初探
本程序是口算两位数乘法,随机生成两个两位数,用语音读出来.然后开启语音识别,接受用户输入,知道答案正确关闭语音识别.用户说答案时,可以说“再说一遍”重复题目. 关键是GrammarBuilder和Ch ...
- asp.net引用System.Speech实现语音提示
using System; using System.Speech.Synthesis; namespace testvoice { class Program { static void Main( ...
- System.Speech使用
使用微软语音库 使用微软语音库可以很快速的制作一个小应用,比如一个唐诗的朗诵工具.本示例也是使用微软语音库,制作了一个唐诗宋词朗诵的应用,仅供加深学习印象 首先是要引入System.Speech库 然 ...
- HTML5语音合成Speech Synthesis API简介
by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=5865本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随意 ...
- [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件
前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...
- 使用prismjs为网站添加代码高亮功能
prismjs 是一款轻量.可扩展的代码语法高亮库,使用现代化的 Web 标准构建,使用 Prismjs 可以快速为网站添加代码高亮功能,支持超过113中编程语言,还支持多种插件,是简洁.高效的代码高 ...
- winform中文本框添加拖拽功能
对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...
- 从头认识Spring-3.8 简单的AOP日志实现(注解版)-扩展添加检查订单功能,以便记录并检測输入的參数
这一章节我们讨论一下扩展添加检查订单功能,以便记录并检測输入的參数. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03 ...
随机推荐
- Android--------- SD卡存储文件报错解决
##文件找不到 1.没有写write权限 2.没有判断文件夹是否存在,不存在则创建
- cocos2dx-触摸事件
//创建一个精灵 Sprite *spriteTest = Sprite::create("1.png"); spriteTest->setPosition(Point(,) ...
- 编译Boost 详细步骤
vs2008编译boost [一.Boost库的介绍] Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会 ...
- beini系列_2_beini装入虚拟机
- jquery 1.9 之后toggle不能用的问题
今天用到toggle这个方法,发现不是自己想要的效果,之前有用过好多次,一直都没有问题. 网上查了原因,才知道是版本的问题,jquery1.9之后toggle取消了.那么如果想要继续用toggle的这 ...
- java生成UUID通用唯一识别码 (Universally Unique Identifier)
转自:http://blog.csdn.net/carefree31441/article/details/3998553 UUID含义是通用唯一识别码 (Universally Unique Ide ...
- jQuery选择器的学习
jQuery的核心在于它的选择器,通过观看视频和阅读,发现jQuery选择器大体上的分类可分为这么几种(不同人方式不同,这里选择一个自认为比较好的): 1.基础选择器(对应api文档中的基本选择器和层 ...
- WDCP LNMPA和LNMP 504 Gateway time-out错误的解决方法
Nginx的特点是处理静态很给力,Apache的特点是处理动态很稳定,两者结合起来便是LNMPA,nginx处理前端,apache处理后端,这样处理静态会很快,处理动态会很稳定.当我以为安装完成以后便 ...
- 董事长、总裁与CEO的区别与实质
自从信息产业兴起以来,尤其是网络股泡沫产生以来,“CEO”在中国骤然成为一个流行词汇.总经理和总裁们纷纷改称CEO,这个缩写词比它的中译版“首席执行官”更简洁,在中国人心目中更有神圣感,于是便出现了今 ...
- Transposed Matrix
Transposed Matrix In linear algebra, the transpose of a matrix A is another matrix AT (also written ...