c# .net audio kinect system.speech.recognition

c# - Usando System.Speech con Kinect



.net audio (1)

Desde mi propia experimentación, puedo decirles que de hecho pueden usar ambas bibliotecas simultáneamente.

Pruebe este código en lugar de su código actual (asegúrese de agregar una referencia a System.Speech, obviamente):

using (var audioSource = new KinectAudioSource()) { audioSource.FeatureMode = true; audioSource.AutomaticGainControl = false; audioSource.SystemMode = SystemMode.OptibeamArrayOnly; System.Speech.Recognition.RecognizerInfo ri = GetKinectRecognizer(); var speechRecognitionEngine = new SpeechRecognitionEngine(ri.Id); speechRecognitionEngine.LoadGrammar(new DictationGrammar()); speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text); using (var s = audioSource.Start()) { speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null)); speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); } }

¡¡¡Buena suerte!!!

Estoy desarrollando un prototipo de aplicación de texto a texto para un proyecto de la Universidad. Voy a utilizar el reconocimiento de gestos dentro de mi proyecto más tarde, así que pensé que sería una buena idea usar el Kinect como fuente del micrófono, en lugar de utilizar un micrófono adicional. La idea de mi aplicación es reconocer discursos espontáneos como oraciones largas y complejas (entiendo que el dictado del habla no será perfecto, sin embargo). He visto muchas muestras de voz Kinect donde hace referencia a Microsoft.Speech, pero no a System.Speech. Como necesito entrenar el motor de voz y cargar un DictationGrammar en el Speech Recognition Engine, Microsoft.Speech es la única opción para mí.

He logrado que funcione mientras uso Kinect como fuente de audio de micrófono directo, pero como estoy cargando el Kinect para la vista previa del video y el reconocimiento de gestos, no puedo acceder a él como micrófono directo.

Este es el código que accede al micrófono directamente sin cargar el hardware Kinect para gestos, etc., y funciona perfectamente:

private void InitializeSpeech() { var speechRecognitionEngine = new SpeechRecognitionEngine(); speechRecognitionEngine.SetInputToDefaultAudioDevice(); speechRecognitionEngine.LoadGrammar(new DictationGrammar()); speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text); }

Y aquí es donde necesito acceder a la fuente de acceso a través de Kinect una vez que se ha cargado, lo que no está haciendo nada. Esto quiero estar haciendo:

using (var audioSource = new KinectAudioSource()) { audioSource.FeatureMode = true; audioSource.AutomaticGainControl = false; audioSource.SystemMode = SystemMode.OptibeamArrayOnly; var recognizerInfo = GetKinectRecognizer(); var speechRecognitionEngine = new SpeechRecognitionEngine(recognizerInfo.Id); speechRecognitionEngine.LoadGrammar(new DictationGrammar()); speechRecognitionEngine.SpeechRecognized += (s, args) => MessageBox.Show(args.Result.Text); using (var s = audioSource.Start()) { speechRecognitionEngine.SetInputToAudioStream(s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null)); speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); } }

Entonces, la pregunta es, ¿es posible utilizar System.Speech en lugar de Microsoft.Speech con el Kinect SDK actual, y qué estoy haciendo mal en la segunda muestra de código?

Método GetKinectRecognizer

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