Как смешать грамматику (правила) и диктовку (свободу слова) с SpeechRecognizer в C # - PullRequest
11 голосов
/ 15 июня 2010

Мне действительно нравятся последние предложения Microsoft по распознаванию речи (и 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 или что-то еще, не предопределенное

Я хочу, чтобы он знал, что «Google» и «Locate» - это команды, а после них - параметры (и может быть что угодно).

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

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

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);
}

Ответы [ 2 ]

5 голосов
/ 30 июля 2010

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

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 ();).

4 голосов
/ 15 июня 2010

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

  1. Вы можете использовать узел диктовки для свободного текста, используя GrammarBuilder :: AppendDictation . Проблема в том, что, поскольку у распознавателя нет контекста, распознавания не самого высокого качества.
  2. Вы можете использовать узел textbuffer и предоставить набор элементов, используя GrammarBuilder :: Append (String, SubsetMatchingMode) . Это даст распознавателю достаточно контекста, чтобы получить распознавания хорошего качества без необходимости каждый раз перестраивать все грамматическое дерево.
...