Команды отключения звука
Поэтому я написал следующий код в качестве основного кода голосового управления для моего компьютера с помощью Kinect, и он работал хорошо! Но как только я попытался добавить что-то вроде "немого" кода, он перестал работать. Я понял, почему это перестало работать, но я не могу понять, как заставить его работать с каким-то немым кодом, и это вызывает кровотечение из носа! Я чувствую, что ответ прост, и я просто забыла, как это сделать, или я просто еще не подумала об этом... вот что меня убивает.
В любом случае, как вы можете видеть, проблема в том, что переменная "listen", которая инициализируется позже в коде, нуждается в начальном значении, чтобы иметь возможность использовать его в операторах if и switch. У меня начальное значение 0, так что ничего не будет работать до тех пор, пока прослушивание не будет установлено на 1, что происходит только после того, как я скажу "Привет, Джарвис" (вдохновленный Iron Man, конечно). Однако, когда код проходит новый цикл, он сбрасывает переменную "listen" обратно в ноль, потому что это значение, в котором он был инициализирован! Я не могу найти способ сделать это значение переменной гибким для моих команд независимо от того, сколько циклов делает код. Это так расстраивает! Если кто-нибудь из вас сможет пролить свет на это, я был бы очень счастливым человеком. Не стесняйтесь высмеивать любой код noob, который вы видите, если это помогает... просто, пожалуйста, покажите мне, что мои глаза noob не видят!
namespace Speech
{
using System;
using System.IO;
using System.Linq;
using System.Threading;
using Microsoft.Kinect;
using Microsoft.Speech.AudioFormat;
using Microsoft.Speech.Recognition;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
public class Program
{
public static void Main(string[] args)
{
KinectSensor sensor = (from sensorToCheck in KinectSensor.KinectSensors where sensorToCheck.Status == KinectStatus.Connected select sensorToCheck).FirstOrDefault();
if (sensor == null)
{
Console.WriteLine(
"No Kinect sensors are attached to this computer or none of the ones that are\n" +
"attached are \"Connected\".\n" +
"Attach the KinectSensor and restart this application.\n" +
"Make sure the Power Adapter of the Kinect sensor is plugged in \n" +
"Press any key to continue.\n");
// Give a chance for user to see console output before it is dismissed
Console.ReadKey(true);
return;
} // end if (sensor == null)
sensor.Start();
// Obtain the KinectAudioSource to do audio capture
KinectAudioSource source = sensor.AudioSource;
source.EchoCancellationMode = EchoCancellationMode.None; // No AEC for this sample
source.AutomaticGainControlEnabled = false; // Important to turn this off for speech recognition
RecognizerInfo ri = GetKinectRecognizer();
if (ri == null)
{
Console.WriteLine("Could not find Kinect speech recognizer. Please refer to the sample requirements.");
return;
}
Console.WriteLine("Using: {0}", ri.Name);
// NOTE: Need to wait 4 seconds for device to be ready right after initialization
int wait = 4;
while (wait > 0)
{
Console.Write("Device will be ready for speech recognition in {0} second(s).\r", wait--);
Thread.Sleep(1000);
}
Console.Write("\n");
//============================================================================
using (var sre = new SpeechRecognitionEngine(ri.Id))
{
var command = new Choices();
//***************************************************
command.Add("Hey Jarvis");
command.Add("Open Videos");
command.Add("Parenthood");
command.Add("Down Ten");
command.Add("Down Five");
command.Add("Down Three");
command.Add("Down Two");
command.Add("Down One");
command.Add("Up Ten");
command.Add("Up Five");
command.Add("Up Three");
command.Add("Up Two");
command.Add("Up One");
command.Add("Yes");
command.Add("Full Screen");
command.Add("Minimize");
command.Add("Volume Up");
command.Add("Volume Down");
command.Add("Go Back");
command.Add("Go Forward");
command.Add("Pause");
command.Add("Close Window");
command.Add("Minimize");
command.Add("Next");
command.Add("Play");
command.Add("Episode Sixteen");
command.Add("Episode Seventeen");
command.Add("Episode Eighteen");
command.Add("Episode Nineteen");
command.Add("Episode Twenty");
command.Add("Episode Twenty One");
command.Add("Episode Twenty Two");
command.Add("Episode Twenty Three");
command.Add("Episode Twenty Four");
command.Add("Right");
command.Add("Left");
command.Add("Open Dark Souls");
command.Add("No Steam");
//***************************************************
var gb = new GrammarBuilder { Culture = ri.Culture };
// Specify the culture to match the recognizer in case we are running in a different culture.
gb.Append(command);
// Create the actual Grammar instance, and then load it into the speech recognizer.
var g = new Grammar(gb);
sre.LoadGrammar(g);
sre.SpeechRecognized += SreSpeechRecognized;
// sre.SpeechHypothesized += SreSpeechHypothesized;
// sre.SpeechRecognitionRejected += SreSpeechRecognitionRejected;
using (Stream s = source.Start())
{
sre.SetInputToAudioStream(
s, new SpeechAudioFormatInfo(EncodingFormat.Pcm, 16000, 16, 1, 32000, 2, null));
Console.WriteLine("The System is actively monitoring Voice command ... \n");
sre.RecognizeAsync(RecognizeMode.Multiple);
Console.ReadLine();
}
} // end using (var sre = new SpeechRecognitionEngine(ri.Id))
//==========================================================================
sensor.Stop();
} // end public static void Main
private static RecognizerInfo GetKinectRecognizer()
{
Func<RecognizerInfo, bool> matchingFunc = r =>
{
string value;
r.AdditionalInfo.TryGetValue("Kinect", out value);
return "True".Equals(value, StringComparison.InvariantCultureIgnoreCase) && "en-US".Equals(r.Culture.Name, StringComparison.InvariantCultureIgnoreCase);
};
return SpeechRecognitionEngine.InstalledRecognizers().Where(matchingFunc).FirstOrDefault();
}
private static void SreSpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
int listen=0; //<<<<<<<< HERES THE PROBLEM
if (e.Result.Confidence >= 0.7)
{
Console.WriteLine("\nSpeech Recognized: \t{0}\tConfidence:\t{1}", e.Result.Text, e.Result.Confidence);
switch (e.Result.Text)
{
case "Hey Jarvis":
Console.Write(" Yes Gary?");
listen=1;
break;
case "Open Videos":
Console.Write("Open Videos");
if (listen == 1) SendKeys.SendWait("{F9}");
else Console.Write(" Muted");
break;
case "Parenthood":
Console.Write("Parenthood");
if (listen == 1)
{
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
}
else Console.Write(" Muted");
break;
case "Down Ten":
Console.Write("Down Ten");
if (listen == 1) SendKeys.SendWait("{Down 10}");
else Console.Write(" Muted");
break;
case "Down Five":
Console.Write("Down Five");
if (listen == 1) SendKeys.SendWait("{Down 5}");
else Console.Write(" Muted");
break;
case "Down Three":
Console.Write("Down Three");
if (listen == 1) SendKeys.SendWait("{Down 3}");
else Console.Write(" Muted");
break;
case "Down Two":
Console.Write("Down Two");
if (listen == 1) SendKeys.SendWait("{Down 2}");
else Console.Write(" Muted");
break;
case "Down One":
Console.Write("Down One");
if (listen == 1) SendKeys.SendWait("{Down}");
else Console.Write(" Muted");
break;
case "Up Ten":
Console.Write("Up Ten");
if (listen == 1) SendKeys.SendWait("{Up 10}");
else Console.Write(" Muted");
break;
case "Up Five":
Console.Write("Up Five");
if (listen == 1) SendKeys.SendWait("{Up 5}");
else Console.Write(" Muted");
break;
case "Up Three":
Console.Write("Up Three");
if (listen == 1) SendKeys.SendWait("{Up 3}");
else Console.Write(" Muted");
break;
case "Up Two":
Console.Write("Up Two");
if (listen == 1) SendKeys.SendWait("{Up 2}");
else Console.Write(" Muted");
break;
case "Up One":
Console.Write("Up One");
if (listen == 1) SendKeys.SendWait("{Up}");
else Console.Write(" Muted");
break;
case "Yes":
Console.Write("Yes");
if (listen == 1) SendKeys.SendWait("{Enter}");
else Console.Write(" Muted");
break;
case "Full Screen":
Console.Write("Full Screen");
if (listen == 1) SendKeys.SendWait("{f}");
else Console.Write(" Muted");
break;
case "Exit":
Console.Write("Exit");
if (listen == 1) SendKeys.SendWait("{ESC}");
else Console.Write(" Muted");
break;
case "Volume Up":
Console.Write("Volume Up");
if (listen == 1) SendKeys.SendWait("^{Up}");
else Console.Write(" Muted");
break;
case "Volume Down":
Console.Write("Volume Down");
if (listen == 1) SendKeys.SendWait("^{DOWN}");
else Console.Write(" Muted");
break;
case "Go Back":
Console.Write("Go Back");
if (listen == 1) SendKeys.SendWait("%{LEFT}");
else Console.Write(" Muted");
break;
case "Go Forward":
Console.Write("Go Forward");
if (listen == 1) SendKeys.SendWait("%{RIGHT}");
else Console.Write(" Muted");
break;
case "Pause":
Console.Write("Pause");
if (listen == 1) SendKeys.SendWait(" ");
else Console.Write(" Muted");
break;
case "Play":
Console.Write("Play");
if (listen == 1) SendKeys.SendWait(" ");
else Console.Write(" Muted");
break;
case "Close Window":
Console.Write("Close Window");
if (listen == 1) SendKeys.SendWait("%{F4}");
else Console.Write(" Muted");
break;
case "Right":
Console.Write("Right");
if (listen == 1) SendKeys.SendWait("{RIGHT}");
else Console.Write(" Muted");
break;
case "Left":
Console.Write("Left");
if (listen == 1) SendKeys.SendWait("{Left}");
else Console.Write(" Muted");
break;
case "Episode Sixteen":
Console.Write("Episode Sixteen");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 15}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Episode Seventeen":
Console.Write("Episode Seventeen");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 16}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Episode Eighteen":
Console.Write("Episode Eighteen");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 17}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Episode Nineteen":
Console.Write("Episode Nineteen");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 18}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Episode Twenty":
Console.Write("Episode Twenty");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 19}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Episode Twenty One":
Console.Write("Episode Twenty One");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 20}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Episode Twenty Two":
Console.Write("Episode Twenty Two");
if (listen == 1)
{
SendKeys.SendWait("{F9}");
Thread.Sleep(17000);
SendKeys.SendWait("{p}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(500);
SendKeys.SendWait("{DOWN 21}");
Thread.Sleep(500);
SendKeys.SendWait("{ENTER}");
Thread.Sleep(15000);
SendKeys.SendWait("{f}");
}
else Console.Write(" Muted");
break;
case "Minimize":
Console.Write("Minimize");
if (listen == 1)
{
SendKeys.SendWait("% ");
SendKeys.SendWait("{n}");
}
else Console.Write(" Muted");
break;
case "Next":
Console.Write("Next");
if (listen == 1)
{
SendKeys.SendWait("%{TAB 2}");
}
else Console.Write(" Muted");
break;
case "Open Dark Souls":
Console.Write("Open Dark Souls");
if (listen == 1) SendKeys.SendWait("{F7}");
else Console.Write(" Muted");
break;
case "No Steam":
Console.Write("No Steam");
if (listen == 1)
{
SendKeys.SendWait("+{TAB}");
Thread.Sleep(1000);
SendKeys.SendWait("+{TAB}");
}
else Console.Write(" Muted");
break;
case "Thanks Jarvis":
Console.Write(" You're Welcome");
listen = 0;
break;
} // end switch (e.Result.Text)
} // end if (e.Result.Confidence >= 0.7)
else
{
Console.WriteLine("\nSpeech Recognized but confidence was too low: \t{0}", e.Result.Confidence);
// DumpRecordedAudio(e.Result.Audio);
}
} // end private static void SreSpeechRecognized
} // end public class Program
} // end namespace Speech
1 ответ
Почему бы не заключить в кавычки switch
заявление внутри другого switch
,
Например:
switch (listen)
{
case 0:
switch (e.Result.Text)
{
case "Hey Jarvis":
Console.Write(" Yes Gary?");
listen=1;
break;
case default:
Console.Write(" Muted");
break;
}
break;
case 1:
// All your normal code
}
Раньше я не использовал kinect-sdk, но я думаю, что логика должна сохраняться. Я думаю, что вы написали, это круто, и я обязательно буду использовать это для чего-то.
В качестве альтернативы вы можете вернуть значение listen из SreSpeechRecognized
метод и вместо того, чтобы инициализировать его с помощью метода, вы можете принять его в качестве параметра.