日期:2014-06-10  浏览次数:20523 次

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);
        }
    }
}