Проверка 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
Голосовые данные отсутствуют в словарях