Мне действительно нравится 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);
}
Вы можете попробовать что-нибудь вроде этого ... Он определяет список известных команд ... но также позволяет вам впоследствии использовать открытую диктовку. Ожидается, что перед открытой диктовкой будет дана команда ... но вы можете отменить это ... и добавить 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 ();).
У вас есть два варианта: