Подтвердить что ты не робот

Автоматическая загрузка автономного языка распознавания речи на Android

Есть ли какой-либо способ в Java определить, установлено ли на устройстве Android автономный язык распознавания речи, и если он не запрашивает у пользователя его загрузить?

Я знаю, что вы можете запросить речь в тексте, чтобы предпочесть автономную речь на текст, но откуда вы знаете, установлено ли на нем язык?

Этот вопрос не о том, как использовать автономную речь, это работает. Вопрос заключается в том, как "обнаружить и загрузить/установить автономные языки речи" из кода приложения Java. то есть, если приложение обнаруживает, что у них установлен автономный немецкий язык, и если он не запрашивает у пользователя загрузку/установку.

4b9b3361

Ответ 1

Это не тот ответ, на который вы надеетесь, как на момент написания статьи, я не верю, что есть прямое решение. Я очень надеюсь, что окажется ошибочным.

Я попросил улучшить эту информацию программным образом давным-давно - здесь

Усовершенствование предложило дополнительный параметр RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES:

Конечно, было бы тривиально, если бы это было добавлено и использовано следующим образом:

final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
getContext().sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() {

    @Override
    public void onReceive(final Context context, final Intent intent) {

        final ArrayList<String> vrStringLocales = intent.getExtras().getStringArrayList(
                RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);

        // This would be nice
        final ArrayList<String> vrStringOfflineLocales = intent.getExtras().getStringArrayList(
                RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES);
    }

}, null, 1234, null, null);

Увы, этого никогда не было.

У вас есть еще два варианта, чтобы попытаться обработать это изящно.

В маловероятном случае, когда приложение запускается с правами root, вы можете проверить расположение /data/data/com.google.android.googlequicksearchbox/app_g3_models/, которое содержит файлы в автономном режиме, помеченные ими по своему усмотрению.

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

По моему опыту, ошибка распознавания SpeechRecognizer.ERROR_SERVER чаще всего обозначает это, но она не является надежной.

@Override
public void onError(final int error) {

    switch (error) {

        case SpeechRecognizer.ERROR_SERVER:
            // TODO - prompt to install offline files
            break;
    }
}

При обнаружении вы можете направлять пользователя на правильный экран установки.

public static final String PACKAGE_NAME_GOOGLE_NOW = "com.google.android.googlequicksearchbox";
public static final String ACTIVITY_INSTALL_OFFLINE_FILES = "com.google.android.voicesearch.greco3.languagepack.InstallActivity";

public static boolean showInstallOfflineVoiceFiles(@NonNull final Context ctx) {

    final Intent intent = new Intent();
    intent.setComponent(new ComponentName(PACKAGE_NAME_GOOGLE_NOW, ACTIVITY_INSTALL_OFFLINE_FILES));

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    try {
        ctx.startActivity(intent);
        return true;
    } catch (final ActivityNotFoundException e) {

    } catch (final Exception e) {

    }

    return false;
}

Использование жестко закодированных значений, таких как это, конечно, не идеально, но и эта ситуация не существует!

Как только вы перепутали все вышеперечисленное и подумаете, что у вас есть хорошее временное решение - подумайте еще раз! Независимо от того, правильно ли пользователь установил отсутствующие автономные файлы, весьма вероятно, что он все равно не будет работать.

Мой ответ здесь описывает процесс, с которым я все еще должен вести мой пользователь. Это очень расстраивает.

Наконец, еще одна ошибка, которую нужно бросить в микс - RecognitionListener.onError(int) можно выбросить, если нет ошибки. Проверьте мой gist из ответа здесь, чтобы использовать BugRecognitionListener, чтобы вы могли проверить, что обратные вызовы отправляются в правильном порядке и игнорируют те, которые этого не делают. Это остается проблемой, несмотря на мой ответ, предлагающий исправление в предыдущем выпуске.

Вышесказанное должно держать вас в напряжении! Удачи....

Ответ 2

Чтобы узнать, доступен ли язык (немецкий), выполните следующие действия:

  • Итерировать список локалей и проверить, доступен ли языковой стандарт для немецкого языка.

  • Если вы не получили какой-либо объект Locale взамен, вы можете сделать вывод, что немецкий язык недоступен в автономном режиме. Затем вы можете писать код для загрузки и делать другие вещи.

  • Я выполнил ниже для моего проекта. Надежда ниже кода поможет вам!

    private TextToSpeech t1;
    
    private void setForOtherLangAudio() {
    Locale[] locales = Locale.getAvailableLocales();
    Locale loc = null;
    for (Locale locale : locales) {
      // Replace XXX with your German codes
      if (locale.getDisplayCountry().equals("XXX") &&   locale.getDisplayLanguage().equals("XXX")) {
        loc = locale ;
        break;
    }
    }
    final Locale germanLocale = loc;
    t1 = new TextToSpeech(getContext(), new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR) {
                t1.setLanguage(germanLocale);
            }
        }
    });
    

    }