日期: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); } } }