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