/// <summary> /// Attempts to request access to the speech recognizer to recognize text. Access to the speech recognizer is not guaranteed, and a boolean <code>false</code> will be returned if access is rejected /// </summary> /// <param name="callerType">The type of the class calling this method</param> /// <param name="callbackFunction">the function to be invoked with the recognized text.</param> /// <returns>true if access was granted and no errors were thrown, false otherwise</returns> public static async Task <bool> RequestListen(Type callerType, Action <string> callbackFunction) { // if the current listener is the main screen, then it's fine to interrupt. Otherwise we need to check if the current listener is done if (typeof(MainPage) != CurrentListener && !IsCurrentListenerDone || !Utils.IsListeningSettingEnabled()) { // we can't listen, so return false return(false); } else { // stop the current speech recognition session SpeechRecognitionUtils.Stop(); try { // set the class that's listening IsCurrentListenerDone = false; CurrentListener = callerType; SpeechRecognitionResult result = await SpeechRecognitionUtils.ListenOnceAsync(); SpeechRecognitionUtils.Stop(); IsCurrentListenerDone = true; // make the main page listen again StartListeningForMainPage(); // now call the callback function callbackFunction.Invoke(result.Text); return(true); // successfully listened and did the command } catch (Exception) { return(false); // something went wrong with listening } } }
/// <summary> /// Starts the speech recognition for the main page, using the passed <paramref name="callbackFunction"/> and the passed <paramref name="textBox"/> /// </summary> /// <param name="callbackFunction"></param> /// <param name="textBox"></param> public static void StartListeningForMainPage(Action <string> callbackFunction, TextBox textBox) { // the main page takes priority over everything when it comes to listening, so force stop SpeechRecognitionUtils.Stop(); CurrentListener = typeof(MainPage); IsCurrentListenerDone = false; MainPageFunction = callbackFunction; MainPageTextBox = textBox; SpeechRecognitionUtils.StartLooping(MainPageFunction, MainPageTextBox); }
/// <summary> /// should only be called after <see cref="StartListeningForMainPage(Action{string}, TextBox)"/> has been called since the main page was navigated to /// </summary> private static void StartListeningForMainPage() { if (Utils.IsListeningSettingEnabled()) { if (MainPageFunction != null && MainPageTextBox != null) { // the main page takes priority over everything when it comes to listening, so force stop SpeechRecognitionUtils.Stop(); CurrentListener = typeof(MainPage); IsCurrentListenerDone = false; SpeechRecognitionUtils.StartLooping(MainPageFunction, MainPageTextBox); } } else { TextToSpeechEngine.SpeakText(new MediaElement(), "Sorry, but something went wrong with setting up your microphone. You cannot use me through speech, but you can still use the command bar at the bottom of the screen."); } }