Как смешать Грамматику (Правила) и Диктовка (Свобода слова) с SpeechRecognizer в C#

Мне действительно нравится Microsofts последнее распознавание речи (и SpeechSynthesis) предложения.

http://msdn.microsoft.com/en-us/library/ms554855.aspx

http://estellasays.blogspot.com/2009/04/speech-recognition-in-cnet.html

Однако я чувствую, что несколько ограничен при использовании грамматик.

Не получайте меня неправильно, грамматики являются большими для сообщения распознавания речи точно, какие слова / фразы для внимательности, однако что, если я хочу, чтобы оно распознало что-то, которое я не дал его головы о? Или я хочу проанализировать фразу, которая является половиной предопределенного названия команды и половины случайных слов?

Например..

Сценарий A - я говорю "Google [Разлив нефти]", и я хочу, чтобы он открыл Google с результатами поиска для термина в скобках, который мог быть чем-либо.

Сценарий B - я говорю, "Располагаются [Манчестер]", и я хочу, чтобы он искал Манчестер в Google Maps или чем-либо еще не предопределенном

Я хочу, чтобы это знало, что 'Google' и 'Располагается', команды и что прибывает после него, параметры (и могло быть что-либо).

Вопрос: кто-либо знает, как смешать использование предопределенных грамматик (слова, которые распознавание речи должно распознать), и слова не в его предопределенной грамматике?

Фрагменты кода..

using System.Speech.Recognition;

...
...

SpeechRecognizer rec = new SpeechRecognizer();
rec.SpeechRecognized += rec_SpeechRecognized;

var c = new Choices();
c.Add("search");

var gb = new GrammarBuilder(c);
var g = new Grammar(gb);
rec.LoadGrammar(g);
rec.Enabled = true; 

...
...

void rec_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    if (e.Result.Text == "search")
    {
        string query = "How can I get a word not defined in Grammar recognised and passed into here!";

        launchGoogle(query);
    }
}

...
...


private void launchGoogle(string term)
{
    Process.Start("IEXPLORE", "google.com?q=" + term);
}

11
задан Eric Brown 15 June 2010 в 17:08
поделиться

2 ответа

Вы можете попробовать что-нибудь вроде этого ... Он определяет список известных команд ... но также позволяет вам впоследствии использовать открытую диктовку. Ожидается, что перед открытой диктовкой будет дана команда ... но вы можете отменить это ... и добавить th Однако, добавив пробел в тип команды (""), вы также сможете сразу перейти к части диктовки.

Choices commandtype = new Choices();
commandtype.Add("search");
commandtype.Add("print");
commandtype.Add("open");
commandtype.Add("locate");

SemanticResultKey srkComtype = new SemanticResultKey("comtype",commandtype.ToGrammarBuilder());

 GrammarBuilder gb = new GrammarBuilder();
 gb.Culture = System.Globalization.CultureInfo.CreateSpecificCulture("en-GB");
 gb.Append(srkComtype);
 gb.AppendDictation();

 Grammar gr = new Grammar(gb);

тогда в вашем распознавателе просто используйте текст результата и т. Д.

private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    System.Console.WriteLine(e.Result.Text);

}

Вы можете добавить больше вариантов выбора и SemanticResultKeys в структуру, чтобы создавать более сложные шаблоны, если хотите. Также подстановочный знак (например, gb.AppendWildcard ();).

5
ответ дан 3 December 2019 в 10:24
поделиться

У вас есть два варианта:

  1. Вы можете использовать узел диктовки для произвольного текста, используя GrammarBuilder :: AppendDictation . Проблема в том, что, поскольку у распознавателя нет контекста, распознавание не самого высокого качества.
  2. Вы можете использовать узел текстового буфера и предоставить набор элементов с помощью GrammarBuilder :: Append (String, SubsetMatchingMode) . Это даст распознавателю достаточно контекста для получения качественного распознавания без необходимости каждый раз перестраивать все дерево грамматики.
4
ответ дан 3 December 2019 в 10:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: