我正在制作一个小型语音指令程序,我希望在给出某些命令时要求确认...就像"嘿,计算机,关闭程序"然后是口头问题"你确定吗?"然后回应我的口头答复;是还是不是。我是c#的新手,无法找到任何相关内容。以下代码是我已配置的语音命令的示例:
private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
switch (e.Result.Text)
{
case "hey computer, start spotify":
synthesizer.SelectVoiceByHints(VoiceGender.Female);
synthesizer.SpeakAsync("starting SPOTteFY");
string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
string extentionToPath = "Spotify\\Spotify.exe";
string finalPath = Path.Combine(appDataPath, extentionToPath);
Process.Start(finalPath);
//Process.Start("C:\\Users\\Danny\\AppData\\Roaming\\Spotify\\Spotify.exe");
break;
case "hey computer, start chrome":
synthesizer.SelectVoiceByHints(VoiceGender.Female);
synthesizer.SpeakAsync("Starting Chrome");
Process.Start("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe");
break;
case "hey computer, new tab":
SendKeys.Send("^t");
break;
case "hey computer, close program":
synthesizer.SelectVoiceByHints(VoiceGender.Female);
synthesizer.SpeakAsync("Closing program");
SendKeys.Send("%{F4}");
break;
case "next song please":
keybd_event(VK_MEDIA_NEXT_TRACK, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
break;
case "stop song please":
keybd_event(VK_MEDIA_PLAY_PAUSE, 0, KEYEVENTF_EXTENTEDKEY, IntPtr.Zero);
break;
case "hey computer, start netflix":
synthesizer.SelectVoiceByHints(VoiceGender.Female);
synthesizer.SpeakAsync("Starting Netflix");
System.Diagnostics.Process.Start("https://www.netflix.com/browse");
break;
case "hey computer, pause netflix":
SendKeys.Send(" ");
break;
case "hey computer, start reddit":
synthesizer.SelectVoiceByHints(VoiceGender.Female);
synthesizer.SpeakAsync("Starting reddit");
System.Diagnostics.Process.Start("https://www.reddit.com");
break;
case "hey computer, show me the news":
synthesizer.SelectVoiceByHints(VoiceGender.Female);
synthesizer.SpeakAsync("Showing you what's going on");
System.Diagnostics.Process.Start("http://nu.nl");
break;
case "hey computer, hide yourself":
this.WindowState = FormWindowState.Minimized;
break;
}
}
答案 0 :(得分:1)
您可以在执行命令(您发言)之前,运行一个事件并请求许可。但请注意,此解决方案适用于用户界面。对于其他解决方案,请查看选项2。
选项1:
public SomeClass() {
PermissionEvent += this_PermissionEvent;
}
private void this_PermissionEvent(object sender, PermissionEventArgs args) {
// MessageBox.Show(...) waits until you closed the window (yes/no/closed/terminated)
if (MessageBox.Show("Do you want execute?","Grant Permission",MessageBoxButtons.YesNo) == DialogResult.Yes) {
args.Handle = true;
}
}
private event EventHandler<PermissionEventArgs> PermissionEvent;
private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
switch (e.Result.Text)
{
case "hey computer, start spotify":
//
var args = new PermissionEventArgs();
// args is a reference type. That means, when you change args.Handle in this_PermissionEvent(...) then this args.Handle is also changed.
PermissionEvent?.Invoke(args)
// here we check the condition that might be changed.
if (args.Handle) {
// do something here
}
break;
}
}
public class PermissionEventArgs : EventArgs {
public bool Handle = false
}
这是一个解决方案,其中反馈可以同步发生,而无需使用列表,一种历史。
当您想要回答“你确定吗?”时,可以使用列表。这意味着,您启动一个命令并将其与此命令的信息放在一个列表中,并立即运行一个读取列表条目的功能。现在您应该使用有关这些命令的信息,删除无效条目,在它们为真时执行函数等等。
这是一个小例子:
选项2:
List<Entry> list; // This list contains the commands
public SomeClass() {
list = new List<Entry>(); // initializion of the list in the constructor
}
private void verifyList() {
if (list.Count == 0)
return;
if (list[0].Cmd == Command.Yes || list[0].Cmd == Command.No) {
list.Clear();
} else if (!list[0].NeedConfirm || (list.Count == 2 && list[1].Cmd == Command.Yes)) {
list[0].Call?.Invoke();
list.Clear();
} else if (list.Count >= 2) {
list.Clear();
}
}
private void recEngine_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
switch (e.Result.Text)
{
case "hey computer, start spotify":
list.Add(new Entry() { Cmd = Command.Yes, Call = new Action(() => {
// start spotify
}) });
verifyList();
break;
case "confirm command":
list.Add(new Entry() { Cmd = Command.Yes });
verifyList();
break;
case "do not confirm command":
list.Add(new Entry() { Cmd = Command.No });
verifyList();
break;
}
}
// This class holds all important stuff of one command.
// 1. The kind of command
// 2. the action that performs if condition in verifyList() are true
// 3. And NeedConfirm that the verifiyList() needs
public class Entry {
Command Cmd;
Action Call;
bool NeedConfirm;
}
public enum Command {
StartSpotify,
Yes,
No
}