Android谷歌语音合成:为什么langAvailable返回“不支持”或“-2”?

3

我正在遵循https://developer.xamarin.com/guides/android/platform_features/speech/,并在langAvailable中获得单个值(默认值)。我已经更新了Google TTS引擎,并安装了一些语音数据。我还安装了其他使用此引擎的应用程序,这些应用程序具有所有语言。那么我做错了什么?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();

请发布完整的错误日志。 - York Shen
没有错误。var localesAvailable = Java.Util.Locale.GetAvailableLocales().ToList(); 返回一些语言环境,但在 LanguageAvailableResult res = textToSpeech.IsLanguageAvailable(locale); 这个阶段,所有语言环境都显示为不支持。 - Ajay
当您在设备上部署应用程序时,您无法使用TextToSpeech功能吗?还是您无法编译该项目? - York Shen
项目已成功编译,我也可以进行调试。但是每次都会出现“LanguageAvailableResult对于每个区域设置都不受支持”的错误。 - Ajay
你说的“不支持”是什么意思?请详细描述你的问题,我不明白你的意思。 - York Shen
请找到以下两个链接:1) https://www.dropbox.com/s/1f8os9t1jtfctl0/NotSupported.png?dl=0 2) https://www.dropbox.com/s/k5ym02qviff3svu/TTSobj.png?dl=0 - Ajay
1个回答

2

安卓谷歌语音合成:为什么langAvailable返回“不支持”或“-2”?

看起来谷歌语音合成需要一点时间来初始化,你应该在TTS引擎正确初始化时使用IsLanguageAvailable()方法。

例如:

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);
        }
    }

然后,当你从Spinner中选择一种语言时:
spinLanguages.ItemSelected += (object sender, AdapterView.ItemSelectedEventArgs e) =>
{
     lang = Java.Util.Locale.GetAvailableLocales().FirstOrDefault(t => t.DisplayLanguage == langAvailable[(int)e.Id]);
     textToSpeech.SetLanguage(lang);
};

特效


我已经用相同的方法解决了这个问题。感谢您的跟进和帮助。标记为答案。但是给定的Github项目在oncreate中有该事件,所以我已经添加了它。 - Ajay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接