/// <inheritdoc /> public async Task StartRecordingAsync(GameObject listener = null, float initialSilenceTimeout = 5f, float autoSilenceTimeout = 20f, int recordingTime = 10, string micDeviceName = "") { #if UNITY_STANDALONE_WIN || UNITY_WSA || UNITY_EDITOR_WIN IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem; if (IsListening || isTransitioning || inputSystem == null || !Application.isPlaying) { Debug.LogWarning("Unable to start recording"); return; } if (dictationRecognizer == null && InputSystemProfile.SpeechCommandsProfile.SpeechRecognizerStartBehavior == AutoStartBehavior.ManualStart) { InitializeDictationRecognizer(); } hasFailed = false; IsListening = true; isTransitioning = true; if (listener != null) { hasListener = true; inputSystem.PushModalInputHandler(listener); } if (PhraseRecognitionSystem.Status == SpeechSystemStatus.Running) { PhraseRecognitionSystem.Shutdown(); } await waitUntilPhraseRecognitionSystemHasStopped; Debug.Assert(PhraseRecognitionSystem.Status == SpeechSystemStatus.Stopped); // Query the maximum frequency of the default microphone. int minSamplingRate; // Not used. deviceName = micDeviceName; Microphone.GetDeviceCaps(deviceName, out minSamplingRate, out samplingRate); dictationRecognizer.InitialSilenceTimeoutSeconds = initialSilenceTimeout; dictationRecognizer.AutoSilenceTimeoutSeconds = autoSilenceTimeout; dictationRecognizer.Start(); await waitUntilDictationRecognizerHasStarted; Debug.Assert(dictationRecognizer.Status == SpeechSystemStatus.Running); if (dictationRecognizer.Status == SpeechSystemStatus.Failed) { inputSystem.RaiseDictationError(inputSource, "Dictation recognizer failed to start!"); return; } // Start recording from the microphone. dictationAudioClip = Microphone.Start(deviceName, false, recordingTime, samplingRate); textSoFar = new StringBuilder(); isTransitioning = false; #else await Task.CompletedTask; #endif }
/// <inheritdoc /> public override void Update() { Profiler.BeginSample("[MRTK] WindowsDictationInputProvider.Update"); IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem; if (!Application.isPlaying || inputSystem == null || dictationRecognizer == null) { return; } if (!isTransitioning && IsListening && !Microphone.IsRecording(deviceName) && dictationRecognizer.Status == SpeechSystemStatus.Running) { // If the microphone stops as a result of timing out, make sure to manually stop the dictation recognizer. StopRecording(); } if (!hasFailed && dictationRecognizer.Status == SpeechSystemStatus.Failed) { hasFailed = true; inputSystem.RaiseDictationError(inputSource, "Dictation recognizer has failed!"); } Profiler.EndSample(); // Update }
/// <summary> /// This event is fired when an error occurs. /// </summary> /// <param name="error">The string representation of the error reason.</param> /// <param name="hresult">The int representation of the hresult.</param> private void DictationRecognizer_DictationError(string error, int hresult) { Profiler.BeginSample("[MRTK] WindowsDictationInputProvider.DictationRecognizer_DictationError"); dictationResult = $"{error}\nHRESULT: {hresult}"; IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem; inputSystem?.RaiseDictationError(inputSource, dictationResult); textSoFar = null; dictationResult = string.Empty; Profiler.EndSample(); // DictationError }
/// <inheritdoc /> public override void Update() { using (UpdatePerfMarker.Auto()) { IMixedRealityInputSystem inputSystem = Service as IMixedRealityInputSystem; if (!Application.isPlaying || inputSystem == null || dictationRecognizer == null) { return; } if (!isTransitioning && IsListening && !Microphone.IsRecording(deviceName) && dictationRecognizer.Status == SpeechSystemStatus.Running) { // If the microphone stops as a result of timing out, make sure to manually stop the dictation recognizer. StopRecording(); } if (!hasFailed && dictationRecognizer.Status == SpeechSystemStatus.Failed) { hasFailed = true; inputSystem.RaiseDictationError(inputSource, "Dictation recognizer has failed!"); } } }