This is really old. I will release another tutorial updating this eventually. Follow my blog to get an update when that happens. Thanks!
While this sounds advanced (and it can be), it’s not that hard to set up a very basic setup where a custom application runs in the background in C# by using the built in speech recognition libraries in Windows 10.
Taking this idea further, I personally have a “Jarvis” that runs on my computer, automating basically all of my common actions, including launching games, music, sleeping my computer, adjusting the volume, minimizing windows, controlling the lights, and (best of all), sending emails and messages. I recommend using an external API for speech recognition if you’re serious about building something similar, as Microsoft’s sucks. You can build your own, or attempt to use something like Google’s API.
Anyway, here’s some simple C# code that should get some ideas flowing.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.Globalization; | |
using System.Runtime.InteropServices; | |
using System.Threading; | |
using System.Windows.Forms; | |
using Microsoft.Speech.Recognition; | |
using Process = System.Diagnostics.Process; | |
using System.Diagnostics; | |
namespace VoiceAssistant | |
{ | |
class Program | |
{ | |
#region Native Stuff | |
const int Hide = 0; | |
const int Show = 1; | |
[DllImport("Kernel32.dll")] | |
private static extern IntPtr GetConsoleWindow(); | |
[DllImport("User32.dll")] | |
private static extern bool ShowWindow(IntPtr hWnd, int cmdShow); | |
[DllImport("PowrProf.dll", CharSet = CharSet.Auto, ExactSpelling = true)] | |
public static extern bool SetSuspendState(bool hiberate, bool forceCritical, bool disableWakeEvent); | |
#endregion | |
static SpeechRecognitionEngine speechRecognitionEngine; | |
static bool speechOn = true; | |
private static string clipboardText; | |
private static bool shouldLog = true; | |
private static readonly string[] commands = | |
{ | |
"assistant mute", | |
"assistant open clipboard", | |
"assistant new tab", | |
"assistant work music", | |
"assistant new github", | |
"assistant sleep computer confirmation 101", | |
"assistant shut down computer confirmation 101", | |
"assistant open story", | |
"assistant open rocket league" | |
}; | |
static void HideWindow() | |
{ | |
//Hide window | |
IntPtr hWndConsole = GetConsoleWindow(); | |
if (hWndConsole != IntPtr.Zero) | |
{ | |
ShowWindow(hWndConsole, Hide); | |
shouldLog = false; | |
//ShowWindow(hWndConsole, Show); | |
} | |
} | |
static void Main(string[] args) | |
{ | |
HideWindow(); | |
//Console.WriteLine("[ASSISTANT AI INITIALIZED]"); | |
CultureInfo cultureInfo = new CultureInfo("en-us"); | |
speechRecognitionEngine = new SpeechRecognitionEngine(cultureInfo); | |
speechRecognitionEngine.SetInputToDefaultAudioDevice(); | |
speechRecognitionEngine.SpeechRecognized += SpeechRecognition; | |
speechRecognitionEngine.SpeechDetected += SpeechDetected; | |
speechRecognitionEngine.SpeechHypothesized += SpeechHypothesized; | |
LoadCommands(); | |
while (true) | |
{ | |
Thread.Sleep(60000); | |
} | |
} | |
static void LoadCommands() | |
{ | |
/*Grammar muteCommand = new Grammar(new GrammarBuilder(commands[0])); | |
Grammar browserOpenCopiedLink = new Grammar(new GrammarBuilder(commands[1])); | |
Grammar browserCopyLink = new Grammar(new GrammarBuilder(commands[2])); | |
speechRecognitionEngine.LoadGrammar(muteCommand); | |
speechRecognitionEngine.LoadGrammar(browserOpenCopiedLink); | |
speechRecognitionEngine.LoadGrammar(browserCopyLink);*/ | |
foreach (string command in commands) | |
{ | |
speechRecognitionEngine.LoadGrammarAsync(new Grammar(new GrammarBuilder(command))); | |
} | |
speechRecognitionEngine.RecognizeAsync(RecognizeMode.Multiple); | |
Console.Beep(600, 200); | |
Console.Beep(600, 200); | |
} | |
static void SpeechHypothesized(object sender, SpeechHypothesizedEventArgs e) | |
{ | |
//Log(e.Result.Text); | |
} | |
static void SpeechDetected(object sender, SpeechDetectedEventArgs e) | |
{ | |
//Log("Detected speech."); | |
} | |
static void SpeechRecognition(object sender, SpeechRecognizedEventArgs e) | |
{ | |
string resultText = e.Result.Text.ToLower(); | |
float confidence = e.Result.Confidence; | |
SemanticValue semantics = e.Result.Semantics; | |
Log("\nRecognized: " + resultText + " | Confidence:" + confidence); | |
if (confidence < 0.6) | |
{ | |
Log("Not sure what if you said that. Not proceeding.", ConsoleColor.Red); | |
return; | |
} | |
if (resultText == commands[0]) | |
{ | |
speechOn = !speechOn; | |
Log("Speech on: " + speechOn); | |
if (speechOn) | |
{ | |
Console.Beep(600, 200); | |
Console.Beep(600, 200); | |
} | |
else | |
{ | |
Console.Beep(400, 400); | |
} | |
return; | |
} | |
if (!speechOn) | |
{ | |
Log("AI is muted. Not doing any commands."); | |
Console.Beep(400, 200); | |
return; | |
} | |
if (resultText == commands[1]) //Open link on clipboard. | |
{ | |
Thread clipboardThread = new Thread(param => | |
{ | |
if (Clipboard.ContainsText(TextDataFormat.Text)) | |
{ | |
clipboardText = Clipboard.GetText(TextDataFormat.Text); | |
} | |
}); | |
clipboardThread.SetApartmentState(ApartmentState.STA); | |
clipboardThread.Start(); | |
clipboardThread.Join(); | |
Log(clipboardText); | |
Process.Start(clipboardText); | |
} | |
if (resultText == commands[2]) //Open browser | |
{ | |
Process.Start("https://google.com"); | |
} | |
if (resultText == commands[3]) //Open work music | |
{ | |
Process.Start("https://youtu.be/Qku9aoUlTXA?list=PLESPkMaANzSj91tvYnQkKwgx41vkxp6hs"); | |
} | |
if (resultText == commands[4]) //Open Github new repository | |
{ | |
Process.Start("https://github.com/new"); | |
} | |
if (resultText == commands[5]) //Sleep computer | |
{ | |
SetSuspendState(false, true, true); | |
} | |
if (resultText == commands[6]) //Shutdown computer | |
{ | |
Process.Start("shutdown", "/s /t 0"); | |
} | |
if (resultText == commands[7]) //Open story | |
{ | |
Process.Start("https://docs.new"); | |
} | |
if (resultText == commands[9]) //Open Rocket League | |
{ | |
Process.Start("C:\\Users\\USER\\Documents\\SteamLauncher\\RocketLeague.exe"); | |
} | |
} | |
static void Log(string input, ConsoleColor color = ConsoleColor.White) | |
{ | |
if (shouldLog) | |
{ | |
Console.ForegroundColor = color; | |
Console.WriteLine(input); | |
Console.ResetColor(); | |
} | |
} | |
} | |
} |
It helps me if you share this post
Published 2019-05-22 18:10:00
I’m extremely pleased to discover this website. I wanted to thank you for ones time just for this fantastic read!
Muchos Gracias for your article.Really thank you! Cool.
Very good article. I’m experiencing a few of these issues as well..
I really like reading through an article that can make men and women think. Also, thanks for permitting me to comment!
Way cool! Some very valid points! I appreciate you penning this article and the rest of the website is really good.
Oh my goodness! Impressive article dude! Thank you so much, However I am encountering difficulties with your RSS. I don’t know the reason why I am unable to join it. Is there anybody else having identical RSS issues? Anyone who knows the answer can you kindly respond? Thanx!!
Thank you ever so for you article post.Much thanks again. Much obliged.
You have made some decent points there. I looked on the internet for more information about the
issue and found most individuals will go along with
your views on this web site.