Подтвердить что ты не робот

Использование System.Speech с Kinect

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

Ответ 1

Из моего собственного эксперимента я могу сказать, что вы можете использовать обе библиотеки одновременно.

Попробуйте использовать этот код вместо текущего кода (убедитесь, что вы добавили ссылку на System.Speech, очевидно):

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

Удачи!!!

Ответ 2

Попробуйте этот код со ссылкой на System.Speech.

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