System.Speech.Synthesis 添加暂停、继续功能

为了方便调用暂停、继续的方法。要将speech的功能写成一个类。直接附上代码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Speech.Synthesis;
  5 using System.Text;
  6 using System.Speech;
  7 
  8 namespace WindowsFormsApplication1
  9 {
 10     public class TextToSpeak
 11     {
 12         //想要实现暂停等功能,要调用朗读时使用的SpeechSynthesizer对象
 13         SpeechSynthesizer speech = new SpeechSynthesizer();
 14 
 15         /// <summary>
 16         /// 朗读
 17         /// </summary>
 18         /// <param name="text">文本</param>
 19         /// <param name="rate">语速</param>
 20         public void Speak(string text, int rate)
 21         {
 22             speech.Rate = rate;
 23             speech.Speak(text);
 24             speech.Dispose();
 25         }
 26 
 27         /// <summary>
 28         /// 朗读
 29         /// </summary>
 30         /// <param name="text">文本</param>
 31         /// <param name="rate">语速</param>
 32         /// <param name="gender">性别</param>
 33         public void Speak(string text, int rate, string gender)
 34         {
 35 
 36             speech.Rate = rate;
 37             try
 38             {
 39                 if (gender.ToLower() == "male")
 40                 {
 41                     speech.SelectVoice("VW Paul");
 42                 }
 43                 else if (gender.ToLower() == "female")
 44                 {
 45                     speech.SelectVoice("VW Kate");
 46                 }
 47 
 48             }
 49             //这个异常是语音库未安装
 50             catch (ArgumentException)
 51             {
 52 
 53                 throw;
 54             }
 55             finally
 56             {
 57                 speech.Speak(text);
 58                 speech.Dispose();
 59             }
 60         }
 61 
 62         /// <summary>
 63         /// 保存音频文件
 64         /// </summary>
 65         /// <param name="path">路径</param>
 66         /// <param name="text">文本</param>
 67         /// <param name="rate">语速</param>
 68         /// <param name="gender">性别,可为null</param>
 69         public void SaveWaveFile(string path, string text, int rate, string gender)
 70         {
 71             speech.Rate = rate;
 72             try
 73             {
 74                 if (gender.ToLower() == "male")
 75                 {
 76                     speech.SelectVoice("VW Paul");
 77                 }
 78                 else if (gender.ToLower() == "female")
 79                 {
 80                     speech.SelectVoice("VW Kate");
 81                 }
 82 
 83             }
 84             catch (ArgumentException)
 85             {
 86 
 87                 throw;
 88             }
 89             finally
 90             {
 91                 speech.SetOutputToWaveFile(path);
 92                 speech.Speak(text);
 93                 speech.SetOutputToNull();
 94             }
 95         }
 96 
 97         public void SpeakPause()
 98         {
 99             speech.Pause();
100         }
101 
102         public void SpeakResume()
103         {
104             speech.Resume();
105         }
106 
107         public void SpeakStop()
108         {
109             speech.Dispose();
110         }
111     }
112 }

     我使用的是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数组了。

   上代码:

1  _ttSpeak = new TextToSpeak();
2  string[] parameter = { richTextBox1.Text, cbbsex.Text };
3  backgroundWorker1.RunWorkerAsync(parameter);

细心的小伙伴应该发现了_ttSpeak = new TextToSpeak(),这个实例化语句怪怪的。其实和TextToSpeak类似,都是把实例化的类对象声明为成员变量。为啥这里要重新实例化呢,一开始我也没注意。运行程序时,第二次点朗读按钮时没反应了。原来是第一次运行时已经把Synthesis的资源释放了。所以要重新实例化一个,即重写成员变量。

之后想要使用暂停、继续功能就很方便了。

 

1 _ttSpeak.SpeakPause();

 

_ttSpeak.SpeakResume();

还有个注意点,在执行朗读功能是要把朗读按钮禁用,否则在执行时再click就会报错哦,等运行结束后再启用。

就是把启用的方法写在backgroundWorker1_RunWorkerCompleted里就行啦~~~

 

 

 

 

转载于:https://www.cnblogs.com/WMTcore/p/3831767.html

要在C#中使用Speech.Synthesis播放音频,你可以按照以下步骤进行操作: 1. 首先,确保你已经添加了命名空间`System.Speech.Synthesis`。 2. 创建一个SpeechSynthesizer对象,并设置所需的输出。 3. 使用`SetOutputToWaveFile`方法将输出设置为音频文件,并指定保存路径。例如:`sy.SetOutputToWaveFile("D:\\record.wav");` 4. 使用`Speak`方法将文本转换为语音并输出。例如:`sy.Speak("大家好");` 5. 如果你之后需要将输出设置回默认的音频设备,可以使用`SetOutputToDefaultAudioDevice`方法。例如:`sy.SetOutputToDefaultAudioDevice();` 以下是一个示例代码,展示了如何在C#中使用Speech.Synthesis播放音频: ```csharp using System.Speech.Synthesis; public static void PlayAudio() { SpeechSynthesizer synth = new SpeechSynthesizer(); synth.SetOutputToWaveFile("D:\\record.wav"); synth.Speak("大家好"); synth.SetOutputToDefaultAudioDevice(); } ``` 你可以根据自己的需求修改保存路径和要转换的文本。希望这可以帮助到你! [2<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [System.Speech.Synthesis 保存合成语音](https://blog.csdn.net/qq_36051316/article/details/84961786)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [C#朗读语音无法引用System.Speech解决方法](https://blog.csdn.net/huanghai231/article/details/117304191)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [RPiSpeechSynthesis:Raspberry Pi上的Windows 10 IoT核心语音合成](https://download.csdn.net/download/weixin_42139042/18760047)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值