2016-06-16 4 views
8

SpeechRecognizerは、Google Apps(GApps)を搭載したAndroidでうまく機能します。しかし、中国では、ほとんどのAndroid搭載端末がこれらのGoogle Appsを削除します。 SpeechRecognizerを使用するとどうなりますか?実際のデバイスなしでどうすればテストできますか? CustomListener()RecognitionListenerを実装Google Appsを使用しないAndroidデバイスのSpeechRecognizer

speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext()); 
speechRecognizer.setRecognitionListener(new CustomListener()); 
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "zh_HK"); 
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, getClass().getPackage().getName()); 
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1); 
intent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, false); 
intent.putExtra("android.speech.extra.EXTRA_ADDITIONAL_LANGUAGES", new String[]{"zh_HK", "en-US"}); 
speechRecognizer.startListening(intent); 

+2

'Gapps'が例えば' com.android.vending'のチェックによってインストールされているかどうかPackageManagerを介してチェックすることができます。そうでなければ、音声認識のための別の方法は、スフィンクスである可能性があります:http://cmusphinx.sourceforge.net/ – Opiatefuchs

+0

良いアイデア。しかし、スフィンクスの言語ファイルは多くのスペースを占めています。チェックが追加されない場合、上記のコードはクラッシュしますか? – Raptor

+0

それは非常に良い質問です、もし私ができるなら、私はこれにもっとアップフォースを与えるでしょう。しかし、実際には.....私は知らない。通常のケースから開始すると、これを行うパッケージがない場合、何らかのアクションを処理するインテントがクラッシュします。私はgappsがないことと同じだと思います、なぜ別の方法で扱われるべきなのでしょうか?これを避けるには、intent.resolveActivity(pckManager)!= null'で行うことができます。 – Opiatefuchs

答えて

4

私はあなたが以下のほとんどを認識していると確信しているが、総合的な答えのために:

任意のアプリケーションは、それが正しくRecognitionServiceを登録すると、音声認識プロバイダとして登録することができます。 Samsungのデバイスの場合、Android Voice Searchの設定ではGoogleとVlingoの2つのプロバイダが表示されます。

GoogleのRecognitionServiceは、ご承知のとおり、Google Playサービスに依存しているGoogle 'Now'アプリケーションに含まれています。

VlingoのRecognitionServiceは、S-Voiceアプリケーションに含まれています。これは一般にSamsungデバイスにプレインストールされているため、実際はあなたの質問には当てはまりません。

あなたがSpeechRecognizerを使用する前に、あなたは常に静的ヘルパーメソッドを使用する必要があります

if (SpeechRecognizer.isRecognitionAvailable(getApplicationContext())) { 
    // initialise 
    } else { 
    // nope 
    } 

method documentationで引用されたよう:

チェックし、音声認識サービスが システム上で利用可能であるかどうかを。このメソッドがfalseを返す場合、createSpeechRecognizer(Context) は失敗します。あなたが特定の使用の場合には、このメソッドを使用する場合は、初期化のクラッシュを心配する必要はありませんので、誤認識が利用可能な場合はtrue

戻り値は、そうでない場合は

は、それは、falseを返す必要があります。

Vlingoはここでtrueを返しますが、実際には音声応答を返すことはありません。何らかの理由でERROR_NETWORKが返されます。気に障る。

別に上記のチェックから、あなたはまた、どの照会することができ、いずれの場合、アプリケーションは次の操作を行って、音声認識プロバイダとして登録されています

final List<ResolveInfo> services = context.getPackageManager().queryIntentServices(
        new Intent(RecognitionService.SERVICE_INTERFACE), 0); 

どれ空のリストを、何のプロバイダが用意されていない意味します。コメントで述べたように

最後に、あなたは高音チェック常に可能性があり、Googleのアプリケーションがインストールされていることを確認します

/** 
* Check if the user has a package installed 
* 
* @param ctx   the application context 
* @param packageName the application package name 
* @return true if the package is installed 
*/ 
public static boolean isPackageInstalled(@NonNull final Context ctx, @NonNull final String packageName) { 
    try { 
     ctx.getApplicationContext().getPackageManager().getApplicationInfo(packageName, 0); 
     return true; 
    } catch (final PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 

あなたはジェリービーン+を標的にしていると仮定すると、私は次の便利なメソッドを使用します

ここで、Googleのパッケージ名はcom.google.android.googlequicksearchbox

です。最後に、サイドロードギャップにユーザーを誘導するのではなく、そこに他の多くの音声認識プロバイダがいることがわかりますあなたが使うことができるプロバイダRESTfulなサービス。すべてが空いているわけではありません。

関連する問題