web-dev-qa-db-ja.com

Android)でオフライン音声認識言語を自動ダウンロード

Java Androidデバイスにオフライン音声認識言語がインストールされているかどうか、およびユーザーにダウンロードを求めるプロンプトが表示されないかどうかを検出する方法はありますか?

テキストよりもオフラインの音声を優先するように音声からテキストへの音声認識を依頼できることは知っていますが、デバイスに言語がインストールされているかどうかをどのように知ることができますか?

この質問はオフラインスピーチの使い方ではなく、うまくいきます。問題は、Javaアプリコードから「オフライン音声言語を検出してダウンロード/インストールする方法」です。つまり、オフラインドイツ語がインストールされているかどうかをアプリに検出させ、インストールされていない場合は、ユーザーにダウンロードを促します。 /インストールします。

18
James

これはあなたが望んでいる答えではありません。これを書いている時点では、これに対する簡単な解決策はないと思います。私は間違っていることが証明されることを強く望んでいます。

私はずっと前にこの情報をプログラムで提供するための機能拡張を要求しました- ここ

拡張により、追加のパラメーター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);

悲しいかな、それは起こったことがありません。

これを適切に処理するために、他に2つのオプションがあります。

万が一、アプリケーションがroot権限で実行された場合は、オフラインファイルが含まれている/data/data/com.google.Android.googlequicksearchbox/app_g3_models/の場所を確認できます。このファイルには、ロケールによって非常に簡単にラベルが付けられています。

2つ目は、不足しているオフラインファイルをインストールするためにユーザーがプロンプトを必要とするタイミングを知ることです。

私の経験から、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;
}

もちろん、このようなハードコードされた値を使用することは理想的ではありませんが、この状況でもありません。

上記のすべてをいじって、良い暫定的な解決策があると思ったら、もう一度考えてみてください!ユーザーが不足しているオフラインファイルを正しくインストールしたかどうかに関係なく、それでも機能しない可能性が非常に高くなります。

私の ここに答える は、私がまだユーザーをガイドしなければならないプロセスを説明しています。とてもイライラします。

最後に、ミックスにスローするもう1つのバグ RecognitionListener.onError(int) エラーがない場合にスローされる可能性があります。私の要点を確認してください ここでの回答からBugRecognitionListenerを使用して、コールバックが正しい順序で送信されていることを確認し、そうでないものを無視できるようにします。以前のリリースでの修正を提案する私の答えにもかかわらず、これは問題のままです。

上記はあなたを忙しくさせるはずです!幸運を....

6
brandall