2012-05-16 43 views
6

Tôi có một dự án để được công nhận. Nó hoạt động, nhưng nếu tôi sử dụng dự án này như thế nào một lớp và gọi các phương thức của nó từ lớp khác Tôi có một vấn đề với ngoại lệ trên dòng:Nhận dạng giọng nói trên Kinect

sre = new SpeechRecognitionEngine(ri.Id); 

Các lỗi con người:

Không nhận dạng của yêu cầu Đã tìm thấy ID.

Mã:

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

gỡ lỗi ID. Kiểm tra xem giá trị có chính xác không – Fixus

+0

Đảm bảo bạn cài đặt công cụ phát biểu 32 bit bắt buộc để hỗ trợ Kinect. Thực hiện theo các điều kiện tiên quyết được liệt kê trên trang này: http://channel9.msdn.com/coding4fun/kinect/Introduction-to-Kinect-Speech-Recognition –

+0

Mục tiêu nền tảng được đặt là gì? – animaonline

Trả lời

4

Tôi nghĩ rằng phương pháp GetKinectRecognizer() của bạn là không đúng.

Không TryGetValue() trả về boolean nếu nó được tìm thấy và giá trị được tìm thấy dưới dạng tham số ngoài? Bạn không làm bất cứ điều gì với boolean trả về từ TryGetvalue().

Bạn có mong đợi từ điển AdditionalInfo có khóa bằng "Kinect" và chuỗi giá trị "Đúng" hoặc "Sai" không? Đó là những gì bạn mã xuất hiện để tìm kiếm.

Mã này dựa trên ví dụ bạn có thể trỏ đến. Tôi không thực sự làm theo những gì thử nghiệm của bạn cho trong matchingFunc. Bạn đang bỏ qua giá trị trả về từ TryGetvalue, bạn đang tìm kiếm khóa AdditionalInfo có tên "Kinect" với giá trị chuỗi là "True", và trình nhận dạng có văn hóa "en-US".

Tại sao bạn không đổ nội dung của SpeechRecognitionEngine.InstalledRecognizers() và chắc chắn rằng nó chứa nội dung bạn nghĩ nó chứa. Đây là trường học cũ, nhưng hữu ích:

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

Tôi không đã cài đặt Kinect SDK, nhưng trên máy tính Windows 7 của tôi nó cho thấy:

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

Hãy chắc chắn rằng các giá trị bạn đang tìm kiếm trong Từ điển AdditionalInfo thực sự ở đó. Sau đó, thủ công matchingFunc của bạn để kiểm tra nó.

+0

+51, điều này làm việc cho tôi! –

3

Hãy thử điều này. Nó làm việc cho tôi.

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

Làm việc cho tôi. Chỉ cần cho các hồ sơ, tôi chỉ cần cài đặt các verx 64x của, Microsoft Speech Platform SDK v11.0, Microsoft Speech Platform Thời gian chạy v11.0 và Redistributable gói ngôn ngữ v11.0 (__in thứ tự này__). Tất cả được tải xuống từ [đây] (https://msdn.microsoft.com/en-us/library/office/hh361572 (v = office.14) .aspx). – Thoth

Các vấn đề liên quan