首页 文章

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

提问于
浏览
17

在Java中是否有任何方法可以检测Android设备是否安装了脱机语音识别语言,以及是否提示用户不下载它?

我知道你可以要求发言到文本,更喜欢离线语音到文本,但是你怎么知道设备是否安装了语言?

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

3 回答

  • 5

    这不是您希望的答案,因为在撰写本文时,我认为没有直接的解决方案 . 我非常希望被证明是错的 .

    我要求增强功能以很久以前的编程方式提供此信息 - here

    增强功能提示了一个额外的参数 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);
    

    唉,它从未发生过 .

    您还有两个其他选项可以尝试优雅地处理此问题 .

    在极少数情况下,您的应用程序以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;
        }
    }
    

    检测到后,您可以引导用户进入正确的安装屏幕 .

    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描述了我仍然需要引导我的用户_2515726的过程非常令人沮丧 .

    最后还有一个错误就是混乱 - 当没有错误时,可以抛出RecognitionListener.onError(int) . 检查我的要点from the answer here以使用 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);
            }
        }
    });
    

    }

  • -2

    http://howtodevelop.eu/question/java-android-auto-download-offline-speech-recognition-language-on-android,138484我认为你的问题在这里得到解答 . 如果有效,请告诉我 .

相关问题