#voice-recognition #kinect-sdk #mute
#распознавание голоса #kinect-sdk #отключение звука
Вопрос:
Итак, я написал следующий код в качестве базового кода голосового управления для своего ПК, используя Kinect, и он работает хорошо! Но как только я попытался добавить что-то вроде кода «отключения звука», он перестал работать. Я понял, почему это перестало работать, но я не могу понять, как заставить это работать с каким-то кодом отключения звука, и это вызывает кровотечение из носа! Я чувствую, что ответ прост, и я просто забыл, как это сделать, или что я просто еще не думал об этом … вот что меня убивает.
В любом случае, как вы можете видеть, проблема заключается в том, что переменной «listen», которая инициализируется позже в коде, требуется начальное значение, чтобы ее можно было использовать в операторах if и switch. У меня начальное значение равно 0, так что ничего не будет запускаться, пока значение listen не будет установлено в 1, что происходит только после того, как я говорю «Привет, Джарвис» (вдохновленный Железным человеком, конечно). Однако, когда код проходит через новый цикл, он сбрасывает переменную «listen» обратно на ноль, потому что это значение, в котором она была инициализирована! Я не могу придумать способ сделать это значение переменной гибким для моих команд независимо от того, сколько циклов выполняет код. ЭТО ТАК РАССТРАИВАЕТ! Если кто-нибудь из вас сможет пролить свет на это, я был бы очень счастлив. Не стесняйтесь высмеивать любой новичковый код, который вы видите, если это поможет… просто, пожалуйста, покажите мне то, чего не видят мои глаза новичка!
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 aren"
"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) amp;amp; "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
метода и вместо инициализации его с помощью метода вы могли бы использовать его в качестве параметра.
Комментарии:
1. Не повезло … в вашем коде пропущена часть, где переменная listen инициализируется значением. Даже если вы скажете «Привет, Джарвис» и установите это значение равным 1 для вашего кода switch, как только код повторится, вы потеряете это значение, и регистр 0 останется по умолчанию. Кстати, я попробовал ваш код, просто чтобы убедиться.