2012-08-13 46 views
1

我已经做了一个简单的程序来识别语音使用SAPI 5.4,我想问我是否可以添加更多的语言到TTS和ASR,谢谢 这是我让你有人需要看看的代码它C#SAPI 5.4语言?

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 SpeechLib; 
using System.Globalization; 
using System.Speech.Recognition; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     // Speech Recognition Object 
     SpSharedRecoContext listener; 

     // Grammar object 
     ISpeechRecoGrammar grammar; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 
     public string ps; 
     private void button1_Click(object sender, EventArgs e) 
     { 

     if (btnListen.Text == "Start Listening") 
     { 
       try 
       { 

        listener = new SpeechLib.SpSharedRecoContext(); 
        listener.Recognition += new _ISpeechRecoContextEvents_RecognitionEventHandler(listener_Reco); 
        grammar = listener.CreateGrammar(0); 
        grammar.DictationLoad("", SpeechLoadOption.SLOStatic); 
        grammar.DictationSetState(SpeechRuleState.SGDSActive); 
        btnListen.Text = "Stop Listening"; 
        if (ps == "1") 
        { 
        listener.Resume(); 
        ps = "0"; 
        } 
       } 
       catch (Exception ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
     } 
     else if (btnListen.Text == "Stop Listening") 
     { 
      listener.Pause(); 
      btnListen.Text = "Start Listening"; 
      if (ps == "0") 
      { 
      ps = "1"; 
      } 
      } 

      } 
     public void listener_Reco(int StreamNumber, object StreamPosition, SpeechRecognitionType RecognitionType, ISpeechRecoResult Result) 
     { 
      string heard = Result.PhraseInfo.GetText(0, -1, true); 
      textBox1.Text += " " + heard; 

     } 

     private void button1_Click_1(object sender, EventArgs e) 
     { 
      WinXP winxp = new WinXP(); 
      winxp.Show(); 
      this.Hide(); 
     } 


     string getOSInfo() 
     { 
      //Get Operating system information. 
      OperatingSystem os = Environment.OSVersion; 
      //Get version information about the os. 
      Version vs = os.Version; 

      //Variable to hold our return value 
      string operatingSystem = ""; 

      if (os.Platform == PlatformID.Win32Windows) 
      { 
       //This is a pre-NT version of Windows 
       switch (vs.Minor) 
       { 
        case 0: 
         operatingSystem = "95"; 
         break; 
        case 10: 
         if (vs.Revision.ToString() == "2222A") 
          operatingSystem = "98SE"; 
         else 
          operatingSystem = "98"; 
         break; 
        case 90: 
         operatingSystem = "Me"; 
         break; 
        default: 
         break; 
       } 
      } 
      else if (os.Platform == PlatformID.Win32NT) 
      { 
       switch (vs.Major) 
       { 
        case 3: 
         operatingSystem = "NT 3.51"; 
         break; 
        case 4: 
         operatingSystem = "NT 4.0"; 
         break; 
        case 5: 
         if (vs.Minor == 0) 
          operatingSystem = "2000"; 
         else 
          operatingSystem = "XP"; 
         break; 
        case 6: 
         if (vs.Minor == 0) 
          operatingSystem = "Vista"; 
         else 
          operatingSystem = "7"; 
         break; 
        default: 
         break; 
       } 
      } 
      //Make sure we actually got something in our OS check 
      //We don't want to just return " Service Pack 2" or " 32-bit" 
      //That information is useless without the OS version. 
      if (operatingSystem != "") 
      { 
       //Got something. Let's prepend "Windows" and get more info. 
       operatingSystem = "Windows " + operatingSystem; 
       //See if there's a service pack installed. 
       if (os.ServicePack != "") 
       { 
        //Append it to the OS name. i.e. "Windows XP Service Pack 3" 
        operatingSystem += " " + os.ServicePack; 
       } 
       //Append the OS architecture. i.e. "Windows XP Service Pack 3 32-bit" 
       operatingSystem += " " + getOSArchitecture().ToString() + "-bit"; 
      } 
      //Return the information we've gathered. 
      return operatingSystem; 
     } 

     int getOSArchitecture() 
     { 
      string pa = Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"); 
      return ((String.IsNullOrEmpty(pa) || String.Compare(pa, 0, "x86", 0, 3, true) == 0) ? 32 : 64); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      string OS = getOSInfo(); 
      if (OS.Contains("XP")) 
      { 
       btnXP.Visible = true; 
      } 
      else 
      { 
       btnXP.Visible = false; 
       btnYes2.Visible = true; 
       btnNo2.Visible = true; 
       btnNo.Visible = false; 
       btnYes.Visible = false; 
      } 
     } 




    } 
} 

PS我有一个问题,当恢复识别器

+0

不是一个选项,识别器随Windows一起预装。当一个德国用户购买德语版本​​的Windows时,他会理解他用德语聊天,并与德语交谈。支持可安装的语言包需要花钱,如http://msdn.microsoft.com/en-us/library/ms986793.aspx – 2012-08-13 15:13:13

+0

有没有办法让这个Microsoft Speech Server语言包文件免费? – 2012-08-13 19:35:58

+0

任何东西都可以免费获得。然而,关于枪的合适大小的问题不过是这里的主题。 – 2012-08-13 19:43:41

回答

2

这取决于你用识别器做一点点。是的,桌面操作系统(Windows Vista,7)带有与操作系统语言版本绑定的识别器。但是,微软也免费赠送(无需武器)在服务器上使用的识别引擎(但也可用于桌面操作系统)。有许多不同的免费语言。

桌面和服务器识别器库之间存在一些差异。我的理解是,桌面识别器可以训练特定的扬声器,支持更高质量的音频输入,并包括听写语法。这些设计用于一次只能有一个扬声器的桌面应用。服务器识别器设计用于电话质量的音频,不可训练,并且需要有限的语法(无听写)。服务器引擎设计用于更高规模和多个同步扬声器(如IVR或SpeechServer应用程序中)。

参见:

对于某些背景,请参阅What is the difference between System.Speech.Recognition and Microsoft.Speech.Recognition?