33
44using Microsoft . MixedReality . Toolkit . Core . Interfaces . Devices ;
55using Microsoft . MixedReality . Toolkit . Core . Interfaces . InputSystem ;
6- using Microsoft . MixedReality . Toolkit . Core . Services ;
6+ using Microsoft . MixedReality . Toolkit . Core . Managers ;
77using Microsoft . MixedReality . Toolkit . Core . Utilities . Async ;
88using System . Text ;
99using System . Threading . Tasks ;
1616namespace Microsoft . MixedReality . Toolkit . Core . Devices . VoiceInput
1717{
1818#if UNITY_STANDALONE_WIN || UNITY_WSA || UNITY_EDITOR_WIN
19- public class WindowsDictationInputDeviceManager : BaseDeviceManager , IMixedRealityDictationSystem
19+ public class WindowsDictationInputDeviceManager : BaseDeviceManager , IMixedRealityDictationManager
2020 {
2121 /// <summary>
2222 /// Constructor.
@@ -59,20 +59,26 @@ public WindowsDictationInputDeviceManager(string name, uint priority) : base(nam
5959 /// </summary>
6060 private AudioClip dictationAudioClip ;
6161
62- private DictationRecognizer dictationRecognizer ;
63-
62+ private static DictationRecognizer dictationRecognizer ;
63+
64+ private readonly WaitUntil waitUntilPhraseRecognitionSystemHasStarted = new WaitUntil ( ( ) => PhraseRecognitionSystem . Status != SpeechSystemStatus . Stopped ) ;
65+ private readonly WaitUntil waitUntilPhraseRecognitionSystemHasStopped = new WaitUntil ( ( ) => PhraseRecognitionSystem . Status != SpeechSystemStatus . Running ) ;
66+
67+ private readonly WaitUntil waitUntilDictationRecognizerHasStarted = new WaitUntil ( ( ) => dictationRecognizer . Status != SpeechSystemStatus . Stopped ) ;
68+ private readonly WaitUntil waitUntilDictationRecognizerHasStopped = new WaitUntil ( ( ) => dictationRecognizer . Status != SpeechSystemStatus . Running ) ;
69+
6470 /// <inheritdoc />
6571 public override void Enable ( )
6672 {
6773 if ( ! Application . isPlaying ) { return ; }
6874
69- if ( MixedRealityToolkit . InputSystem == null )
75+ if ( MixedRealityManager . InputSystem == null )
7076 {
7177 Debug . LogWarning ( "Unable to start Windows Dictation Device Manager. An Input System is required for this feature." ) ;
7278 return ;
7379 }
7480
75- inputSource = MixedRealityToolkit . InputSystem . RequestNewGenericInputSource ( "Dictation Recognizer" ) ;
81+ inputSource = MixedRealityManager . InputSystem . RequestNewGenericInputSource ( "Dictation Recognizer" ) ;
7682 dictationResult = string . Empty ;
7783
7884 if ( dictationRecognizer == null )
@@ -89,7 +95,7 @@ public override void Enable()
8995 /// <inheritdoc />
9096 public override void Update ( )
9197 {
92- if ( ! Application . isPlaying || MixedRealityToolkit . InputSystem == null ) { return ; }
98+ if ( ! Application . isPlaying || MixedRealityManager . InputSystem == null ) { return ; }
9399
94100 if ( ! isTransitioning && IsListening && ! Microphone . IsRecording ( deviceName ) && dictationRecognizer . Status == SpeechSystemStatus . Running )
95101 {
@@ -100,7 +106,7 @@ public override void Update()
100106 if ( ! hasFailed && dictationRecognizer . Status == SpeechSystemStatus . Failed )
101107 {
102108 hasFailed = true ;
103- MixedRealityToolkit . InputSystem . RaiseDictationError ( inputSource , "Dictation recognizer has failed!" ) ;
109+ MixedRealityManager . InputSystem . RaiseDictationError ( inputSource , "Dictation recognizer has failed!" ) ;
104110 }
105111 }
106112
@@ -135,7 +141,7 @@ public async void StartRecording(GameObject listener, float initialSilenceTimeou
135141 /// <inheritdoc />
136142 public async Task StartRecordingAsync ( GameObject listener = null , float initialSilenceTimeout = 5f , float autoSilenceTimeout = 20f , int recordingTime = 10 , string micDeviceName = "" )
137143 {
138- if ( IsListening || isTransitioning || MixedRealityToolkit . InputSystem == null )
144+ if ( IsListening || isTransitioning || MixedRealityManager . InputSystem == null || ! Application . isPlaying )
139145 {
140146 Debug . LogWarning ( "Unable to start recording" ) ;
141147 return ;
@@ -148,15 +154,16 @@ public async Task StartRecordingAsync(GameObject listener = null, float initialS
148154 if ( listener != null )
149155 {
150156 hasListener = true ;
151- MixedRealityToolkit . InputSystem . PushModalInputHandler ( listener ) ;
157+ MixedRealityManager . InputSystem . PushModalInputHandler ( listener ) ;
152158 }
153159
154160 if ( PhraseRecognitionSystem . Status == SpeechSystemStatus . Running )
155161 {
156162 PhraseRecognitionSystem . Shutdown ( ) ;
157163 }
158164
159- await new WaitUntil ( ( ) => PhraseRecognitionSystem . Status != SpeechSystemStatus . Running ) ;
165+ await waitUntilPhraseRecognitionSystemHasStopped ;
166+ Debug . Assert ( PhraseRecognitionSystem . Status == SpeechSystemStatus . Stopped ) ;
160167
161168 // Query the maximum frequency of the default microphone.
162169 int minSamplingRate ; // Not used.
@@ -167,11 +174,12 @@ public async Task StartRecordingAsync(GameObject listener = null, float initialS
167174 dictationRecognizer . AutoSilenceTimeoutSeconds = autoSilenceTimeout ;
168175 dictationRecognizer . Start ( ) ;
169176
170- await new WaitUntil ( ( ) => dictationRecognizer . Status != SpeechSystemStatus . Stopped ) ;
177+ await waitUntilDictationRecognizerHasStarted ;
178+ Debug . Assert ( dictationRecognizer . Status == SpeechSystemStatus . Running ) ;
171179
172180 if ( dictationRecognizer . Status == SpeechSystemStatus . Failed )
173181 {
174- MixedRealityToolkit . InputSystem . RaiseDictationError ( inputSource , "Dictation recognizer failed to start!" ) ;
182+ MixedRealityManager . InputSystem . RaiseDictationError ( inputSource , "Dictation recognizer failed to start!" ) ;
175183 return ;
176184 }
177185
@@ -190,7 +198,7 @@ public async void StopRecording()
190198 /// <inheritdoc />
191199 public async Task < AudioClip > StopRecordingAsync ( )
192200 {
193- if ( ! IsListening || isTransitioning )
201+ if ( ! IsListening || isTransitioning || ! Application . isPlaying )
194202 {
195203 Debug . LogWarning ( "Unable to stop recording" ) ;
196204 return null ;
@@ -201,7 +209,7 @@ public async Task<AudioClip> StopRecordingAsync()
201209
202210 if ( hasListener )
203211 {
204- MixedRealityToolkit . InputSystem . PopModalInputHandler ( ) ;
212+ MixedRealityManager . InputSystem . PopModalInputHandler ( ) ;
205213 hasListener = false ;
206214 }
207215
@@ -212,11 +220,13 @@ public async Task<AudioClip> StopRecordingAsync()
212220 dictationRecognizer . Stop ( ) ;
213221 }
214222
215- await new WaitUntil ( ( ) => dictationRecognizer . Status != SpeechSystemStatus . Running ) ;
223+ await waitUntilDictationRecognizerHasStopped ;
224+ Debug . Assert ( dictationRecognizer . Status == SpeechSystemStatus . Stopped ) ;
216225
217226 PhraseRecognitionSystem . Restart ( ) ;
218227
219- await new WaitUntil ( ( ) => PhraseRecognitionSystem . Status == SpeechSystemStatus . Running ) ;
228+ await waitUntilPhraseRecognitionSystemHasStarted ;
229+ Debug . Assert ( PhraseRecognitionSystem . Status == SpeechSystemStatus . Running ) ;
220230
221231 isTransitioning = false ;
222232 return dictationAudioClip ;
@@ -231,7 +241,7 @@ private void DictationRecognizer_DictationHypothesis(string text)
231241 // We don't want to append to textSoFar yet, because the hypothesis may have changed on the next event.
232242 dictationResult = $ "{ textSoFar } { text } ...";
233243
234- MixedRealityToolkit . InputSystem . RaiseDictationHypothesis ( inputSource , dictationResult ) ;
244+ MixedRealityManager . InputSystem . RaiseDictationHypothesis ( inputSource , dictationResult ) ;
235245 }
236246
237247 /// <summary>
@@ -245,7 +255,7 @@ private void DictationRecognizer_DictationResult(string text, ConfidenceLevel co
245255
246256 dictationResult = textSoFar . ToString ( ) ;
247257
248- MixedRealityToolkit . InputSystem . RaiseDictationResult ( inputSource , dictationResult ) ;
258+ MixedRealityManager . InputSystem . RaiseDictationResult ( inputSource , dictationResult ) ;
249259 }
250260
251261 /// <summary>
@@ -263,7 +273,7 @@ private void DictationRecognizer_DictationComplete(DictationCompletionCause caus
263273 dictationResult = "Dictation has timed out. Please try again." ;
264274 }
265275
266- MixedRealityToolkit . InputSystem . RaiseDictationComplete ( inputSource , dictationResult , dictationAudioClip ) ;
276+ MixedRealityManager . InputSystem . RaiseDictationComplete ( inputSource , dictationResult , dictationAudioClip ) ;
267277 textSoFar = null ;
268278 dictationResult = string . Empty ;
269279 }
@@ -277,7 +287,7 @@ private void DictationRecognizer_DictationError(string error, int hresult)
277287 {
278288 dictationResult = $ "{ error } \n HRESULT: { hresult } ";
279289
280- MixedRealityToolkit . InputSystem . RaiseDictationError ( inputSource , dictationResult ) ;
290+ MixedRealityManager . InputSystem . RaiseDictationError ( inputSource , dictationResult ) ;
281291 textSoFar = null ;
282292 dictationResult = string . Empty ;
283293 }
0 commit comments