using HuizhongLibrary.Network; using System; using System.Collections; using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Media; using System.Text; using System.Threading; using System.Speech.Synthesis; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using HuizhongLibrary.Log; namespace HuizhongLibrary { public class VoicePortSound { SerialPortService ser = new SerialPortService(); SpeechSynthesizer synth = new SpeechSynthesizer(); public string PortName { get; set; } public int BaudRate { get; set; } public int DataBits { get; set; } /// /// 0不使用语音呼叫1使用微软语音呼叫2使用精灵SmartRead语音3使用外置串口语音呼叫 /// public int SoundType { get; set; } public int SendSleep = 500; Queue ListVoice = new Queue(); public PlayState Status; private AutoResetEvent AutoReset = new AutoResetEvent(false); private bool IsRun = false; public VoicePortSound() { this.BaudRate = 9600; this.DataBits = 8; ser.MaxSendNumber = 1; ser.RefshSecond = 60; ser.ReceiveData += ser_ReceiveData; ser.OverMaxSend += new Action(ser_OverMaxSend); //this.HardwareInit(); } #region 启动监控 public void Start() { if (SoundType == 0) return; if (SoundType == 1) { var list = synth.GetInstalledVoices(); if (list.Count > 0) { foreach (InstalledVoice item in list) { if (item.VoiceInfo.Name == "Microsoft Huihui Desktop") synth.SelectVoice("Microsoft Huihui Desktop"); if (item.VoiceInfo.Name == "Microsoft Huihui") synth.SelectVoice("Microsoft Huihui"); if (item.VoiceInfo.Name == "Microsoft Lili Desktop") synth.SelectVoice("Microsoft Lili Desktop"); if (item.VoiceInfo.Name == "Microsoft Lili") synth.SelectVoice("Microsoft Lili"); ErrorFollow.TraceWrite("语音库名称", "", item.VoiceInfo.Name); } } else { synth.SelectVoice("Microsoft Lili"); } } if (SoundType == 2) { //SmartReadSDK.SmartRead_InitialAuth(0, 0, 0, 0, "support@smartysoft.com", "88888888", "111-111-111-111"); } if (SoundType == 3) { ser.Start(PortName, this.BaudRate, this.DataBits, Parity.None, StopBits.One); } else { Thread t = new Thread(this.OnStart); t.Start(); } if (SoundType == 4) synth.SelectVoice("Microsoft Lili"); } #endregion #region 停止 public void Stop() { IsRun = false; AutoReset.Set(); ser.Stop(); } #endregion #region 超出最大发送次数 void ser_OverMaxSend(SocketMessage obj) { ser.ListMessage.Clear(); } #endregion #region 读取数据 void ser_ReceiveData(SerialPort model) { switch (ser.Data[0]) { case 0x4A: //PlaySound._HardwareSuccessful = true; break; case 0x41: Status = PlayState.RecvCorrectCommand; //ser.EndFirstMsg(); break; case 0x45: Status = PlayState.RecvErrorCommand; break; case 0x4E: Status = PlayState.Busy; break; case 0x4F: Status = PlayState.Idle; ser.EndFirstMsg(); break; default: break; } } #endregion #region 停止正在播放的语音 public void HardwareStop() { if (SoundType == 3) { byte[] b = new byte[4]; b[0] = 0xFD; b[1] = 0x00; b[2] = 0x01; b[3] = 0x02; ser.Send(b); } if (SoundType == 1 || SoundType == 4) synth.Pause(); //if (SoundType == 2) SmartReadSDK.SmartRead_Stop(); } #endregion #region 暂停语音 public void HardwarePause() { if (SoundType == 3) { byte[] b = new byte[4]; b[0] = 0xFD; b[1] = 0x00; b[2] = 0x01; b[3] = 0x03; ser.Send(b); } if (SoundType == 1 || SoundType == 4) synth.Pause(); //if (SoundType == 2) SmartReadSDK.SmartRead_PauseORContinue(); } #endregion #region 恢复暂停的语音 public void HardwareResume() { if (SoundType == 3) { byte[] b = new byte[4]; b[0] = 0xFD; b[1] = 0x00; b[2] = 0x01; b[3] = 0x04; ser.Send(b); } if (SoundType == 1 || SoundType == 4) synth.Resume(); //if (SoundType == 2) SmartReadSDK.SmartRead_PauseORContinue(); } #endregion #region 读取状态 public void HardwareStatus() { byte[] b = new byte[4]; b[0] = 0xFD; b[1] = 0x00; b[2] = 0x01; b[3] = 0x04; ser.Send(b); } #endregion #region 播放语音 public void HardwareSpeak(string text) { Regex reg = new Regex(@"\[@暂停=\d+\]", RegexOptions.Multiline); MatchCollection matches = reg.Matches(text); if (matches.Count == 0) { if (SoundType == 3) { byte[] b = Encoding.GetEncoding("gb2312").GetBytes(text); byte[] bytes = new byte[b.Length + 5]; Int16 len = (Int16)(b.Length + 2); bytes[0] = 0xFD; bytes[1] = (byte)(len >> 8 & 0xFF); bytes[2] = (byte)(len & 0xFF); bytes[3] = 0x01; bytes[4] = 0x00; Array.Copy(b, 0, bytes, 5, b.Length); SocketMessage msg = new SocketMessage(); msg.Bytes = bytes; msg.SendLength = msg.Bytes.Length; msg.IsRevert = true; msg.SequenceID = "4F"; msg.FunNo = "4F"; msg.IsLock = true; ser.ListMessage.Add(msg); } else { lock (ListVoice) { TtsVoice m = new TtsVoice(); m.VoiceText = text; ListVoice.Enqueue(m); } } } else { string[] ss = reg.Split(text); int index = 0; int sleep = 0; int len2 = ss.Length - 1; foreach (string s in ss) { if (index < len2) sleep = Convert.ToInt32(matches[index].Value.Substring(5, matches[index].Value.Length - 6)); if (SoundType == 3) { byte[] b = Encoding.GetEncoding("gb2312").GetBytes(s); byte[] bytes = new byte[b.Length + 5]; Int16 len = (Int16)(b.Length + 2); bytes[0] = 0xFD; bytes[1] = (byte)(len >> 8 & 0xFF); bytes[2] = (byte)(len & 0xFF); bytes[3] = 0x01; bytes[4] = 0x00; Array.Copy(b, 0, bytes, 5, b.Length); SocketMessage msg = new SocketMessage(); msg.Bytes = bytes; msg.SendLength = msg.Bytes.Length; msg.IsRevert = true; msg.SequenceID = "4F"; msg.FunNo = "4F"; msg.IsLock = true; ser.ListMessage.Add(msg); } else { TtsVoice m = new TtsVoice(); m.VoiceText = s; m.SendSleep = sleep; ListVoice.Enqueue(m); } sleep = 0; index++; } } } #endregion #region 清除语音队列 public void Clear() { if (SoundType == 3) { ser.ListMessage.Clear(); } else { lock (ListVoice) { ListVoice.Clear(); } } } #endregion #region 读取语音 TtsVoice CheckOut() { lock (ListVoice) { if (ListVoice.Count == 0) return null; return ListVoice.Dequeue(); } } #endregion #region 语音朗读 void PlayVoice(string text) { if (SoundType == 1 || SoundType == 4) synth.Speak(text); if (SoundType == 2) { //SmartReadSDK.SmartRead_Speak(text, "", 1, 13, 50, 100, 1, -1, "http://www.smartysoft.com/cn/"); } } #endregion #region 播放线程 void OnStart() { IsRun = true; while (IsRun == true) { TtsVoice model = CheckOut(); if (model != null) PlayVoice(model.VoiceText); if (model == null || model.SendSleep == 0) { AutoReset.WaitOne(this.SendSleep, false); } else { AutoReset.WaitOne(model.SendSleep, false); } } } #endregion } public enum PlayState { InitializationSuccessful, RecvCorrectCommand, RecvErrorCommand, Busy, Idle } public class TtsVoice { public string VoiceText = ""; public int SendSleep = 0; } #region SmartReadSDK public class SmartReadSDK { ////初始化认证函数,使用语音功能前必须首先调用,进行认证。 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_InitialAuth")] //public static extern int SmartRead_InitialAuth(int hwndEditText, int hwndMessage, int hwndProgress, int hwndToShow, string chMailBox, string chPassword, string chValidateCode); ////关闭函数,推出程序前必须调用 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_Close")] //public static extern int SmartRead_Close(); ////朗读函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_Speak")] //public static extern int SmartRead_Speak(string lpStr, string lpToShow, int iStyle, int iSpeech, int iRate, int iVolume, int iPunctuation, int iSelVoiceDevice, string lpLink); ////打开语音设置对话框,用于改变中英文语音,音量,语速,可自定义下载连接 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_SetDialog")] //public static extern int SmartRead_SetDialog(int hwndFather, string lpDownPage); ////停止朗读函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_Stop")] //public static extern int SmartRead_Stop(); ////将文本朗读到WAVE文件的函数,可设置输出的文件 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_SpeakToWave")] //public static extern int SmartRead_SpeakToWave(string lpStr, string lpToShow, string lpWaveFile, int iStyle, int iSpeech, int iRate, int iVolume, int iFormat, int iPunctuation, string lpLink); ////获得朗读的位置 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_GetLocationInfo")] //public static extern int SmartRead_GetLocationInfo(ref int iLocationInfo); ////在朗读过程中,改变音量,范围在0-100之间,100为最高音. //[DllImport("smartread7.dll", EntryPoint = "SmartRead_SetVolume")] //public static extern int SmartRead_SetVolume(int iVolume); ////在朗读过程中,改变语速,范围在0-100直接,100为最快速度. //[DllImport("smartread7.dll", EntryPoint = "SmartRead_SetSpeed")] //public static extern int SmartRead_SetSpeed(int iRate); ////在朗读过程中,获得音量,范围在0-100之间,100为最高音. //[DllImport("smartread7.dll", EntryPoint = "SmartRead_GetVolume")] //public static extern int SmartRead_GetVolume(ref int iVolume); ////在朗读过程中,获得语速,范围在0-100直接,100为最快速度. //[DllImport("smartread7.dll", EntryPoint = "SmartRead_GetSpeed")] //public static extern int SmartRead_GetSpeed(ref int iRate); ////在朗读过程中,实现暂停/继续功能. //[DllImport("smartread7.dll", EntryPoint = "SmartRead_PauseORContinue")] //public static extern int SmartRead_PauseORContinue(); ////返回值为本台电脑上声卡的数目 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_GetVoiceDeviceNum")] //public static extern int SmartRead_GetVoiceDeviceNum(ref int iDeviceNum); ////语音开发包版本信息,开在任何时候调用 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_Version")] //public static extern int SmartRead_Version(ref int iMaxVer, ref int iMinVer, ref int iYear, ref int iMonth, ref int iDay); ////朗读模式设置函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_SetMode")] //public static extern int SmartRead_SetMode(int iMode); ////返回错误代码函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_GetErrCode")] //public static extern int SmartRead_GetErrCode(); ////返回错误信息函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_GetErrMsg")] //public static extern int SmartRead_GetErrMsg(StringBuilder szErrMsg); ////队列播放,获得已经朗读/总朗读文本信息数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_QueueStatistics")] //public static extern int SmartRead_QueueStatistics(ref int iReaded, ref int iTotal); ////队列播放,朗读下一条函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_QueueNext")] //public static extern int SmartRead_QueueNext(); ////隐藏消息对话框 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_HideMessageBox")] //public static extern int SmartRead_HideMessageBox(); ////参数设置函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_SetParameter")] //public static extern int SmartRead_SetParameter(int iParaName, int iParaNum); ////打开跟踪功能函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_Trace_ON")] //public static extern int SmartRead_Trace_ON(); ////关闭跟踪功能函数 //[DllImport("smartread7.dll", EntryPoint = "SmartRead_Trace_OFF")] //public static extern int SmartRead_Trace_OFF(); //public static int SmartRead_iMultiReadTimes = 0;//重复或者多次朗读的次数 //public static int SmartRead_iMultiRead = 0; //是否是重复或者多次朗读 } #endregion }