Обнаружение установленных языков для автономного распознавания
Можно определить через код, какие языковые пакеты в настоящее время установлены на устройстве? Пробовал это:
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)