首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android下自动下载离线语音识别语言

Android下自动下载离线语音识别语言
EN

Stack Overflow用户
提问于 2017-02-04 05:23:49
回答 2查看 3.8K关注 0票数 18

在Java中,有没有办法检测Android设备是否安装了离线语音识别语言,以及是否没有提示用户下载它?

我知道你可以要求语音转文本,更喜欢离线语音而不是文本,但你如何知道设备是否安装了语言?

这个问题不是关于如何使用离线语音,这是可行的。问题是“如何从Java应用程序代码中检测和下载/安装离线语音语言”。即,让应用程序检测他们是否安装了离线德语,如果没有,则提示用户下载/安装。

EN

回答 2

Stack Overflow用户

发布于 2017-02-11 08:31:12

这不是你想要的答案,因为在写这篇文章的时候,我不相信有一个直接的解决方案。我非常希望被证明是错的。

很久以前,我就请求了一个增强功能来以编程方式提供此信息-- here

增强功能提供了一个额外的参数RecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES

以以下方式添加和使用它肯定是微不足道的:

代码语言:javascript
复制
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);

遗憾的是,这从未发生过。

您确实有另外两个选择来尝试优雅地处理此问题。

在不太可能的情况下,您的应用程序以根权限运行,您可以检查包含脱机文件的/data/data/com.google.android.googlequicksearchbox/app_g3_models/的位置,这些文件由它们的区域设置非常方便地标记。

第二个问题是知道用户何时需要提示安装丢失的脱机文件。

根据我的经验,SpeechRecognizer.ERROR_SERVER的识别错误通常表明这一点,但它并不是万无一失的。

代码语言:javascript
复制
@Override
public void onError(final int error) {

    switch (error) {

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

检测到后,您可以将用户引导至正确的安装屏幕。

代码语言:javascript
复制
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;
}

使用这样的硬编码值当然不理想,但这种情况也不理想!

一旦你摆弄了上面的所有东西,并认为你有一个很好的临时解决方案--再想一想!不管用户是否正确安装了丢失的脱机文件,它很可能仍然无法工作.....

我的answer here描述了我仍然需要指导我的用户的过程。这非常令人沮丧。

最后,在没有错误的情况下,还可以抛出另一个bug - RecognitionListener.onError(int)。检查我的gist from the answer here来使用BugRecognitionListener,这样你就可以检查回调是否以正确的顺序发送,而忽略那些不正确的回调。这仍然是一个问题,尽管我的答案建议在以前的版本中修复。

以上这些应该会让你忙碌起来!祝你好运...

票数 7
EN

Stack Overflow用户

发布于 2017-02-08 22:55:51

若要检测所需语言(德语)是否可用,请按照以下步骤操作:

  • 迭代区域设置列表并检查区域设置是否可用于德语。
  • 如果没有得到任何区域设置对象的返回,则可以断定德语在脱机状态下不可用。然后你可以编写代码来下载和做其他事情。
  • 我在下面为我的项目做了实现。希望下面的代码能帮助你!

private TextToSpeech t1;private void setForOtherLangAudio() { Locale[] locale = Locale.getAvailableLocales();Locale loc = null;for (Locale : locale ){ //如果(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);});

}

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42033223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档