多级语音命令?
Multi-level Speech Commands?
我正在尝试进行多级命令演讲,但我遇到了一些问题...
我想要主命令,例如:"TV"、"Light"、"water" 等
例如,当我说 "TV" 时,我想为所需的操作提供子命令,例如:
当我说 "TV" 时:子命令 -> "Volume up"、"Volume down"、"power off"、"power on"
我只会识别电视命令,直到我说 "TV done"。然后我回到主命令的列表。
我该怎么做?
我的实际代码是这样的:
class Program
{
static Dictionary<string, string> listaCanais = new Dictionary<string, string>()
{
{ "Fox News", "0 6 0" },
{ "The Weather Channel", "0 3 1"},
{ "Spike", "0 3 8"}
};
static void Main(string[] args)
{
using (var sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("pt-BR")))
{
sre.SetInputToDefaultAudioDevice();
sre.LoadGrammarAsync(Comandos());
sre.RequestRecognizerUpdate();
sre.SpeechRecognitionRejected += sre_SpeechRecognitionRejected;
sre.SpeechRecognized += sre_SpeechRecognized;
sre.RecognizeAsync(RecognizeMode.Multiple);
Console.ReadLine();
}
}
public static Grammar Comandos()
{
Choices numerosTV = new Choices("zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "10", "11", "12");
GrammarBuilder fraseNumeroTV = new GrammarBuilder(numerosTV);
GrammarBuilder fraseMudarCanal = new GrammarBuilder("TV, canal");
fraseMudarCanal.Append(numerosTV);
//fraseMudarCanal.Append(numerosTV);
//fraseMudarCanal.Append(numerosTV);
Choices nomeCanal = new Choices();
foreach (string key in listaCanais.Keys)
{
nomeCanal.Add(key);
}
GrammarBuilder fraseNomeCanal = new GrammarBuilder("TV, canal");
fraseNomeCanal.Append(nomeCanal);
GrammarBuilder fraseMudo = new GrammarBuilder("TV, silencioso");
GrammarBuilder fraseLigar = new GrammarBuilder("TV, ligar");
GrammarBuilder fraseFecharApp = new GrammarBuilder("Controle, fechar aplicativo");
GrammarBuilder frasePauseComandoVoz = new GrammarBuilder("Controle, pausar comando de voz");
GrammarBuilder fraseIniciarComandoVoz = new GrammarBuilder("Controle, ativar comando de voz");
Choices opcoesPrincipais = new Choices(new GrammarBuilder[] {fraseMudarCanal,
fraseNomeCanal,
fraseMudo,
fraseLigar,
fraseFecharApp,
frasePauseComandoVoz,
fraseIniciarComandoVoz});
Grammar resultado = new Grammar((GrammarBuilder)opcoesPrincipais);
return resultado;
}
static void sre_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
{
Console.WriteLine("Ignorado");
}
// Create a simple handler for the SpeechRecognized event.
static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
Console.WriteLine("Ouvi");
if (e.Result == null)
return;
Console.WriteLine("[ " + e.Result.Confidence + " ]" + "Reconhecido: " + e.Result.Text);
}
}
提前致谢。
这些事情在state machine framework内很容易实现。您定义识别器的状态并根据它进行操作,主要工作在 onRecognitionResult 方法中完成:
states = {INPUT, TV, WATER};
inputGrammar = createInputGrammar();
tvGrammar = createTvGrammar();
waterGrammar = createWaterGrammar();
state = INPUT;
vodi onRecognitionResult() {
if (state == INPUT) {
if (result == "TV") {
state = TV;
recognizer.loadGrammar(tvGrammar);
}
}
if (state == TV) {
if (result == "Volume UP") {
raiseVolume();
}
if (result == "TV done") {
state = INPUT;
recognizer.loadGrammar(inputGrammar);
}
}
// Restart recognition
recognizer.recognizeAsync();
}
您可以阅读 Simple state machine example in C#? 了解更多信息。
我正在尝试进行多级命令演讲,但我遇到了一些问题...
我想要主命令,例如:"TV"、"Light"、"water" 等
例如,当我说 "TV" 时,我想为所需的操作提供子命令,例如:
当我说 "TV" 时:子命令 -> "Volume up"、"Volume down"、"power off"、"power on"
我只会识别电视命令,直到我说 "TV done"。然后我回到主命令的列表。
我该怎么做?
我的实际代码是这样的:
class Program
{
static Dictionary<string, string> listaCanais = new Dictionary<string, string>()
{
{ "Fox News", "0 6 0" },
{ "The Weather Channel", "0 3 1"},
{ "Spike", "0 3 8"}
};
static void Main(string[] args)
{
using (var sre = new SpeechRecognitionEngine(new System.Globalization.CultureInfo("pt-BR")))
{
sre.SetInputToDefaultAudioDevice();
sre.LoadGrammarAsync(Comandos());
sre.RequestRecognizerUpdate();
sre.SpeechRecognitionRejected += sre_SpeechRecognitionRejected;
sre.SpeechRecognized += sre_SpeechRecognized;
sre.RecognizeAsync(RecognizeMode.Multiple);
Console.ReadLine();
}
}
public static Grammar Comandos()
{
Choices numerosTV = new Choices("zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "10", "11", "12");
GrammarBuilder fraseNumeroTV = new GrammarBuilder(numerosTV);
GrammarBuilder fraseMudarCanal = new GrammarBuilder("TV, canal");
fraseMudarCanal.Append(numerosTV);
//fraseMudarCanal.Append(numerosTV);
//fraseMudarCanal.Append(numerosTV);
Choices nomeCanal = new Choices();
foreach (string key in listaCanais.Keys)
{
nomeCanal.Add(key);
}
GrammarBuilder fraseNomeCanal = new GrammarBuilder("TV, canal");
fraseNomeCanal.Append(nomeCanal);
GrammarBuilder fraseMudo = new GrammarBuilder("TV, silencioso");
GrammarBuilder fraseLigar = new GrammarBuilder("TV, ligar");
GrammarBuilder fraseFecharApp = new GrammarBuilder("Controle, fechar aplicativo");
GrammarBuilder frasePauseComandoVoz = new GrammarBuilder("Controle, pausar comando de voz");
GrammarBuilder fraseIniciarComandoVoz = new GrammarBuilder("Controle, ativar comando de voz");
Choices opcoesPrincipais = new Choices(new GrammarBuilder[] {fraseMudarCanal,
fraseNomeCanal,
fraseMudo,
fraseLigar,
fraseFecharApp,
frasePauseComandoVoz,
fraseIniciarComandoVoz});
Grammar resultado = new Grammar((GrammarBuilder)opcoesPrincipais);
return resultado;
}
static void sre_SpeechRecognitionRejected(object sender, SpeechRecognitionRejectedEventArgs e)
{
Console.WriteLine("Ignorado");
}
// Create a simple handler for the SpeechRecognized event.
static void sre_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
Console.WriteLine("Ouvi");
if (e.Result == null)
return;
Console.WriteLine("[ " + e.Result.Confidence + " ]" + "Reconhecido: " + e.Result.Text);
}
}
提前致谢。
这些事情在state machine framework内很容易实现。您定义识别器的状态并根据它进行操作,主要工作在 onRecognitionResult 方法中完成:
states = {INPUT, TV, WATER};
inputGrammar = createInputGrammar();
tvGrammar = createTvGrammar();
waterGrammar = createWaterGrammar();
state = INPUT;
vodi onRecognitionResult() {
if (state == INPUT) {
if (result == "TV") {
state = TV;
recognizer.loadGrammar(tvGrammar);
}
}
if (state == TV) {
if (result == "Volume UP") {
raiseVolume();
}
if (result == "TV done") {
state = INPUT;
recognizer.loadGrammar(inputGrammar);
}
}
// Restart recognition
recognizer.recognizeAsync();
}
您可以阅读 Simple state machine example in C#? 了解更多信息。