一、项目中一直用到了文字转语音的功能,需求也比较简单,就是将一段报警信息通过语音的方式播放出来,之前一直采用CS客户端,利用微软自带的Speech语音播放库就可以完成,
1.1 封装winSpedk类代码如下:
namespace Speak { using System; using System.Runtime.CompilerServices; using System.Speech.Synthesis; using System.Threading; using SpeechLib; public class WinSpeak { #region 属性 private SpeechSynthesizer Speak; public event ErrorInfo ErrorInfoEvent; private Thread thVoice; private string strVoiceMsg; SpVoice Voice = null; private static WinSpeak _intence; #endregion private WinSpeak() { Voice = new SpVoice(); } #region 方法 public static WinSpeak _Init() { if (_intence == null) _intence = new WinSpeak(); return _intence; } /// <summary> /// 读语音 /// </summary> private void SpeakM() { try { if (Speak != null) { this.Speak.SpeakAsync(strVoiceMsg); } } catch (Exception exception) { this.ErrInfo(exception); } } /// <summary> /// 异步播放文本语音 /// </summary> /// <param name="msg"></param> public void BeginSpeakText(string msg) { try { if (Speak != null) { Speak.SpeakAsyncCancelAll(); Speak.Dispose(); } if (thVoice != null && thVoice.ThreadState == ThreadState.Running) { thVoice.Abort(); } Speak = new SpeechSynthesizer(); Speak.SetOutputToDefaultAudioDevice(); strVoiceMsg = msg; //thVoice = new Thread(new ThreadStart(SpeakM)); //thVoice.Start(); Speak.SpeakAsync(msg); GC.Collect(); GC.WaitForPendingFinalizers(); } catch (Exception exception) { this.ErrInfo(exception); } } /// <summary> /// 播放文本语音 /// </summary> /// <param name="msg"></param> public void SpeakText(string msg) { try { this.Speak = new SpeechSynthesizer(); this.Speak.Speak(msg); this.Speak.SetOutputToNull(); this.Speak.Dispose(); } catch (Exception exception) { this.ErrInfo(exception); } } /// <summary> /// Speech播放文本合成语音 /// </summary> /// <param name="msg"></param> public void Speech_SpeakText(string msg) { try { if (Voice != null) { Voice.Speak(null, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak); Voice.Speak(msg, SpeechVoiceSpeakFlags.SVSFlagsAsync); } } catch (Exception ex) { this.ErrInfo(ex); } } /// <summary> /// 关闭语音释放资源 /// </summary> public void SpeakClose() { try { if (Speak != null) { this.Speak.SpeakAsyncCancelAll(); this.Speak.Dispose(); } if (Voice != null) { Voice.Speak(null, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak); } } catch (Exception ex) { cGlobe_Log.Error(cGlobe_Log.GetMethodInfo() + ex.Message); } } /// <summary> /// 获取错误信息 /// </summary> /// <param name="str"></param> private void ErrInfo(Exception str) { if (this.ErrorInfoEvent != null) { this.ErrorInfoEvent(str); } } #endregion ~WinSpeak() { try { if (Speak != null) { this.Speak.SpeakAsyncCancelAll(); this.Speak.Dispose(); } } catch (Exception exception) { //this.ErrInfo(exception); } } } }
1.2 调用如下(一个同步播放、一个异步播放):
pri