Использование System.Speech с Kinect - PullRequest
30 голосов
/ 03 декабря 2011

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

Ответы [ 2 ]

3 голосов
/ 21 января 2012

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

Попробуйте этот код вместо вашего текущего кода (очевидно, что вы обязательно добавите ссылку на 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);
    }
}

Удачи !!!

0 голосов
/ 27 мая 2019

Попробуйте этот код со ссылкой на 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...