Csharp: speech to text, text to speech in win

来源:互联网 发布:武汉天融信网络 编辑:程序博客网 时间:2024/05/17 01:56
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;using SpeechLib;//NET2.0 引用 Speech sdk 5.1 在COM选项卡里面的Microsoft Speech  object  library引用 已经有11.0版本using System.Speech;using System.Speech.Recognition;using System.Speech.Synthesis;namespace Speech{    /// <summary>    /// 20140427    /// 涂聚文    ///     /// </summary>    public partial class Form1 : Form    {        private enum State        {            Idle = 0,            Accepting = 1,            Off = 2,        }        private State RecogState = State.Off;        private SpeechRecognitionEngine recognizer;        private SpeechSynthesizer synthesizer = null;        private int Hypothesized = 0;        private int Recognized = 0;        /// <summary>        ///         /// </summary>        public Form1()        {            InitializeComponent();        }        /// <summary>        ///         /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void Form1_Load(object sender, EventArgs e)        {            // SpVoice voice = new SpVoice();//SAPI 5.4                       //SpeechLib.ISpeechObjectTokens obj = voice.GetVoices(string.Empty, string.Empty);            //int count = obj.Count;//获取语音库总数            //bool result = false;            //for (int i = 0; i < count; i++)            //{            //    string desc = obj.Item(i).GetDescription(i);//.GetDescription(); //遍历语音库            //    comboBox1.Items.Add(desc);            //}            //SpVoiceClass voice = new SpVoiceClass();//SAPI 5.1            ////voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(0);            ////voice.Speak("你要说的话",SpeechVoiceSpeakFlags.SVSFlagsAsync);            //SpVoice voice1 = new SpVoice();//SAPI 5.4            //voice1.Volume = 100;//音量            //voice1.Voice = voice1.GetVoices(string.Empty, string.Empty).Item(0);            //voice1.Rate = 2;//速度语音朗读速度            //           voice1.Speak("你要说的话", SpeechVoiceSpeakFlags.SVSFlagsAsync);             //voice1.Speak("speech sdk 5.1", SpeechVoiceSpeakFlags.SVSFlagsAsync);            //SpeechSynthesizer syn = new SpeechSynthesizer();            //syn.SelectVoice("Microsoft Lili");             //initialize recognizer and synthesizer            InitializeRecognizerSynthesizer();            //if input device found then proceed            if (SelectInputDevice())            {                LoadDictationGrammar();                               ReadAloud("中华人民共和国"); //中文方式Speech Engine Ready for Input            }        }        /// <summary>        /// 中文        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button1_Click(object sender, EventArgs e)        {            SpVoiceClass voice = new SpVoiceClass();            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(0); //0,为系统默认,中文                       voice.Speak(this.textBox1.Text.Trim(), SpeechVoiceSpeakFlags.SVSFlagsAsync);        }        /// <summary>        /// 英文        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button2_Click(object sender, EventArgs e)        {            SpVoiceClass voice = new SpVoiceClass();            voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(1);//            voice.Speak(this.textBox2.Text.Trim(), SpeechVoiceSpeakFlags.SVSFlagsAsync);        }        /// <summary>        /// 输入中文语音输出中文文字        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void button3_Click(object sender, EventArgs e)        {            switch (RecogState)            {                case State.Off:                    RecogState = State.Accepting;                    button3.Text = "Stop";                    recognizer.RecognizeAsync(RecognizeMode.Multiple);                    break;                case State.Accepting:                    RecogState = State.Off;                    button3.Text = "Start";                    recognizer.RecognizeAsyncStop();                    break;            }        }        /// <summary>        /// pause recognition and speak the text sent        /// </summary>        /// <param name="speakText"></param>        public void ReadAloud(string speakText)        {            try            {                recognizer.RecognizeAsyncCancel();                synthesizer.SpeakAsync(speakText);            }            catch { }        }        /// <summary>        /// initialize recognizer and synthesizer along with their events        /// /// </summary>        private void InitializeRecognizerSynthesizer()        {            var selectedRecognizer = (from e in SpeechRecognitionEngine.InstalledRecognizers()                                      where e.Culture.Equals(Thread.CurrentThread.CurrentCulture)                                      select e).FirstOrDefault();            recognizer = new SpeechRecognitionEngine(selectedRecognizer);            recognizer.AudioStateChanged += new EventHandler<AudioStateChangedEventArgs>(recognizer_AudioStateChanged);            recognizer.SpeechHypothesized += new EventHandler<SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);            recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);            synthesizer = new SpeechSynthesizer();        }        #region Recognizer events        private void recognizer_AudioStateChanged(object sender, AudioStateChangedEventArgs e)        {            switch (e.AudioState)            {                case AudioState.Speech:                    LabelStatus.Text = "Listening";                    break;                case AudioState.Silence:                    LabelStatus.Text = "Idle";                    break;                case AudioState.Stopped:                    LabelStatus.Text = "Stopped";                    break;            }        }        /// <summary>        ///         /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void recognizer_SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e)        {            Hypothesized++;            LabelHypothesized.Text = "Hypothesized: " + Hypothesized.ToString();        }        /// <summary>        ///         /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)        {            Recognized++;            string s = "Recognized: " + Recognized.ToString();            if (RecogState == State.Off)                return;            float accuracy = (float)e.Result.Confidence;            string phrase = e.Result.Text;            {                if (phrase == "End Dictate")                {                    RecogState = State.Off;                    recognizer.RecognizeAsyncStop();                    ReadAloud("Dictation Ended");                    return;                }                textBox1.AppendText(" " + e.Result.Text);            }        }        #endregion        /// <summary>        /// select input device if available        /// </summary>        /// <returns></returns>        private bool SelectInputDevice()        {            bool proceedLoading = true;            //if OS is above XP            if (IsOscompatible())            {                try                {                    recognizer.SetInputToDefaultAudioDevice();                }                catch                {                    proceedLoading = false; //no audio input device                }            }            //if OS is XP or below             else                ThreadPool.QueueUserWorkItem(InitSpeechRecogniser);            return proceedLoading;        }        /// <summary>        /// Findout if OS is compatible.         /// </summary>        /// <returns>true if greater than XP otherwise false</returns>        private bool IsOscompatible()        {            OperatingSystem osInfo = Environment.OSVersion;            if (osInfo.Version > new Version("6.0"))                return true;            else                return false;        }        /// <summary>        ///         /// </summary>        /// <param name="o"></param>        private void InitSpeechRecogniser(object o)        {            recognizer.SetInputToDefaultAudioDevice();        }        /// <summary>        /// Load grammars, one for command and other for dictation        /// </summary>        private void LoadDictationGrammar()        {            GrammarBuilder grammarBuilder = new GrammarBuilder();            grammarBuilder.Append(new Choices("End Dictate"));            Grammar commandGrammar = new Grammar(grammarBuilder);            commandGrammar.Name = "main command grammar";            recognizer.LoadGrammar(commandGrammar);            DictationGrammar dictationGrammar = new DictationGrammar();            dictationGrammar.Name = "dictation";            recognizer.LoadGrammar(dictationGrammar);        }    }}

0 0
原创粉丝点击