Я разрабатываю прототип речи для текстового субтитров для проекта университета. Я собираюсь использовать распознавание жестов в моем проекте в конце, поэтому я подумал, что было бы неплохо использовать 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();
}