2012-05-16 15 views
6

पर भाषण मान्यता मेरे पास मान्यता के लिए एक परियोजना है। यह काम करता है, लेकिन अगर मैं अन्य वर्ग से इस परियोजना का उपयोग कैसे एक वर्ग और उसके तरीकों कॉल मैं लाइन पर अपवाद के साथ एक समस्या है:किनेक्ट

sre = new SpeechRecognitionEngine(ri.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

आईडी डीबग करें। जांचें कि क्या मान सही है – Fixus

+0

सुनिश्चित करें कि आप Kinect का समर्थन करने के लिए आवश्यक 32-बिट भाषण इंजन स्थापित करें। इस पृष्ठ पर सूचीबद्ध पूर्वापेक्षाएँ का पालन करें: http://channel9.msdn.com/coding4fun/kinect/Introduction-to-Kinect-Speech-Recognition –

+0

प्लेटफ़ॉर्म लक्ष्य सेट क्या है? – animaonline

उत्तर

4

मुझे लगता है कि अपने GetKinectRecognizer() विधि सही नहीं है।

कोशिश नहीं करता है GetValue() यदि यह पाया जाता है और आउट पैरामीटर के रूप में पाया जाता है तो एक बूलियन लौटाता है? आप TryGetvalue() से लौटे हुए बूलियन के साथ कुछ भी नहीं कर रहे हैं।

क्या आप अतिरिक्त इन्फ्लो डिक्शनरी को "किनेक्ट" और स्ट्रिंग "ट्रू" या "गलत" मान के बराबर कुंजी की उम्मीद कर रहे हैं? यही वह कोड है जिसे आप ढूंढते हैं।

क्या यह कोड उस उदाहरण पर आधारित है जिसे आप इंगित कर सकते हैं। मैं वास्तव में मिलान फनक में आपके परीक्षण का पालन नहीं करता हूं। आप TryGetvalue से रिटर्न वैल्यू को अनदेखा कर रहे हैं, आप "ट्रू" के स्ट्रिंग वैल्यू के साथ "किनेक्ट" नामक एक अतिरिक्त इन्फ्लो कुंजी और "एन-यूएस" की संस्कृति के साथ एक पहचानकर्ता की तलाश में हैं।

आप 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 एसडीके स्थापित नहीं, लेकिन मेरे विंडोज 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 
- 
- 

यकीन है कि मानों आप में देख रहे बनाओ अतिरिक्त इन्फ्लो शब्दकोश वास्तव में वहाँ हैं। फिर इसके लिए जांच करने के लिए अपने मिलान Func तैयार करें।

+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

मेरे लिए भी काम किया। सिर्फ रिकॉर्ड के लिए, मैंने माइक्रोसॉफ्ट स्पीच प्लेटफार्म एसडीके v11.0, माइक्रोसॉफ्ट स्पीच प्लेटफार्म रनटाइम v11.0 और पुनर्वितरण योग्य भाषा पैक v11.0 (__in इस ऑर्डर__) के 64x संस्करणों को स्थापित किया है। सभी यहां से डाउनलोड किए गए हैं (https://msdn.microsoft.com/en-us/library/office/hh361572 (v = office.14) .aspx)। – Thoth

संबंधित मुद्दे