2012-05-16 26 views
6

Tengo un proyecto para reconocimiento. Funciona, pero si uso este proyecto forma en una clase y llamar a sus métodos de otra clase que tenga un problema con excepción de la línea:Reconocimiento de voz en Kinect

sre = new SpeechRecognitionEngine(ri.Id); 

El bienestar de error:

Sin reconocedor de la necesaria ID encontrado.

El código:

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

depura el ID. Compruebe si el valor es correcto – Fixus

+0

Asegúrese de instalar el motor de voz de 32 bits requerido para admitir Kinect. Siga los requisitos previos enumerados en esta página: http://channel9.msdn.com/coding4fun/kinect/Introduction-to-Kinect-Speech-Recognition –

+0

¿en qué se configura el objetivo de la plataforma? – animaonline

Respuesta

4

Creo que su método GetKinectRecognizer() no es correcta.

¿TryGetValue() no devuelve un valor booleano si se encuentra y el valor se encuentra como un parámetro de salida? No está haciendo nada con el booleano devuelto de TryGetvalue().

¿Espera que el diccionario AdditionalInfo tenga una clave igual a "Kinect" y una cadena de valor "Verdadero" o "Falso"? Eso es lo que tu código parece buscar.

Este código se basa en un ejemplo que puede señalar. Realmente no sigo tus pruebas en el MatchFunc. Está ignorando el valor de retorno de TryGetvalue, está buscando una clave AdditionalInfo llamada "Kinect" con un valor de cadena de "True" y un reconocedor con una cultura de "en-US".

¿Por qué no acaba de volcar el contenido de SpeechRecognitionEngine.InstalledRecognizers() y se asegura de que contenga lo que cree que contiene? Se trata de la vieja escuela, pero útil:

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

mi no me ha instalado Kinect SDK, pero en mi máquina de Windows 7 se muestra:

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

Asegúrese de que los valores que están buscando en el El diccionario AdditionalInfo está realmente allí. Luego crea tu MatchFunc correspondiente para comprobarlo.

+0

+51, ¡esto funcionó para mí! –

3

Pruebe esto. Esto funciona para mi.

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

Funcionó para mí también. Solo para el registro, acabo de instalar las versiones 64x de, Microsoft Speech Platform SDK v11.0, Microsoft Speech Platform Runtime v11.0 y paquetes de idioma redistribuible v11.0 (__en este orden__). Todo descargado desde [aquí] (https://msdn.microsoft.com/en-us/library/office/hh361572 (v = office.14) .aspx). – Thoth

Cuestiones relacionadas