Reputation: 219
I am following https://developer.xamarin.com/guides/android/platform_features/speech/ and getting a single value (Default) in langAvailable. I have updated Google TTS engine also and installed some voice data. I have installed other app which uses this engine and this apps have all languages. So what I am doing wrong? Android OS 6.0
TextToSpeech textToSpeech = new TextToSpeech(this, this, "com.google.android.tts");
var langAvailable = new List<string> { "Default" };
var localesAvailable = Locale.GetAvailableLocales().ToList();
foreach (var locale in localesAvailable)
{
LanguageAvailableResult res = textToSpeech.IsLanguageAvailable(locale);
switch (res)
{
case LanguageAvailableResult.Available:
langAvailable.Add(locale.DisplayLanguage);
break;
case LanguageAvailableResult.CountryAvailable:
langAvailable.Add(locale.DisplayLanguage);
break;
case LanguageAvailableResult.CountryVarAvailable:
langAvailable.Add(locale.DisplayLanguage);
break;
}
}
langAvailable = langAvailable.OrderBy(t => t).Distinct().ToList();
Upvotes: 3
Views: 848
Reputation: 9084
Android Google TTS: Why langAvailable returns Not supported or -2?
It seems like Google TTS needs a bit to initialize, you should use IsLanguageAvailable()
method when the TTS Engine has initialized correctly.
For example :
void TextToSpeech.IOnInitListener.OnInit(OperationResult status)
{
// if we get an error, default to the default language
if (status == OperationResult.Error)
textToSpeech.SetLanguage(Java.Util.Locale.Default);
// if the listener is ok, set the lang
if (status == OperationResult.Success)
{
langAvailable = new List<string> { "Default" };
localesAvailable = Java.Util.Locale.GetAvailableLocales().ToList();
foreach (var locale in localesAvailable)
{
LanguageAvailableResult res = textToSpeech.IsLanguageAvailable(locale);
switch (res)
{
case LanguageAvailableResult.Available:
langAvailable.Add(locale.DisplayLanguage);
break;
case LanguageAvailableResult.CountryAvailable:
langAvailable.Add(locale.DisplayLanguage);
break;
case LanguageAvailableResult.CountryVarAvailable:
langAvailable.Add(locale.DisplayLanguage);
break;
}
}
langAvailable = langAvailable.OrderBy(t => t).Distinct().ToList();
var adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerDropDownItem, langAvailable);
spinLanguages.Adapter = adapter;
textToSpeech.SetLanguage(lang);
}
}
Then, when you select a language from Spinner
:
spinLanguages.ItemSelected += (object sender, AdapterView.ItemSelectedEventArgs e) =>
{
lang = Java.Util.Locale.GetAvailableLocales().FirstOrDefault(t => t.DisplayLanguage == langAvailable[(int)e.Id]);
textToSpeech.SetLanguage(lang);
};
Upvotes: 2