为了方便调用暂停、继续的方法。要将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 添加暂停、继续功能的更多相关文章

  1. C# 使用System.Speech 进行语音播报和识别

    C# 使用System.Speech 进行语音播报和识别 using System.Speech.Synthesis; using System.Speech.Recognition; //语音识别 ...

  2. C#中的System.Speech命名空间初探

    本程序是口算两位数乘法,随机生成两个两位数,用语音读出来.然后开启语音识别,接受用户输入,知道答案正确关闭语音识别.用户说答案时,可以说“再说一遍”重复题目. 关键是GrammarBuilder和Ch ...

  3. asp.net引用System.Speech实现语音提示

    using System; using System.Speech.Synthesis; namespace testvoice { class Program { static void Main( ...

  4. System.Speech使用

    使用微软语音库 使用微软语音库可以很快速的制作一个小应用,比如一个唐诗的朗诵工具.本示例也是使用微软语音库,制作了一个唐诗宋词朗诵的应用,仅供加深学习印象 首先是要引入System.Speech库 然 ...

  5. HTML5语音合成Speech Synthesis API简介

    by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=5865本文可全文转载,但需得到原作者书面许可,同时保留原作者和出处,摘要引流则随意 ...

  6. [vs2008]Visual Studio 2008 SP1添加或删除功能提示查找SQLSysClrTypes.msi文件

    前言 今天接到领导布置的一个任务,是之前同事负责的项目.离职了,现在客户有些地方需要修改,由于我之前参与过,就落在我的头上了. 然后我就把代码弄了过来,打开发现其中需要用到水晶报表.(我觉得不好用,不 ...

  7. 使用prismjs为网站添加代码高亮功能

    prismjs 是一款轻量.可扩展的代码语法高亮库,使用现代化的 Web 标准构建,使用 Prismjs 可以快速为网站添加代码高亮功能,支持超过113中编程语言,还支持多种插件,是简洁.高效的代码高 ...

  8. winform中文本框添加拖拽功能

    对一个文本框添加拖拽功能: private void txtFolder_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataP ...

  9. 从头认识Spring-3.8 简单的AOP日志实现(注解版)-扩展添加检查订单功能,以便记录并检測输入的參数

    这一章节我们讨论一下扩展添加检查订单功能,以便记录并检測输入的參数. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03 ...

随机推荐

  1. respondsToSelector的使用

    - (BOOL)respondsToSelector:(SEL)aSelector; 用来判断是否有以某个名字命名的方法 +(BOOL) instancesRespondToSelector: sel ...

  2. hdu 1258 DFS

    I - 深搜 基础 Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     64bi ...

  3. Linux设置自启动

    启动大致过程:bootloader-->内核-->内核模块-->挂载根文件系统-->init进程 init进程是非内核进程中第一个被启动运行的,因此它的进程编号PID的值总是1 ...

  4. C#如何设置下拉COMMBOX为不可输入,只有下拉条目

    设置下拉框的DropDownStyle属性为DropDownList

  5. Xcode把应用程序打包成ipa

    Xcode把应用程序打包成ipa 分类: App Store2012-11-20 15:47 11722人阅读 评论(0) 收藏 举报 Xcode教程 Xcode4发布测试 打包Archive操作是本 ...

  6. C语言解析日志,存储数据到伯克利DB 2

    #编译程序 gcc -o historydb historydb.c -ldb #将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户) ./historydb -f .us ...

  7. #Java编程题-百钱百鸡

    问题: 百钱百鸡问题.用100钱买100只鸡,公鸡一只五钱,母鸡一只三钱,雏鸡三只一钱,编程计算共有几种买法(要求每种鸡至少要买1只). 自己的实现,没有什么数据结构,算法,求大神指点!! packa ...

  8. 【给你几个使用Xamarin的理由】

    写在开篇前 这种代理操作,绑定影射的机制,有些极端的开发者确实难以接受.追求完美,总感觉原生的各种优点. 如果你非得较这个真,那您还是感觉补习下 Java Eclipse  ,买一台Mac 恶补Obj ...

  9. Visual studio 使用正则表达查找替换

    原文 http://www.cnblogs.com/shineqiujuan/archive/2012/07/04/2575535.html 正则表达式是查找和替换文本模式的一种简洁而灵活的表示法.  ...

  10. Android模仿微信语音聊天功能

    项目效果如下: 项目目录结构如下: 代码如下: AudioManager.java import java.io.File; import java.io.IOException; import ja ...