7 #if UNITY_WSA || UNITY_STANDALONE_WIN 20 #if UNITY_WSA || UNITY_STANDALONE_WIN 21 private static StringBuilder textSoFar;
29 private static readonly
string DeviceName =
string.Empty;
35 private static int samplingRate;
40 public static bool IsListening {
get;
private set; }
45 private static string dictationResult;
50 private static AudioClip dictationAudioClip;
52 private static DictationRecognizer dictationRecognizer;
54 private static bool isTransitioning;
55 private static bool hasFailed;
56 private static bool hasListener;
61 #if UNITY_WSA || UNITY_STANDALONE_WIN 62 protected override void Awake()
66 dictationResult =
string.Empty;
68 dictationRecognizer =
new DictationRecognizer();
69 dictationRecognizer.DictationHypothesis += DictationRecognizer_DictationHypothesis;
70 dictationRecognizer.DictationResult += DictationRecognizer_DictationResult;
71 dictationRecognizer.DictationComplete += DictationRecognizer_DictationComplete;
72 dictationRecognizer.DictationError += DictationRecognizer_DictationError;
76 Microphone.GetDeviceCaps(DeviceName, out minSamplingRate, out samplingRate);
79 private void LateUpdate()
81 if (IsListening && !Microphone.IsRecording(DeviceName) && dictationRecognizer.Status == SpeechSystemStatus.Running)
84 StartCoroutine(StopRecording());
87 if (!hasFailed && dictationRecognizer.Status == SpeechSystemStatus.Failed)
94 protected override void OnDestroy()
96 dictationRecognizer.Dispose();
102 #endregion // Unity Methods 113 public static IEnumerator
StartRecording(GameObject listener = null,
float initialSilenceTimeout = 5f,
float autoSilenceTimeout = 20f,
int recordingTime = 10)
115 #if UNITY_WSA || UNITY_STANDALONE_WIN 116 if (IsListening || isTransitioning)
118 Debug.LogWarning(
"Unable to start recording");
123 isTransitioning =
true;
125 if (listener != null)
131 if (PhraseRecognitionSystem.Status == SpeechSystemStatus.Running)
133 PhraseRecognitionSystem.Shutdown();
136 while (PhraseRecognitionSystem.Status == SpeechSystemStatus.Running)
141 dictationRecognizer.InitialSilenceTimeoutSeconds = initialSilenceTimeout;
142 dictationRecognizer.AutoSilenceTimeoutSeconds = autoSilenceTimeout;
143 dictationRecognizer.Start();
145 while (dictationRecognizer.Status == SpeechSystemStatus.Failed)
147 InputManager.
Instance.RaiseDictationError(Instance, 0,
"Dictation recognizer failed to start!");
151 while (dictationRecognizer.Status == SpeechSystemStatus.Stopped)
157 dictationAudioClip = Microphone.Start(DeviceName,
false, recordingTime, samplingRate);
158 textSoFar =
new StringBuilder();
159 isTransitioning =
false;
161 Debug.LogWarning(
"Unable to start recording! Dictation is unsupported for this platform.");
171 yield
return Instance.StopRecordingInternal();
177 private IEnumerator StopRecordingInternal()
179 #if UNITY_WSA || UNITY_STANDALONE_WIN 180 if (!IsListening || isTransitioning)
182 Debug.LogWarning(
"Unable to stop recording");
187 isTransitioning =
true;
195 Microphone.End(DeviceName);
197 if (dictationRecognizer.Status == SpeechSystemStatus.Running)
199 dictationRecognizer.Stop();
202 StartCoroutine(FinishStopRecording());
208 private IEnumerator FinishStopRecording()
210 #if UNITY_WSA || UNITY_STANDALONE_WIN 211 while (dictationRecognizer.Status == SpeechSystemStatus.Running)
216 PhraseRecognitionSystem.Restart();
217 isTransitioning =
false;
223 #region Dictation Recognizer Callbacks 224 #if UNITY_WSA || UNITY_STANDALONE_WIN 230 private static void DictationRecognizer_DictationHypothesis(
string text)
233 dictationResult = textSoFar.ToString() +
" " + text +
"...";
243 private static void DictationRecognizer_DictationResult(
string text, ConfidenceLevel confidence)
245 textSoFar.Append(text +
". ");
247 dictationResult = textSoFar.ToString();
257 private static void DictationRecognizer_DictationComplete(DictationCompletionCause cause)
260 if (cause == DictationCompletionCause.TimeoutExceeded)
262 Microphone.End(DeviceName);
264 dictationResult =
"Dictation has timed out. Please try again.";
269 dictationResult =
string.Empty;
277 private static void DictationRecognizer_DictationError(
string error,
int hresult)
279 dictationResult = error +
"\nHRESULT: " + hresult.ToString();
283 dictationResult =
string.Empty;
286 #endregion // Dictation Recognizer Callbacks 288 #region IInputSource Implementation 298 return (GetSupportedInputInfo(sourceId) & inputInfo) != 0;
303 position = Vector3.zero;
309 rotation = Quaternion.identity;
315 pointingRay =
default(Ray);
321 position = Vector3.zero;
327 rotation = Quaternion.identity;
339 position = Vector2.zero;
343 public bool TryGetTouchpad(uint sourceId, out
bool isPressed, out
bool isTouched, out Vector2 position)
347 position = Vector2.zero;
351 public bool TryGetSelect(uint sourceId, out
bool isPressed, out
double pressedAmount)
370 #endregion // IInputSource Implementation