Существует аналогичный вопрос, что здесь уже существует , но решение не применимо к моей ситуации, и они в конечном итоге так и не решили проблему в любом случае .
Итак, как следует из заголовка, функция 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()
останавливается, или даже способов, которыми я мог бы лучше отладить это, я был бы очень благодарен.