TheRorooo Ответов: 1

Создание распознавания речи в C# распознавание фраз из заданного словаря в непрерывной речи


Я пытаюсь распознать инструкции с помощью распознавания речи в C#. Эти инструкции состоят из словаря заданных фраз, которые я знаю. До сих пор ничто не работает так, как мне нужно, так как мне нужно уметь распознавать эти фразы, когда они немедленно следуют друг за другом в непрерывной речи. В зависимости от первой фразы инструкции словарь для следующей отличается, но я, вероятно, смогу заставить это работать, даже если смогу распознавать все эти фразы в любое время.

Я действительно искал решения и пытался заставить это работать, но в настоящее время я не знаю, что делать, так как в настоящее время ничто не соответствует моим ожиданиям. Надеюсь, кто-нибудь сможет придумать лучшее решение этой проблемы. Я открыт для любых решений, включая использование других API, до тех пор, пока они будут работать в автономном режиме (и желательно бесплатно).

Что я уже пробовал:

Я попробовал использовать встроенный Система.Речь.Распознавание ИНТЕРФЕЙС ПРИКЛАДНОГО ПРОГРАММИРОВАНИЯ. Используя словарь диктанта, точность недостаточно хороша для того, чтобы я мог работать с ним. Я попытался использовать указанную грамматику, но проблема здесь в том, что она не может распознать фразы, когда они сразу следуют друг за другом.

Я также нашел метод PauseRecognizerOnRecognition, который, похоже, является чем-то вроде того, что я ищу. Но это, похоже, работает только для SpeechRecognizer, а не SpeechRecognitionEngine. Однако для моих нужд всплывающие окна и звуки, создаваемые при использовании SpeechRecognizer, нежелательны, и я все равно не смог заставить его работать.

I managed to get a little further using the Append method in GrammarBuilder. Thanks to this I can now have a set of phrases immediately following each other recognized. One of my issues with this approach is, that depending on the start of the instruction I may expect a different amount of phrases to follow it. The only solution here would be to add all the possible phrases as well as their variations with optional parts at the end. This would not only be tedious but likely very inefficient. For my use case, the phrases I expect to follow differ depending on what precedes them. Unfortunately, there doesn't seem to be any way to recognize the phrases fast enough to be able to say which phrases to expect afterward nor did I find a way to buffer the input waiting for the first part to be recognized and processing the following one based on what is said in the first. The recognition just doesn't seem to be quick enough whatever I do to even recognize the following phrase from a specified vocabulary let alone change the vocabulary based on what has been said.

1 Ответов

Рейтинг:
12

Thomas Daniels

Проверьте это Выбор[^] класс в системе.Речь.API распознавания. A Choices объект-это то, что вы можете добавить к GrammarBuilder с помощью .Append, и вы можете создать Choices как из строкового массива, так и из массива GrammarBuilder. Я никогда не проводил экспериментов до такой степени но Choices это должно позволить создать "древовидную" грамматическую структуру, которую вы хотите иметь.


TheRorooo

Thank you for your reply. Maybe I didn't explain myself well. I am currently using a combination of Choices and .Append as you suggest. My problem is that let's say I have .Apppend 3 times and I want a fourth or even fifth optional one. It would also be the best for me to change the order of the next appends based on the phrase recognized from the first one as I currently would need to include the phrases in both. I also don't think this is really a tree structure as once you branch to one phrase you still have an option for all the same phrases in the next append which ideally you shouldn't. Or actually reading you comment one more time, do you mean you can include a whole grammar builder as one of the choices and try to make a tree-like structure that way?

TheRorooo

Ладно, думаю, я понял, что ты имел в виду. Не знал, что вы можете использовать целый GrammarBuilder внутри выбора! Это выглядит очень многообещающе с некоторых начальных испытаний :) Большое спасибо.

Thomas Daniels

Да, возможно, мне следовало бы подчеркнуть это-тот факт, что у вас есть выбор Грамматиков, делает его хорошим вариантом для вас. Вы можете создать GrammarBuilder, у которого есть "[инструкция 1]", за которым следуют варианты "[1a]", "[1b]" и т. д. - и создать такой GrammarBuilder для каждой инструкции верхнего уровня и поместить все это в другой выбор.

TheRorooo

Пока что работает довольно хорошо. Единственное, что было бы полезно в некоторых ситуациях для меня, и я до сих пор не могу найти способ сделать это, - это иметь инструкцию, за которой следует назвать Некоторое количество заданных фраз, которые могут быть от одной до всех. Я, вероятно, мог бы добавить одни и те же параметры несколько раз, но тогда распознавание не останавливается. Поскольку я все равно планирую использовать push to talk для этого проекта, возможно, я мог бы просто взять текущую гипотетическую речь после того, как отпущу кнопку. Этот подход, вероятно, также позволит мне иметь необязательные фразы в конце инструкции. Если у вас есть идеи получше, пожалуйста, дайте мне знать.

Thomas Daniels

Я также не проводил экспериментов с этим, но, возможно, вы могли бы попробовать пустую строку или пустой GrammarBuilder в объекте Choices? И/или установите свойство BabbleTimeout в SpeechRecognitionEngine на ненулевое значение?

TheRorooo

Спасибо за предложение. Включение пустой строки В выбор вызвало ошибку, но включение пробела, похоже, действительно работает. Я не очень хорошо знаком со свойством BabbleTimeout, хотя и пытался возиться с ним раньше. Если я правильно понимаю, это время, когда распознаватель ждет после того, как он ничего не слышит, прежде чем он закончит распознавание. Разве нулевое значение заставляет его ждать бесконечно в этом случае? Но все же, возможно, для моего толчка к разговору использование подхода, предложенного мной ранее, может быть лучше, потому что таким образом распознаватель речи не останавливается, когда я делаю перерыв при названии этих вещей. В любом случае, спасибо.

Thomas Daniels

Я думаю, что установка его на ноль заставит его ждать бесконечно долго, да.

Хотя, если подумать, вам, вероятно, не стоит использовать BabbleTimeout. В этом случае RecognitionResult будет равен null, который вы, вероятно, не сможете использовать.

TheRorooo

Ну что ж, большое спасибо. У меня есть кое-что, что работает, и я могу экспериментировать с этим сейчас. Текущий подход с пробелами работает, но я мог бы попробовать использовать гипотетический текст после освобождения кнопки push to talk, как только я доберусь до реализации этого. Самая большая проблема с нынешним подходом на самом деле заключается в том, что вы вообще не можете сделать перерыв, называя эти вещи, и я не думаю, что есть какой-либо способ настроить время ожидания.
Во всяком случае, я новичок на этом сайте, но пока очень впечатлен. Долгое время искал решение и не смог получить ответ на переполнение стека. Но потом я решил попробовать спросить Здесь после того, как наткнулся на ваше руководство по распознаванию речи, которое помогло мне обнаружить его .Функция добавления :)

Thomas Daniels

Да, такой подход тоже должен работать. И рад слышать, что моя статья оказалась полезной :)