2017-02-03 14 views
13

Czy jest jakiś sposób w języku Java, aby wykryć, czy urządzenie z Androidem ma zainstalowany język rozpoznawania mowy w trybie offline i czy nie monituje użytkownika o jego pobranie?Automatyczne pobieranie języka rozpoznawania mowy w trybie offline na Androidzie

Wiem, że można poprosić o przemówienie do tekstu, aby preferować mowę w trybie offline do tekstu, ale skąd wiadomo, czy urządzenie ma zainstalowany język?

To pytanie nie dotyczy używania mowy w trybie offline, to działa. Pytanie brzmi "jak wykrywać i pobierać/instalować języki mowy w trybie offline" z kodu aplikacji Java. tzn. czy aplikacja ma wykryć, czy ma zainstalowany język niemiecki w trybie offline, i jeśli nie monituje użytkownika o pobranie/zainstalowanie tego języka.

+0

Nie, to pytanie brzmi "jak używać mowy w trybie offline", praca w trybie offline działa, ale musisz pobrać plik językowy, to pytanie brzmi "jak wykryć i pobrać/zainstalować plik językowy" – James

+1

Poprosiłem o rozszerzenie to dawno temu, które jest teraz oznaczone jako przestarzałe. https://code.google.com/p/android/issues/detail?id=59145 – brandall

+0

wypróbuj ten kod z @gregm [tutaj] (http://stackoverflow.com/a/10548680/4394827) –

Odpowiedz

-1

Aby wykryć, czy potrzebne język (niemiecki) jest dostępna, wykonaj poniższe:

  • iteracyjne listę i sprawdzić, czy Locale Locale dostępnych dla języka niemieckiego.

  • Jeśli nie otrzymałeś żadnego obiektu Locale w zamian, możesz wywnioskować, że język niemiecki nie jest dostępny w trybie offline. Następnie możesz napisać kod do pobrania i zrobić inne rzeczy.

  • Zrobiłem poniżej realizacji dla mojego projektu. Nadzieja pod kodem pomaga!

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

    }

+2

Lokalna istota dostępne nie oznacza, że ​​dostępny jest język rozpoznawania mowy w trybie offline. Twój kod dotyczy także TextToSpeech, a nie SpeechToText – James

3

To nie jest odpowiedź masz nadzieję, jak w chwili pisania tego tekstu, nie wierzę, że to proste rozwiązanie do tego. Mam wielką nadzieję, że udowodnię, że się mylę.

Poprosiłem akcesorium do dostarczania tych informacji programowo dawno temu - here

Wzmocnienie sugerowaną dodatkowy parametr RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES:

Byłoby z pewnością trywialne do tego należy dodać i stosować w następujących przypadkach sposób:

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

Niestety, to się nigdy nie wydarzyło.

Masz dwie inne opcje, aby spróbować z wdziękiem sobie z tym poradzić.

W mało prawdopodobnym przypadku, gdy aplikacja uruchamia się z uprawnieniami root'a, można sprawdzić lokalizację pliku /data/data/com.google.android.googlequicksearchbox/app_g3_models/, która zawiera pliki trybu offline, oznaczoną dość wygodnie przez ich ustawienia narodowe.

Druga polega na poznaniu, kiedy użytkownik potrzebuje zachęty do zainstalowania brakujących plików trybu offline.

Z mojego doświadczenia wynika, że ​​błąd rozpoznawania SpeechRecognizer.ERROR_SERVER najczęściej oznacza to, ale nie jest to niezawodne.

@Override 
public void onError(final int error) { 

    switch (error) { 

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

Po wykryciu można poprowadzić użytkownika do prawidłowego ekranu instalacji.

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

Stosowanie tak zakodowanych wartości, jak ta, nie jest oczywiście idealne, ale nie jest to również sytuacja!

Po rozwiązaniu wszystkich powyższych problemów i pomyśl, że masz dobre rozwiązanie tymczasowe - pomyśl jeszcze raz! Niezależnie od tego, czy użytkownik poprawnie zainstalował brakujące pliki trybu offline, jest wysoce prawdopodobne, że nadal nie zadziała ...

Mój numer answer here opisuje proces, w którym muszę jeszcze poprowadzić użytkownika. To bardzo frustrujące.

W końcu jeszcze jeden błąd, który należy wrzucić do miksu - RecognitionListener.onError(int) może zostać zgłoszony, gdy nie wystąpi błąd. Sprawdź mój numer from the answer here, aby użyć numeru BugRecognitionListener, aby sprawdzić, czy wywołania zwrotne są wysyłane we właściwej kolejności i zignorować te, które nie są. To pozostaje problemem, mimo że moja odpowiedź sugeruje poprawkę w poprzedniej wersji.

Powyższe powinno Cię zająć! Powodzenia ...

Powiązane problemy