Como misturar gramática (regras) e ditado (liberdade de expressão) com SpeechRecognizer em C#
-
27-09-2019 - |
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);
}
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:
- 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.
- 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.