Обнаружение установленных языков для автономного распознавания

Можно определить через код, какие языковые пакеты в настоящее время установлены на устройстве? Пробовал это:

    Intent detailsIntent =  new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
    sendOrderedBroadcast(detailsIntent, null, new LanguageDetailsChecker(), null, Activity.RESULT_OK, null, null);

    public class LanguageDetailsChecker extends BroadcastReceiver  {

    private List<String> supportedLanguages;

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Bundle results = getResultExtras(true);
        if (results.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES))
        {
            supportedLanguages =results.getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
            Log.d("TAG","languages: " + supportedLanguages);
        }
    }
}

Однако на выходе отображается много языков, в то время как у меня установлены только en_UK, en_US и es_ES. Любая идея?

Ответ 1

Если у вас есть root (извините), вы можете сделать это следующим образом:

public static boolean isOfflineDictionaryPresent(String language) {
    if (locale == null) locale = Locale.US;
    String dir = "/system/usr/srec/config/" +
            language.replace('_', '.').toLowerCase();
    if ((new File(dir)).isDirectory()) return true;
    return false;
}

Это было сорвано с Android 4.2.2 Источник Recognizer.java и изменено:

  • возвращает простое логическое значение вместо каталога словаря
  • принимает строковый ввод (например, "en_US" ) вместо Locale

Я бы получил полный список так же, как и вы, и прокрутил их, чтобы проверить, какие из них доступны в автономном режиме. Я проверил папку /system/usr/srec/config/ на двух устройствах, и они совпадают со словарями, которые я установил.

Конечно, нижняя сторона заключается в том, что он работает только для root, поэтому я не уверен, насколько это будет полезно для вас в конце. Я действительно не уверен, что сказать для non-root, я ничего не могу найти.


Изменить: Из любопытства, однако, что делает EXTRA_SUPPORTED_LANGUAGES, если вы в автономном режиме? Если он вернется правильно, вам может потребоваться подделка сетевого менеджера.

Ответ 2

проверьте этот пример:

public class SpeakingAndroid extends Activity implements  OnInitListener {

        //TTS object
    private TextToSpeech myTTS;
        //status check code
    private int TS_CHECK_CODE = 0;

        //create the Activity
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

            //check for TTS data
            Intent checkTTSIntent = new Intent();
            checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
            startActivityForResult(checkTTSIntent, TS_CHECK_CODE);
    }

        //act on result of TTS data check
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == MY_DATA_CHECK_CODE) {
            if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
                //the user has the necessary data - create the TTS
            myTTS = new TextToSpeech(this, this);
            }
            else {
                    //no data - install it now
                Intent installTTSIntent = new Intent();
                installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installTTSIntent);
            }
        }
    }

        //setup TTS
    public void onInit(int initStatus) {

            //check for successful instantiation
        if (initStatus == TextToSpeech.SUCCESS) {
            if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE)
                myTTS.setLanguage(Locale.US);
        }
        else if (initStatus == TextToSpeech.ERROR) {
            Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show();
        }
    }
}

вы можете получить все языки и проверить, что каждый lang поддерживается tts или нет? myTTS.isLanguageAvailable(Locale.US)