internal static ISpPhrase CreatePhraseFromWordUnits(RecognizedWordUnit[] words, CultureInfo culture, out GCHandle[] memHandles, out IntPtr coMem) { SPPHRASEELEMENT[] array = new SPPHRASEELEMENT[words.Length]; int num = Marshal.SizeOf(typeof(SPPHRASEELEMENT)); List <GCHandle> list = new List <GCHandle>(); coMem = Marshal.AllocCoTaskMem(num * array.Length); try { for (int i = 0; i < words.Length; i++) { RecognizedWordUnit recognizedWordUnit = words[i]; array[i] = new SPPHRASEELEMENT(); array[i].bDisplayAttributes = RecognizedWordUnit.DisplayAttributesToSapiAttributes((recognizedWordUnit.DisplayAttributes == DisplayAttributes.None) ? DisplayAttributes.OneTrailingSpace : recognizedWordUnit.DisplayAttributes); array[i].SREngineConfidence = recognizedWordUnit.Confidence; array[i].ulAudioTimeOffset = (uint)(recognizedWordUnit._audioPosition.Ticks * 10000 / 10000); array[i].ulAudioSizeTime = (uint)(recognizedWordUnit._audioDuration.Ticks * 10000 / 10000); if (recognizedWordUnit.Text != null) { GCHandle item = GCHandle.Alloc(recognizedWordUnit.Text, GCHandleType.Pinned); list.Add(item); array[i].pszDisplayText = item.AddrOfPinnedObject(); } if (recognizedWordUnit.Text == null || recognizedWordUnit.LexicalForm != recognizedWordUnit.Text) { GCHandle item2 = GCHandle.Alloc(recognizedWordUnit.LexicalForm, GCHandleType.Pinned); list.Add(item2); array[i].pszLexicalForm = item2.AddrOfPinnedObject(); } else { array[i].pszLexicalForm = array[i].pszDisplayText; } if (!string.IsNullOrEmpty(recognizedWordUnit.Pronunciation)) { GCHandle item3 = GCHandle.Alloc(recognizedWordUnit.Pronunciation, GCHandleType.Pinned); list.Add(item3); array[i].pszPronunciation = item3.AddrOfPinnedObject(); } Marshal.StructureToPtr((object)array[i], new IntPtr((long)coMem + num * i), false); } } finally { memHandles = list.ToArray(); } SPPHRASE sPPHRASE = new SPPHRASE(); sPPHRASE.cbSize = (uint)Marshal.SizeOf(sPPHRASE.GetType()); sPPHRASE.LangID = (ushort)culture.LCID; sPPHRASE.Rule = new SPPHRASERULE(); sPPHRASE.Rule.ulCountOfElements = (uint)words.Length; sPPHRASE.pElements = coMem; SpPhraseBuilder spPhraseBuilder = new SpPhraseBuilder(); ((ISpPhraseBuilder)spPhraseBuilder).InitFromPhrase(sPPHRASE); return((ISpPhrase)spPhraseBuilder); }
/// <summary> /// Helper function used to create a new phrase object from a /// test string. Each word in the string is converted to a phrase element. /// This is useful to create a phrase to pass to the EmulateRecognition method. /// </summary> internal static ISpPhrase CreatePhraseFromText(string phrase, CultureInfo culture, out GCHandle[] memHandles, out IntPtr coMem) { string[] words = phrase.Split(Array.Empty <char>(), StringSplitOptions.RemoveEmptyEntries); RecognizedWordUnit[] wordUnits = new RecognizedWordUnit[words.Length]; for (int i = 0; i < wordUnits.Length; i++) { wordUnits[i] = new RecognizedWordUnit(null, 1.0f, null, words[i], DisplayAttributes.OneTrailingSpace, TimeSpan.Zero, TimeSpan.Zero); } return(CreatePhraseFromWordUnits(wordUnits, culture, out memHandles, out coMem)); }
internal static ISpPhrase CreatePhraseFromText(string phrase, CultureInfo culture, out GCHandle[] memHandles, out IntPtr coMem) { string[] array = phrase.Split(new char[0], StringSplitOptions.RemoveEmptyEntries); RecognizedWordUnit[] array2 = new RecognizedWordUnit[array.Length]; for (int i = 0; i < array2.Length; i++) { array2[i] = new RecognizedWordUnit(null, 1f, null, array[i], DisplayAttributes.OneTrailingSpace, TimeSpan.Zero, TimeSpan.Zero); } return(CreatePhraseFromWordUnits(array2, culture, out memHandles, out coMem)); }
//------------------------------------------------------------------- private void rec_Recognized(object sender, SpeechRecognizedEventArgs e) { RecognizedWordUnit firstWord = e.Result.Words.First(); Console.Write("CMD: " + firstWord.Text); switch (firstWord.Text) { // INCLUDE "file_name" case "include": RecognizedWordUnit tempWord = e.Result.Words.ElementAt(1); Console.WriteLine(tempWord.Text); sim.Keyboard.TextEntry("#include <" + tempWord.Text + ">"); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); break; // FUNCTION "data_type" "Function_name" case "function": tempWord = e.Result.Words.ElementAt(1); Console.Write(" " + tempWord.Text); sim.Keyboard.TextEntry(tempWord.Text); tempWord = e.Result.Words.ElementAt(2); Console.WriteLine(" " + tempWord.Text); sim.Keyboard.TextEntry(" " + tempWord.Text + "()"); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.TextEntry("{}"); sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.UP); sim.Keyboard.KeyPress(VirtualKeyCode.TAB); break; // PRINTF STRING/VAR "data_to_be_printed" case "printf": tempWord = e.Result.Words.ElementAt(1); Console.Write(" " + tempWord.Text); sim.Keyboard.TextEntry("cout<<;"); if (tempWord.Text == "string") { Console.WriteLine(" " + tempWord.Text + " <INPUT STRING>"); sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); sim.Keyboard.TextEntry("\"\""); sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); string inputData = e.Result.Text; inputData = inputData.Replace("printf string ", ""); sim.Keyboard.TextEntry(inputData); sim.Keyboard.KeyPress(VirtualKeyCode.RIGHT); sim.Keyboard.KeyPress(VirtualKeyCode.RIGHT); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.TAB); } else if (tempWord.Text == "variable") { Console.Write(" " + tempWord.Text); tempWord = e.Result.Words.ElementAt(2); Console.WriteLine(" " + tempWord.Text); sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); sim.Keyboard.TextEntry(tempWord.Text); sim.Keyboard.KeyPress(VirtualKeyCode.RIGHT); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.TAB); } break; // PRINTLINE STRING/VAR "data_to_be_printed" case "printline": tempWord = e.Result.Words.ElementAt(1); Console.Write(" " + tempWord.Text); sim.Keyboard.TextEntry("cout<<<<endl;"); for (int i = 0; i < 7; i++) { sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); } if (tempWord.Text == "string") { Console.WriteLine(" string" + " <INPUT STRING>"); sim.Keyboard.TextEntry("\"\""); sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); string inputData = e.Result.Text; inputData = inputData.Replace("printline string ", ""); sim.Keyboard.TextEntry(inputData); sim.Keyboard.KeyPress(VirtualKeyCode.END); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.TAB); } else if (tempWord.Text == "variable") { tempWord = e.Result.Words.ElementAt(2); Console.Write("variable " + tempWord.Text); sim.Keyboard.TextEntry(tempWord.Text); sim.Keyboard.KeyPress(VirtualKeyCode.END); sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); sim.Keyboard.KeyPress(VirtualKeyCode.TAB); } break; case "back": sim.Keyboard.KeyPress(VirtualKeyCode.BACK); Console.WriteLine(""); break; case "erase": sim.Keyboard.KeyDown(VirtualKeyCode.CONTROL); sim.Keyboard.KeyPress(VirtualKeyCode.BACK); sim.Keyboard.KeyUp(VirtualKeyCode.CONTROL); Console.WriteLine(""); break; case "clear": sim.Keyboard.KeyDown(VirtualKeyCode.CONTROL); sim.Keyboard.KeyPress(VirtualKeyCode.VK_A); sim.Keyboard.KeyUp(VirtualKeyCode.CONTROL); sim.Keyboard.KeyPress(VirtualKeyCode.BACK); Console.WriteLine(""); break; case "left": sim.Keyboard.KeyPress(VirtualKeyCode.LEFT); Console.WriteLine(""); break; case "right": sim.Keyboard.KeyPress(VirtualKeyCode.RIGHT); Console.WriteLine(""); break; case "up": sim.Keyboard.KeyPress(VirtualKeyCode.UP); Console.WriteLine(""); break; case "down": sim.Keyboard.KeyPress(VirtualKeyCode.DOWN); Console.WriteLine(""); break; case "newline": sim.Keyboard.KeyPress(VirtualKeyCode.RETURN); Console.WriteLine(""); break; case "tab": sim.Keyboard.KeyPress(VirtualKeyCode.TAB); Console.WriteLine(""); break; case "stop": rec.RecognizeAsyncCancel(); recognizing = false; Console.WriteLine(""); break; case "exit": //System.Windows.Application.Current.Shutdown(); sim.Keyboard.TextEntry("You said exit"); notifyIcon.Dispose(); this.Close(); break; default: sim.Keyboard.TextEntry(e.Result.Text); Console.WriteLine(""); break; } }
/// <summary> /// Helper function used to create a new phrase object from a /// test string. Each word in the string is converted to a phrase element. /// This is useful to create a phrase to pass to the EmulateRecognition method. /// </summary> internal static ISpPhrase CreatePhraseFromWordUnits(RecognizedWordUnit[] words, CultureInfo culture, out GCHandle[] memHandles, out IntPtr coMem) { SPPHRASEELEMENT[] elements = new SPPHRASEELEMENT[words.Length]; // build the unmanaged interop layer int size = Marshal.SizeOf(typeof(SPPHRASEELEMENT)); List <GCHandle> handles = new(); coMem = Marshal.AllocCoTaskMem(size * elements.Length); try { for (int i = 0; i < words.Length; i++) { RecognizedWordUnit word = words[i]; elements[i] = new SPPHRASEELEMENT { // display + confidence bDisplayAttributes = RecognizedWordUnit.DisplayAttributesToSapiAttributes(word.DisplayAttributes == DisplayAttributes.None ? DisplayAttributes.OneTrailingSpace : word.DisplayAttributes), SREngineConfidence = word.Confidence, // Timing information ulAudioTimeOffset = unchecked ((uint)(word._audioPosition.Ticks * 10000 / TimeSpan.TicksPerMillisecond)), ulAudioSizeTime = unchecked ((uint)(word._audioDuration.Ticks * 10000 / TimeSpan.TicksPerMillisecond)) }; // DLP information if (word.Text != null) { GCHandle handle = GCHandle.Alloc(word.Text, GCHandleType.Pinned); handles.Add(handle); elements[i].pszDisplayText = handle.AddrOfPinnedObject(); } if (word.Text == null || word.LexicalForm != word.Text) { GCHandle handle = GCHandle.Alloc(word.LexicalForm, GCHandleType.Pinned); handles.Add(handle); elements[i].pszLexicalForm = handle.AddrOfPinnedObject(); } else { elements[i].pszLexicalForm = elements[i].pszDisplayText; } if (!string.IsNullOrEmpty(word.Pronunciation)) { GCHandle handle = GCHandle.Alloc(word.Pronunciation, GCHandleType.Pinned); handles.Add(handle); elements[i].pszPronunciation = handle.AddrOfPinnedObject(); } Marshal.StructureToPtr(elements[i], new IntPtr((long)coMem + size * i), false); } } finally { memHandles = handles.ToArray(); } SPPHRASE spPhrase = new(); spPhrase.cbSize = (uint)Marshal.SizeOf(spPhrase.GetType()); spPhrase.LangID = (ushort)culture.LCID; spPhrase.Rule = new SPPHRASERULE { ulCountOfElements = (uint)words.Length }; spPhrase.pElements = coMem; // Initialized the phrase SpPhraseBuilder phraseBuilder = new(); ((ISpPhraseBuilder)phraseBuilder).InitFromPhrase(spPhrase); return((ISpPhrase)phraseBuilder); }
/// <summary> /// recognized word unit to byte array /// </summary> /// <param name="word">recognized word</param> /// <param name="len">length of output byte array</param> /// <returns></returns> private byte[] ParseWord(RecognizedWordUnit word, int len = 12) { byte[] retval = new byte[len]; byte[] str = word.Text.GetBytes(); Array.Copy(str, 0, retval, 1, Math.Min(str.Length, len - 2)); // yes, if the word has more than 10 letters, it will be truncated! retval[0] = (byte)(0.5 + word.Confidence * 100); // confidence return retval; }