C # грамматика и подстановочный знак переключения - PullRequest
0 голосов
/ 16 сентября 2018

Я хотел бы добавить, что всякий раз, когда он распознает 'search X', он будет искать 'X', но я не знаю, как мне добавить это в грамматику, или как это сделатьс моим оператором switch.

private void Form1_Load(object sender, EventArgs e)
{
    Choices commands = new Choices();
    commands.Add(new string[] { "hello", "start chrome", "search" });
    GrammarBuilder gBuilder = new GrammarBuilder();
    gBuilder.Append(commands);
    gBuilder.Culture = new System.Globalization.CultureInfo("en-GB");
    Grammar grammar = new Grammar(gBuilder);

    recEngine.LoadGrammarAsync(grammar);
    recEngine.SetInputToDefaultAudioDevice();
    recEngine.SpeechRecognized += RecEngine_SpeechRecognized;
}

private void RecEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
    switch (e.Result.Text)
    {
        case "hello":
            synthesizer.SpeakAsync("Hello! How are you doing today?");
            break;
        case "start chrome":
            Process.Start("http://www.google.com");
            break;
        case "search":
            SearchChrome("search");
            break;
    }
}

static void SearchChrome(string searchterm)
{
    Process.Start("https://www.google.com/search?q=" + searchterm);
}

Поэтому я хотел бы добавить к моей грамматике «Поиск X» и к моим случаям «Поиск X», чтобы она искала любой X.

Заранее спасибо!

1 Ответ

0 голосов
/ 16 сентября 2018

Вы должны сделать более сложную грамматику. Тип правила грамматики, которое вы выбрали, является выбором. Это не совсем соответствует тому, что вы хотите сделать, так как вы хотите захватить то, что следует за ключевым словом. Чтобы получить следующее, вы должны использовать правило SemanticResultKey. Это объясняется здесь: https://docs.microsoft.com/en-us/dotnet/api/system.speech.recognition.semanticresultkey?view=netframework-4.7.2

Пример соответствует именно тому, что вы хотите: он извлекает пароль из выражения «Мой пароль .....»

...