Jam*_*mes 18 android speech-recognition
在Java中是否有任何方法可以检测Android设备是否安装了脱机语音识别语言,以及是否提示用户不下载它?
我知道你可以要求发言到文本,更喜欢离线语音到文本,但是你怎么知道设备是否安装了语言?
这个问题不是关于如何使用离线语音,这是有效的.问题是"如何从Java应用程序代码中检测和下载/安装脱机语音语言".即让应用程序检测他们是否安装了脱机德语,如果没有提示用户下载/安装它.
这不是您希望的答案,因为在撰写本文时,我认为没有直接的解决方案.我非常希望被证明是错的.
我要求增强功能在很久以前以编程方式提供此信息 - 这里
增强功能提示了一个附加参数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);
Run Code Online (Sandbox Code Playgroud)
唉,它从未发生过.
您还有两个其他选项可以尝试优雅地处理此问题.
在极少数情况下,您的应用程序以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;
}
}
Run Code Online (Sandbox Code Playgroud)
检测到后,您可以引导用户进入正确的安装屏幕.
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;
}
Run Code Online (Sandbox Code Playgroud)
使用诸如此类的硬编码值当然不是理想的,但这种情况也不是!
一旦你搞砸了以上所有内容并认为你有一个很好的临时解决方案 - 再想一想!无论用户是否正确安装了丢失的脱机文件,它很可能仍然无法正常工作.....
我在这里的答案描述了我仍然必须指导我的用户的过程.这非常令人沮丧.
最后还有一个错误 - 当没有错误时,可以抛出RecognitionListener.onError(int).从这里的答案中检查我的要点以使用a,BugRecognitionListener这样你就可以检查回调是按照正确的顺序发送的,而忽略那些不正确的回调.这仍然是一个问题,尽管我的答案暗示在以前的版本中修复.
以上应该让你忙!祝好运....
小智 -1
要检测所需语言(德语)是否可用,请按照以下步骤操作:
迭代 Locale 列表并检查 Locale 是否适用于德语。
如果您没有得到任何 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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
2900 次 |
| 最近记录: |