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

时间:2017-02-03 21:23:49

标签: android speech-recognition

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

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

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

3 个答案:

答案 0 :(得分: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描述了我仍需要指导用户的流程。这非常令人沮丧。

最后还有另外一个错误 - 当没有错误时,可以抛出RecognitionListener.onError(int)。检查我的要点from the answer here以使用BugRecognitionListener,这样您就可以检查回调是否以正确的顺序发送,并忽略那些不正确的回调。这仍然是一个问题,尽管我的回答表明在之前的版本中有一个修复。

以上应该让你忙碌!祝你好运....

答案 1 :(得分:-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 :(得分:-2)

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