MS SpeechRecognitionEngine не всегда возвращается при чтении файлов WAV - PullRequest
0 голосов
/ 17 марта 2020

Существует аналогичный вопрос, что здесь уже существует , но решение не применимо к моей ситуации, и они в конечном итоге так и не решили проблему в любом случае .

Итак, как следует из заголовка, функция recognizer.Recognize() не всегда возвращается, даже, кажется, не выдает ошибку, которую я вижу, и я не могу понять, почему , Он последовательно возвращается для одного из моих тестовых файлов WAV (мы назовем этот working.wav ), но никогда не возвращается для моего другого файла ( failing.wav ). Эти файлы создаются одинаково и просто содержат краткую (8 секунд) запись одного и того же человека, задающего разные вопросы. Они оба имеют одинаковый период молчания в начале, и сам вопрос заканчивается примерно через 3-4 секунды, с примерно 4 секундами молчания в конце записи.

Я загрузил грамматики, попробовал и стандартная (пустая) грамматика, и эта пользовательская, и я обрабатываю SpeechDetected(), SpeechRecognized() и SpeechRecognitionRejected(). Ни одно из этих событий не вызывается для failing.wav , но они работают для working.wav .

Я также пытался установить свойства BabbleTimeout, EndSilenceTimeout, EndSilenceTimeoutAmbiguous и InitialSilenceTimeout равными примерно 1 секунде каждый, но они также не имели значения, поэтому я их удалил.

public string ReadQuestion()
{
    RecognitionResult recResults;
    string question = "Is this a default question?"; //default question for debug purposes

    using (SpeechRecognitionEngine recognizer = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("en-US")))
    {
        GrammarBuilder areYou = new GrammarBuilder("Are you");
        areYou.AppendDictation();

        Choices anActor = new Choices(new GrammarBuilder[] { areYou });
        Grammar grammar = new Grammar((GrammarBuilder)anActor);
        recognizer.LoadGrammar(grammar);

        //wav file generated by UE4
        recognizer.SetInputToWaveFile(@"..\..\..\..\..\Saved\BouncedWavFiles\question.wav");

        recognizer.SpeechDetected +=
            new EventHandler<SpeechDetectedEventArgs>(recognizer_SpeechDetected);

        recognizer.SpeechRecognized +=
            new EventHandler<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);

        recognizer.SpeechRecognitionRejected +=
            new EventHandler<SpeechRecognitionRejectedEventArgs>(recognizer_SpeechRecognitionRejected);

        try
        {
            Console.WriteLine("Entering STT...");
            recResults =  recognizer.Recognize();
            Console.WriteLine("Leaving STT...");

            question = recResults.Text;
        }
        catch (Exception e)
        {
            Console.WriteLine("Caught exception " + e.Message);
        }
    }

    return question;
}

Конечно, можно просто позвонить по номеру RecognizeAsync() и отменить через короткий промежуток времени, но это противоречит цели, вы знаете, иметь функциональный механизм распознавания речи, поскольку он не может возвращаться очень часто и, казалось бы, произвольные причины.

Если у кого-то возникнет какое-либо понимание того, почему Recognize() останавливается, или даже способов, которыми я мог бы лучше отладить это, я был бы очень благодарен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...