protected override void Dispose(bool disposing) { if (disposing) { tts?.Stop(); tts?.Shutdown(); tts = null; } base.Dispose(disposing); }
void IDisposable.Dispose() { textToSpeech?.Stop(); textToSpeech?.Dispose(); textToSpeech = null; initialized = false; }
private void Speak() { if (string.IsNullOrWhiteSpace(text)) { return; } if (!queue && textToSpeech.IsSpeaking) { textToSpeech.Stop(); } if (language.HasValue && !string.IsNullOrWhiteSpace(language.Value.Language)) { Locale locale = null; if (!string.IsNullOrWhiteSpace(language.Value.Country)) { locale = new Locale(language.Value.Language, language.Value.Country); } else { locale = new Locale(language.Value.Language); } var result = textToSpeech.IsLanguageAvailable(locale); if (result == LanguageAvailableResult.CountryAvailable) { textToSpeech.SetLanguage(locale); } else { Console.WriteLine("Locale: " + locale + " was not valid, setting to default."); SetDefaultLanguage(); } } else { SetDefaultLanguage(); } textToSpeech.SetPitch(pitch); textToSpeech.SetSpeechRate(speakRate); textToSpeech.Speak(text, queue ? QueueMode.Add : QueueMode.Flush, null); }
Task Speak(CancellationToken?cancelToken) { if (string.IsNullOrWhiteSpace(text)) { return(Task.CompletedTask); } if (language.HasValue && !string.IsNullOrWhiteSpace(language.Value.Language)) { Locale locale = null; if (!string.IsNullOrWhiteSpace(language.Value.Country)) { locale = new Locale(language.Value.Language, language.Value.Country); } else { locale = new Locale(language.Value.Language); } var result = textToSpeech.IsLanguageAvailable(locale); if (result == LanguageAvailableResult.CountryAvailable) { textToSpeech.SetLanguage(locale); } else { Console.WriteLine("Locale: " + locale + " was not valid, setting to default."); SetDefaultLanguage(); } } else { SetDefaultLanguage(); } var tcs = new TaskCompletionSource <object>(); cancelToken?.Register(() => { textToSpeech.Stop(); tcs.TrySetCanceled(); }); textToSpeech.SetPitch(pitch); textToSpeech.SetSpeechRate(speakRate); textToSpeech.SetOnUtteranceProgressListener(new TtsProgressListener(tcs)); #pragma warning disable CS0618 // Type or member is obsolete count++; var map = new Dictionary <string, string> { [Android.Speech.Tts.TextToSpeech.Engine.KeyParamUtteranceId] = count.ToString() }; textToSpeech.Speak(text, QueueMode.Flush, map); #pragma warning restore CS0618 // Type or member is obsolete return(tcs.Task); }
void IDisposable.Dispose() { textToSpeech?.Stop(); textToSpeech?.Dispose(); textToSpeech = null; }
async Task Speak(CancellationToken?cancelToken) { if (string.IsNullOrWhiteSpace(text)) { //return Task.CompletedTask; return; } if (language.HasValue && !string.IsNullOrWhiteSpace(language.Value.Language)) { Locale locale = null; if (!string.IsNullOrWhiteSpace(language.Value.Country)) { locale = new Locale(language.Value.Language, language.Value.Country); } else { locale = new Locale(language.Value.Language); } var result = textToSpeech.IsLanguageAvailable(locale); if (result == LanguageAvailableResult.CountryAvailable) { textToSpeech.SetLanguage(locale); } else { Console.WriteLine("Locale: " + locale + " was not valid, setting to default."); SetDefaultLanguage(); } } else { SetDefaultLanguage(); } var tcs = new TaskCompletionSource(); var flag = new AsyncManualResetEvent(); var utteranceID = Guid.NewGuid().ToString(); var doneTask = listener.ListenFor(utteranceID); cancelToken?.Register(() => { textToSpeech.Stop(); tcs?.TrySetCanceled(); listener?.completionSources?[utteranceID]?.TrySetCanceled(); }); var utteranceProgressListenerDictionary = new Dictionary <string, string>(); utteranceProgressListenerDictionary.Add(Android.Speech.Tts.TextToSpeech.Engine.KeyParamUtteranceId, utteranceID); utteranceProgressListenerDictionary.Add(Android.Speech.Tts.TextToSpeech.Engine.KeyParamVolume, volume.ToString()); textToSpeech.SetPitch(pitch); textToSpeech.SetSpeechRate(speakRate); //textToSpeech.SetOnUtteranceProgressListener(new TtsProgressListener(flag)); //var bundle = new Android.OS.Bundle(); //bundle.PutFloat(Android.Speech.Tts.TextToSpeech.Engine.KeyParamVolume, 1.0f); #pragma warning disable CS0618 // Type or member is obsolete //textToSpeech.Speak(text, QueueMode.Flush, bundle, text); textToSpeech.Speak(text, QueueMode.Flush, utteranceProgressListenerDictionary); #pragma warning restore CS0618 // Type or member is obsolete //return tcs.Task; //return Task.WhenAny(tcs.Task, flag.WaitAsync()); //return listener.IsDone(); //int i = 0; //var sw = new System.Diagnostics.Stopwatch(); //sw.Start(); //while (doneTask.Status != TaskStatus.RanToCompletion) //{ // Task.Delay(100).Wait(101); // //await Task.Delay(100, CancellationTokenHelpers.Timeout(105).Token); // Android.Util.Log.Debug("Speech", $"Iteration {i}, {sw.ElapsedMilliseconds} ms - status is {doneTask.Status}."); // i++; //} //return doneTask; await doneTask; }