2012-05-16 36 views
6

我有一个表彰项目。它的工作原理,但如果我用这个项目是如何一类并调用其方法从其他类我有一个问题就行例外:Kinect上的语音识别

sre = new SpeechRecognitionEngine(ri.Id); 

错误时正在:

所需的无识别找到ID。

代码:

KinectAudioSource source = kinectSensor.AudioSource; 
source.EchoCancellationMode = EchoCancellationMode.None; // No AEC for this sample 
source.AutomaticGainControlEnabled = false; // Important to turn this off for speech recognition 
// source.SystemMode = SystemMode.OptibeamArrayOnly; 
speechRecognizer = CreateSpeechRecognizer(); 

using (Stream s = source.Start()) 
{ 
    speechRecognizer.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null)); 
    Console.WriteLine("Recognizing speech. Say: 'purple', 'green' or 'blue'. Press ENTER to stop"); 
    speechRecognizer.RecognizeAsync(RecognizeMode.Multiple); 
    Console.ReadLine(); 
    Console.WriteLine("Stopping recognizer ..."); 
    speechRecognizer.RecognizeAsyncStop(); 
    } 

private static SpeechRecognitionEngine CreateSpeechRecognizer() 
{ 
    RecognizerInfo ri = GetKinectRecognizer(); 

    SpeechRecognitionEngine sre; 
    //if (ri == null) return 0; 
    sre = new SpeechRecognitionEngine(ri.Id); 
    var colors = new Choices(); 
    colors.Add("red"); 
    colors.Add("green"); 
    colors.Add("blue"); 
    var gb = new GrammarBuilder { Culture = ri.Culture }; 
    gb.Append(colors); 

    // Create the actual Grammar instance, and then load it into the speech recognizer. 
    var g = new Grammar(gb); 
    sre.LoadGrammar(g); 
    sre.SpeechRecognized += SreSpeechRecognized; 
    sre.SpeechHypothesized += SreSpeechHypothesized; 
    sre.SpeechRecognitionRejected += SreSpeechRecognitionRejected; 
    return sre; 
    } 
private static RecognizerInfo GetKinectRecognizer() 
    { 
    Func<RecognizerInfo, bool> matchingFunc = r => 
    { 
     string value; 
     r.AdditionalInfo.TryGetValue("Kinect", out value); 
     return "True".Equals(value, StringComparison.InvariantCultureIgnoreCase) && "en-US".Equals(r.Culture.Name, StringComparison.InvariantCultureIgnoreCase); 
     }; 
     return SpeechRecognitionEngine.InstalledRecognizers().Where(matchingFunc).FirstOrDefault(); 
    } 
+3

调试ID。检查值是否正确 – Fixus

+0

确保安装了所需的32位语音引擎以支持Kinect。请遵循此页面上列出的先决条件:http://channel9.msdn.com/coding4fun/kinect/Introduction-to-Kinect-Speech-Recognition –

+0

平台目标设置为什么? – animaonline

回答

4

我觉得你GetKinectRecognizer()方法是不正确的。

不TryGetValue()返回一个布尔值,如果它被发现和值作为一个out参数?你没有对TryGetvalue()返回的布尔值做任何事情。

您是否期待AdditionalInfo字典具有等于“Kinect”和字符串“True”或“False”值的密钥?这就是你的代码似乎寻找。

该代码是基于您可以指向的示例。我并不真正按照您在matchingFunc中进行的测试。您正在忽略来自TryGetvalue的返回值,您正在寻找名为“Kinect”的字符串值为“True”的AdditionalInfo键,以及具有“en-US”文化的识别器。

为什么不直接转储SpeechRecognitionEngine.InstalledRecognizers()的内容并确保它包含您认为它包含的内容。这是老同学,但有用:

foreach (RecognizerInfo ri in SpeechRecognitionEngine.InstalledRecognizers()) 
{ 
    Debug.WriteLine(String.Format("Id={0}, Name={1}, Description={2}, Culture={3}", ri.Id, ri.Name, ri.Description, ri.Culture)); 
    foreach(string key in ri.AdditionalInfo.Keys) 
    { 
     Debug.WriteLine(string.Format("{0} = {1}", key, ri.AdditionalInfo[key])); 
    } 
    Debug.WriteLine("-"); 
} 

我没有安装Kinect的SDK,但我的Windows 7机器上它显示:

Id=MS-1033-80-DESK, Name=MS-1033-80-DESK, Description=Microsoft Speech Recognizer 8.0 for Windows (English - US), Culture=en-US 
VendorPreferred = 
CommandAndControl = 
Version = 8.0 
Language = 409;9 
Desktop = 
SupportedLocales = 409;1009;3409;9 
AudioFormats = 16;18;20;22;45;53;{6F50E21C-E30E-4B50-95E9-21E8F23D15BD} 
SpeakingStyle = Discrete;Continuous 
WildcardInCFG = Anywhere;Trailing 
Dictation = 
Hypotheses = 
Alternates = CC;Dictation 
windowsV6compatible = 
Name = MS-1033-80-DESK 
DictationInCFG = Anywhere;Trailing 
UPSPhoneSet = 
WordSequences = Anywhere;Trailing 
Vendor = Microsoft 
- 
Id=MS-2057-80-DESK, Name=MS-2057-80-DESK, Description=Microsoft Speech Recognizer 8.0 for Windows (English - UK), Culture=en-GB 
= 
VendorPreferred = 
CommandAndControl = 
Version = 8.0 
Language = 809 
Desktop = 
SupportedLocales = 809;C09;1409;1809;1C09;2009;2409;2809;2C09;3009;4009;4409;4809;9 
AudioFormats = 16;18;20;22;45;53;{6F50E21C-E30E-4B50-95E9-21E8F23D15BD} 
SpeakingStyle = Discrete;Continuous 
WildcardInCFG = Anywhere;Trailing 
Dictation = 
Hypotheses = 
Alternates = CC;Dictation 
windowsV6compatible = 
Name = MS-2057-80-DESK 
DictationInCFG = Anywhere;Trailing 
UPSPhoneSet = 
WordSequences = Anywhere;Trailing 
Vendor = Microsoft 
- 
- 

确保你正在寻找的价值AdditionalInfo字典真的在那里。然后制作你的matchingFunc来检查它。

+0

+51,这对我有用! –

3

试试这个。这个对我有用。

private static RecognizerInfo GetKinectRecognizer() 
     { 
      foreach (RecognizerInfo recognizer in SpeechRecognitionEngine.InstalledRecognizers()) 
      { 
       System.Diagnostics.Debug.Write(recognizer.Culture.Name+"\n\n"); 
       //string value; 
       //recognizer.AdditionalInfo.TryGetValue("Kinect",out value); 
       if ("en-US".Equals(recognizer.Culture.Name, StringComparison.OrdinalIgnoreCase)) 
       { 
        return recognizer; 
       } 

      } 

      return null; 
     } 
+0

也为我工作。为了记录,我刚刚安装了64x版本的Microsoft Speech Platform SDK v11.0,Microsoft Speech Platform Runtime v11.0和Redistributable Language Packs v11.0(__in this order__)。所有从[这里]下载(https://msdn.microsoft.com/en-us/library/office/hh361572(v = office.14).aspx)。 – Thoth