首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

有哪位高手用过SpeechSDK,做语音转换成文本。语音识别有关问题 C

2013-06-25 
有谁用过SpeechSDK,做语音转换成文本。语音识别问题 C#本帖最后由 milian91 于 2012-10-26 13:08:20 编辑我

有谁用过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();
            }
        }


这个是MSDN上的代码能过正常转换成文本:

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("创建语音识别失败");
      }
    }


  }
}


[解决办法]
整理成一份最简单的。

vs2008编译,win7下,运行正常。

新建项目需要引用.net的System.Speech

http://files.cnblogs.com/slowhand/SR.zip

热点排行