Проверка Android TTS для поддерживаемого языка с отсутствующими/не загруженными речевыми данными

Я использую класс Android TextToSpeech. Все работает нормально. Однако существуют языки/локали, которые по умолчанию не установлены, но поддерживаются механизмом TTS, и я не могу зафиксировать состояние отсутствующих речевых данных.

При подключении к Интернету, когда я пытаюсь установить язык в новый языковой стандарт, который его речевые данные не были загружены, он просто загрузит голосовые данные и выполнит метод разговора нормально/успешно.

Однако при отключении Интернета, когда я пытаюсь установить LanguageLanguage в новую локаль, которую его речевые данные не были загружены, он пытается загрузить голосовые данные. Но без Интернета он просто указывает на "загрузку" на экране настроек "TTS voice data" в разделе "Язык и ввод" для выбранного языка, без каких-либо успехов. И, как и ожидалось, метод разговора не работает, поскольку голосовые данные не загружаются. Когда это произойдет, я думаю, что методы TTS setLanguage/isLanguageAvailable вернут мне LANG_MISSING_DATA, чтобы захватить это состояние, однако он просто возвращает LANG_COUNTRY_AVAILABLE. Ситуация показана на этом изображении: введите описание изображения здесь

Я хочу иметь возможность обнаруживать, когда речевые данные выбранного языкового стандарта не загружаются/отсутствуют, а также дают тост-сообщение или прямой пользователь для его загрузки. Я видел несколько сообщений, предлагающих использовать isLanguageAvailable, как этот один. Я также посмотрел документацию по Android, и кажется, что возвращаемые значения isLanguageAvailable должны фиксировать состояние отсутствующих голосовых данных с помощью LANG_MISSING_DATA.

Я также попытался отправить намерение с ACTION_CHECK_TTS_DATA, как другой способ проверить отсутствующие данные, как это предлагается в документации по Android, которую я связал. Тем не менее, resultCode снова не зафиксировал/не указал, что голосовые данные отсутствуют (CHECK_VOICE_DATA_FAIL), но вместо этого возвращен CHECK_VOICE_DATA_PASS.

В этом случае, как я должен отображать состояние языка/локали, доступное/поддерживаемое, при отсутствии голосовых данных? Мне также интересно, почему CHECK_VOICE_DATA_PASS и LANG_MISSING_DATA не являются возвращаемыми значениями. Когда голосовые данные отсутствуют, не следует ли возвращать эти значения? Благодарю! Ниже приведено возвращаемое значение, когда я пытаюсь использовать setLanguage и isLanguageAvailable на локалях, у которых не были загружены его голосовые данные (0 и 1 - это возвращаемое значение метода, показанного в журналах, -1 - это тот, который соответствует отсутствующему голосу данные): введите описание изображения здесь

Ответ 1

Вы можете найти все доступные локали устройства, используя следующую функцию. надеюсь, что этот код вам поможет.

 Locale loc = new Locale("en");
 Locale[] availableLocales= loc.getAvailableLocales();
 Boolean available=Boolean.FALSE;
 for (int i=0;i<availableLocales.length;i++)
 {
  if(availableLocales[i].getDisplayLanguage().equals("your_locale_language"))
   {
        available=Boolean.TRUE;
        // TODO:  
   }
 }

Ответ 2

У меня есть эта реализация как часть класса-оболочки для работы с TextToSpeech, я надеюсь, что это поможет:

public boolean isLanguageAvailable(Locale language)
{
    if(language == null) return false;
    boolean available = false;
    switch (tts.isLanguageAvailable(language))
    {
        case TextToSpeech.LANG_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
            if(Build.VERSION.SDK_INT >= 21){
                tts.setLanguage(language);
                Voice voice = tts.getVoice();
                if(voice != null){
                    Set<String> features = voice.getFeatures();
                    if (features != null && !features.contains(TextToSpeech.Engine.KEY_FEATURE_NOT_INSTALLED))
                        available = true;
                } else available = false;
                tts.setLanguage(this.language);
            }
            break;

        case TextToSpeech.LANG_MISSING_DATA:
        case TextToSpeech.LANG_NOT_SUPPORTED:
        default:
            break;
    }
    return available;
}

Ответ 3

Это выглядит долгожданным вопросом, но в любом случае. Кажется, что вам нужно проверить голосовые функции, чтобы узнать это:

Set<String> features = voice.getFeatures();
if (features.contains(TextToSpeech.Engine.KEY_FEATURE_NOT_INSTALLED)) {
//Voice data needs to be downloaded
...
}

Ответ 4

Голосовые данные отсутствуют в словарях