Pergunta

Eu realmente gosto de ofertas mais recentes de reconhecimento de fala da Microsofts (e SpeechSynthesis).

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

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

No entanto, sinto que sou um pouco limitado ao usar gramáticas.

Não me interpretem gramáticas erradas são ótimas para dizer exatamente ao reconhecimento de discurso que palavras / frases procurar, no entanto, e se eu quiser reconhecer algo que eu não dei de cabeça para baixo? Ou eu quero analisar uma frase que é o nome do comando meio pré-determinado e palavras meio aleatórias?

Por exemplo..

Cenário a - Eu digo "Google [Spill] e quero que ele abra o Google com os resultados da pesquisa para o termo entre colchetes, o que pode ser qualquer coisa.

Cenário b - Eu digo "Localize [Manchester] e quero que ele procure pelo Manchester no Google Maps ou qualquer outra coisa não pré-determinada

Quero saber que 'Google' e 'Locate' são comandos e o que vem depois que eles são parâmetros (e podem ser qualquer coisa).

Pergunta: Alguém sabe como misturar o uso de gramáticas pré-determinadas (palavras que o reconhecimento de fala deve reconhecer) e palavras que não estão em sua gramática pré-determinada?

Fragmentos de código ..

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);
}
Foi útil?

Solução

Você pode tentar algo assim ... Especifica uma lista de comandos conhecidos. Mas também permite usar o ditado aberto depois. Ele espera que haja um comando dado antes do ditado aberto. Mas você pode reverter isso ... e anexar isso no entanto, adicionando um espaço em branco no tipo de comando (""), ele também permitirá que você vá direto ao ditado papel.

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

Então, no seu reconhecedor, basta usar o texto do resultado etc

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

}

Você pode adicionar mais opções de escolha e semânticos à estrutura para fazer padrões mais complexos, se desejar. Também um curinga (por exemplo, GB.Appendwildcard ();).

Outras dicas

Você tem duas opções:

  1. Você pode usar o nó de ditado para texto livre usando GrammarBuilder :: AppendDictation. O problema é que, como o reconhecedor não tem nenhum contexto, os reconhecimentos não são a mais alta qualidade.
  2. Você pode usar um nó TextBuffer e fornecer um conjunto de itens usando GrammarBuilder :: Append (String, SubsetMatchingMode). Isso dará ao reconhecedor o contexto suficiente para obter reconhecimento de boa qualidade sem precisar reconstruir toda a gramática toda vez.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top