Я разрабатываю прототип приложения для создания титров речи и текста для университетского проекта. Позже я собираюсь использовать распознавание жестов в своем проекте, поэтому я подумал, что было бы неплохо использовать Kinect в качестве источника микрофона, а не использовать дополнительный микрофон. Идея моего приложения заключается в распознавании спонтанных речей, таких как длинные и сложные предложения (однако я понимаю, что диктовка речи не будет идеальной). Я видел много речевых образцов Kinect, где упоминается Microsoft.Speech, но не System.Speech. Поскольку мне нужно обучить речевой движок и загрузить DictationGrammar в распознаватель речи, Microsoft.Speech - единственный вариант для меня.
Мне удалось заставить его работать при использовании Kinect в качестве источника звука с прямого микрофона, но поскольку я загружаю Kinect для предварительного просмотра видео и распознавания жестов, я не могу получить к нему доступ как к прямому микрофону.
Это код доступа к микрофону напрямую без загрузки оборудования Kinect для жестов и т. Д., Который отлично работает:
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);
}
И здесь я должен получить доступ к источнику доступа через Kinect после его загрузки, который ничего не делает. Это я хочу сделать:
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);
}
}
Итак, вопрос в том, возможно ли вообще использовать System.Speech вместо Microsoft.Speech с текущим Kinect SDK, и что я делаю неправильно во втором примере кода?
Метод 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();
}