2012-05-16 21 views
6

Tanıma için bir projem var. O inşaat, ama diğer sınıftan yöntemlerini bu projeyi nasıl kullandıklarını bir sınıf ve ararsanız ben on line hariç bir sorun var:Kinect'teki Konuşma Tanıma

sre = new SpeechRecognitionEngine(ri.Id); 

hata varlık:

gerekli hiçbir tanıyıcı ID bulundu.

kodu:

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

. Değerin doğru olup olmadığını kontrol edin – Fixus

+0

Kinect'i desteklemek için gerekli 32 bit konuşma motorunu kurduğunuzdan emin olun. Bu sayfada listelenen önkoşulları izleyin: http://channel9.msdn.com/coding4fun/kinect/Introduction-to-Kinect-Speech-Recognition –

+0

Platform Hedefi ne ayarlanır? – animaonline

cevap

4

Ben senin GetKinectRecognizer() yöntemi doğru olmadığını düşünüyorum.

TryGetValue() öğesi bulunamıyorsa ve çıkış parametresi olarak bulunan bir değer döndürüyor mu? TryGetvalue() 'dan döndürülen boolean ile hiçbir şey yapmıyorsunuz.

"Kinect" ve "True" veya "False" değerlerine eşit bir anahtar olması için EkInfo sözlüğünü bekliyor musunuz? Kodun aradığı şey budur.

Bu kod, gösterebileceğiniz bir örneğe dayanıyor mu? EşleşenFunc'te yaptığınız testi gerçekten izlemiyorum. TryGetvalue öğesinden dönüş değerini göz ardı ediyorsunuz, "Doğru" bir dize değeri olan "Kinect" adlı bir Ek Bilgi Anahtarı ve "en-ABD" kültürüne sahip bir tanıyıcı arıyorsunuz.

Neden SpeechRecognitionEngine.InstalledRecognizers() öğesinin içeriğini döküyorsunuz ve içerdiğini düşündüğünüz içeriği içerdiğinden emin olmayın. Bu eski okul, ama yararlıdır: Ben Kinect SDK yüklü olmayan

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("-"); 
} 

ama benim Windows 7 makine üzerinde gösterir:

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 
- 
- 

değerler içinde aradığınız emin olun EkInfo sözlüğü gerçekten var. Ardından, bunu kontrol etmek için matchingFunc öğenizi hazırlayın.

+0

+51, bu benim için çalıştı! –

3

Bunu deneyin. Benim için çalışıyor. Kimliğin hata ayıklaması

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

Benim için de çalıştım. Sadece kayıt için, Microsoft Speech Platform SDK v11.0, Microsoft Speech Platform Runtime v11.0 ve Yeniden Dağıtılabilir Dil Paketleri v11.0'ın 64x sürümlerini (__in this order__) yükledim. Hepsi buradan indirildi (https://msdn.microsoft.com/en-us/library/office/hh361572 (v = office.14) .aspx). – Thoth

İlgili konular