有谁用过SpeechSDK,做语音转换成文本。语音识别问题 C#
本帖最后由 milian91 于 2012-10-26 13:08:20 编辑 我在msdn上找到了:SpeechRecognitionEngine 类的示例源码,能够转换成文本,但是这个程序是控制台应用程序。
但是我把转到winfrom上去时出现:
SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine() ;
recognizer.SetInputToDefaultAudioDevice(); 值不在预期的范围内,错误。我下载别人写的类似转换程序也是出现这问题,
我用的是window2003,安装SpeechSDK,以及语言包,控制台应用程序能正常转换,但是winFrom就不能,再指定:
以从默认音频设备接收输入(SetInputToDefaultAudioDevice)时报错。
有哪位大神知道这个问题怎么解决。
这下面是我转换的代码:
static bool completed;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine())//new CultureInfo("zh-CN")
{
//Create and load the exit grammar.
Grammar exitGrammar = new Grammar(new GrammarBuilder("exit"));
exitGrammar.Name = "Exit Grammar";
recognizer.LoadGrammar(exitGrammar);
// Attach event handlers to the recognizer.
recognizer.SpeechRecognized +=new EventHandler<SpeechRecognizedEventArgs>(SpeechRecognizedHandler);
// Assign input to the recognizer.
recognizer.SetInputToDefaultAudioDevice();
// Begin asynchronous recognition.
RtxtBox.Text = "马上开始...\r";
completed = false;
recognizer.RecognizeAsync(RecognizeMode.Multiple);
// Wait for recognition to finish.
while (!completed)
{
Thread.Sleep(333);
}
}
}
void SpeechRecognizedHandler(object sender, SpeechRecognizedEventArgs e)
{
string grammarName = "<没找到相关命令>";
if (e.Result.Grammar.Name != null &&e.Result.Grammar.Name.Equals(string.Empty))
{
grammarName = e.Result.Grammar.Name;
}
RtxtBox.Text += "\r" + string.Format(" {0,-17} - {1}", grammarName, e.Result.Text);
if (grammarName.Equals("Exit Grammar"))
{
((SpeechRecognitionEngine)sender).RecognizeAsyncCancel();
}
}
static bool completed;
static void Main(string[] args)
{
using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine())//new CultureInfo("zh-CN")
{
//Create and load the exit grammar.
Grammar exitGrammar = new Grammar(new GrammarBuilder("exit"));
exitGrammar.Name = "Exit Grammar";
recognizer.LoadGrammar(exitGrammar);
// Create and load the dictation grammar.
Grammar dictation = new DictationGrammar();
dictation.Name = "Dictation Grammar";
recognizer.LoadGrammar(dictation);
// Attach event handlers to the recognizer.
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(SpeechRecognizedHandler);
// Assign input to the recognizer.
recognizer.SetInputToDefaultAudioDevice();
// Begin asynchronous recognition.
Console.WriteLine("马上开始...");
completed = false;
recognizer.RecognizeAsync(RecognizeMode.Multiple);
// Wait for recognition to finish.
while (!completed)
{
Thread.Sleep(333);
}
Console.WriteLine("Done.");
}
Console.WriteLine();
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
static void SpeechRecognizedHandler(object sender, SpeechRecognizedEventArgs e)
{
Console.WriteLine("开始:");
string grammarName = "<没找到相应命令>";
if (e.Result.Grammar.Name != null && e.Result.Grammar.Name.Equals(string.Empty))
{
grammarName = e.Result.Grammar.Name;
}
Console.WriteLine(" {0,-17} - {1}", grammarName, e.Result.Text);
if (grammarName.Equals("Exit Grammar"))
{
((SpeechRecognitionEngine)sender).RecognizeAsyncCancel();
}
}
[解决办法]
win7下,vs2008,用过一个C#的,忘了在什么地方下的了。
用法:
SRecognition sr;
string[] fg = { "东方", "西方", "南方", "北方" };
sr = new SRecognition(fg);
sr.BeginRec(textBox1);// 开始,textBox1输出结果
//sr.over();//停止
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Speech;
using System.Speech.Recognition;
using System.Globalization;
using System.Windows.Forms;
namespace IME
{
public class SRecognition
{
public SpeechRecognitionEngine recognizer = null;//语音识别引擎
public DictationGrammar dictationGrammar = null; //自然语法
public System.Windows.Forms.Control cDisplay; //显示控件
public SRecognition(string[] fg) //创建关键词语列表
{
CultureInfo myCIintl = new CultureInfo("zh-CN");
foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎
{
if (config.Culture.Equals(myCIintl) && config.Id == "MS-2052-80-DESK")
{
recognizer = new SpeechRecognitionEngine(config);
break;
}//选择识别引擎
}
if (recognizer != null)
{
InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎
dictationGrammar = new DictationGrammar();
}
else
{
MessageBox.Show("创建语音识别失败");
}
}
private void InitializeSpeechRecognitionEngine(string[] fg)
{
recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备
Grammar customGrammar = CreateCustomGrammar(fg);
//根据关键字数组建立语法
recognizer.UnloadAllGrammars();
recognizer.LoadGrammar(customGrammar);
//加载语法
recognizer.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
//recognizer.SpeechHypothesized += new EventHandler <SpeechHypothesizedEventArgs>(recognizer_SpeechHypothesized);
}
public void BeginRec(Control tbResult)//关联窗口控件
{
TurnSpeechRecognitionOn();
TurnDictationOn();
cDisplay = tbResult;
}
public void over()//停止语音识别引擎
{
TurnSpeechRecognitionOff();
}
public virtual Grammar CreateCustomGrammar(string[] fg) //创造自定义语法
{
GrammarBuilder grammarBuilder = new GrammarBuilder();
grammarBuilder.Append(new Choices(fg));
return new Grammar(grammarBuilder);
}
private void TurnSpeechRecognitionOn()//启动语音识别函数
{
if (recognizer != null)
{
recognizer.RecognizeAsync(RecognizeMode.Multiple);
//识别模式为连续识别
}
else
{
MessageBox.Show("创建语音识别失败");
}
}
private void TurnSpeechRecognitionOff()//关闭语音识别函数
{
if (recognizer != null)
{
recognizer.RecognizeAsyncStop();
TurnDictationOff();
}
else
{
MessageBox.Show("创建语音识别失败");
}
}
private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
//识别出结果完成的动作,通常把识别结果传给某一个控件
string text = e.Result.Text;
cDisplay.Text += text;
}
private void TurnDictationOn()
{
if (recognizer != null)
{
recognizer.LoadGrammar(dictationGrammar);
//加载自然语法
}
else
{
MessageBox.Show("创建语音识别失败");
}
}
private void TurnDictationOff()
{
if (dictationGrammar != null)
{
recognizer.UnloadGrammar(dictationGrammar);
//卸载自然语法
}
else
{
MessageBox.Show("创建语音识别失败");
}
}
}
}