2017-02-03 24 views
13

Androidデバイスにオフライン音声認識言語がインストールされているかどうかを検出する方法はありますか?Androidでオフライン音声認識言語を自動ダウンロードする

オフライン音声からテキストを好むようにテキストに音声で尋ねることはできますが、デバイスに言語がインストールされているかどうかはどのように分かりますか?

この質問はオフライン音声を使用する方法ではありませんが、これは機能します。 質問は、Javaアプリケーションコードから「オフライン音声言語を検出してダウンロード/インストールする方法」です。つまり、アプリにオフラインのドイツ語がインストールされているかどうかを検出させ、ダウンロード/インストールのプロンプトを表示しない場合は、

+0

いいえ、その質問は「オフラインスピーチの使い方」ですが、オフラインスピーチは機能しますが、言語ファイルをダウンロードする必要があります。この質問は「言語ファイルの検出とダウンロード/インストール方法」 – James

+1

これはずっと前のことであり、今は時代遅れとマークされています。 https://code.google.com/p/android/issues/detail?id=59145 – brandall

+0

このコードを@gregm [ここ](http://stackoverflow.com/a/10548680/4394827) –

答えて

-1

は(ドイツの)必要な言語が利用可能であるかどうかを検出するには、以下に従ってください。

  • 反復ロケールのリストをチェックドイツ語で利用可能なロケールのかどうか。

  • 返された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

から試してください。オフライン音声認識言語が利用可能であることを意味するものではありません。また、あなたのコードはSpeechToTextではなくTextToSpeech用です – James

3

書いている時点で、私はこれまでまっすぐ進む解決策があると信じていませんので、これは、あなたが望んでいる答えではありません。私は間違っていることが証明されたいと思っています。

私は長い時間前に、プログラムでこの情報を提供するために強化を要求した - here

強化が追加パラメータRecognizerIntent.EXTRA_SUPPORTED_OFFLINE_LANGUAGES提案:

を、これは、以下に追加して使用されることが確実に些細なことだろうway:

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つのオプションがあります。

アプリケーションがルート権限で実行されている場合は、オフラインファイルを含む/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は私のユーザーをガイドするプロセスを説明しています。非常にイライラしています。

最後に、エラーがなければもう1つのバグ(RecognitionListener.onError(int))がスローされます。私の要点from the answer hereBugRecognitionListenerを使用するようにチェックすると、コールバックが正しい順序で送信されていることを確認し、そうでないものを無視できます。これは私の答えが以前のリリースでの修正を提案しているにもかかわらず、問題が残っています。

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