2016-06-16 6 views
8

SpeechRecognizer एंड्रॉइड पर Google Apps (GApps) के साथ एंड्रॉइड डिवाइस पर SpeechRecognizer। हालांकि चीन में, अधिकांश एंड्रॉइड डिवाइस इन Google Apps को हटा देंगे। क्या होगा जब SpeechRecognizer का उपयोग किया जाता है? मैं वास्तविक डिवाइस के बिना इसका परीक्षण कैसे कर सकता हूं?Google Apps

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); 

जहां CustomListener() लागू करता RecognitionListener

+2

पैकेज मैनेजर के माध्यम से जांचने की संभावना है यदि उदाहरण के लिए 'Gapps' स्थापित है' com.android.vending' जांचें। यदि नहीं, तो स्पीच पहचानने का एक वैकल्पिक तरीका sphinx हो सकता है: http://cmusphinx.sourceforge.net/ – Opiatefuchs

+0

अच्छा विचार। हालांकि, स्फिंक्स की भाषा फ़ाइल बहुत सारी जगह लेती है। यदि कोई चेकिंग नहीं जोड़ा गया है तो उपरोक्त कोड क्रैश हो जाएगा? – Raptor

+0

अच्छी तरह से, यह एक बहुत अच्छा सवाल है और यदि मैं कर सकता हूं तो मैं इससे अधिक उत्साह दूंगा। लेकिन वास्तव में ..... मुझे नहीं पता। अगर मैं सामान्य मामले से शुरू करता हूं, तो ऐसा करने के लिए कोई पैकेज नहीं होने पर कुछ कार्रवाई को संभालने का इरादा दुर्घटनाग्रस्त हो जाएगा। मुझे लगता है कि गायब gapps के साथ यह वही है, इसका इलाज किसी अन्य तरीके से क्यों किया जाना चाहिए। इससे बचें intent.resolveActivity (pckManager) द्वारा किया जा सकता है! = Null', मुझे लगता है। – Opiatefuchs

उत्तर

4

मुझे यकीन है कि आप निम्न में से अधिकांश के बारे में जानते हैं, लेकिन एक व्यापक जवाब की खातिर:

किसी भी आवेदन एक वाक् पहचान प्रदाता के रूप में रजिस्टर कर सकते हैं, जब तक कि यह एक RecognitionService सही ढंग से पंजीकृत करता है। सैमसंग उपकरणों के मामले में, एंड्रॉइड वॉयस सर्च सेटिंग्स दो प्रदाताओं, Google और विलिंगो दिखाएगी।

Google का RecognitionService उनके Google 'Now' एप्लिकेशन के भीतर पैक किया गया है, जैसा कि आप जानते हैं, Google Play सेवाओं पर निर्भर है।

विलिंगो का RecognitionService उनके एस-वॉयस एप्लिकेशन के भीतर है, जो केवल सैमसंग उपकरणों पर सार्वजनिक रूप से पूर्वस्थापित है - इसलिए वास्तव में आपके प्रश्न पर लागू नहीं है, लेकिन मैं अपनी टिप्पणी के कारण आगे उल्लेख करता हूं।

इससे पहले कि आप SpeechRecognizer उपयोग करते हैं, तो आप हमेशा स्थिर सहायक विधि का उपयोग करना चाहिए:

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

method documentation द्वारा उद्धृत:

जांचता है कि क्या वाक् पहचान सेवा सिस्टम पर उपलब्ध है । यदि यह विधि गलत लौटाती है, तो CreateSpeechRecognizer (संदर्भ) विफल हो जाएगा।

रिटर्न सच अगर मान्यता उपलब्ध है, झूठी अन्यथा

आप अपने विशेष उपयोग के मामले में इस विधि का उपयोग करते हैं, तो यह गलत है ताकि आप initialisation दुर्घटनाओं के बारे में चिंता करने की ज़रूरत नहीं लौटना चाहिए,।

एक नोट के रूप में, विलिंगो यहां सच वापस आ जाएगा, लेकिन वास्तव में कभी भी भाषण प्रतिक्रियाएं वापस नहीं करेगा, यह किसी कारण से ERROR_NETWORK फेंक देगा। यह खीझ दिलाने वाला है।

उपरोक्त जांच से, आप भी निम्न कार्य करके क्वेरी कर सकते हैं, यदि कोई हो, आवेदन पत्र एक ध्वनि पहचान के प्रदाता के रूप में पंजीकृत हैं:

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

कोई खाली सूची, मतलब होगा कोई प्रदाताओं उपलब्ध हैं।

अंत में, के रूप में टिप्पणी में उल्लेख किया है, तो आप हमेशा तिहरा जांच कर सकता है और गूगल आवेदन स्थापित किया गया है सुनिश्चित करें:

/** 
* 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; 
    } 
} 
:

आप लक्ष्यीकरण रहे Jelly Bean + मान लिया जाये कि मैं निम्नलिखित सुविधा विधि का उपयोग

जहां Google का पैकेज नाम com.google.android.googlequicksearchbox

बहुत अंत में, उपयोगकर्ताओं को साइड लोड gapps प्राप्त करने के सिरदर्द के बजाय, मुझे यकीन है कि आप जानते हैं कि वहां कई अन्य ध्वनि पहचान प्रदाता हैं, जो प्रदाता विश्वसनीय सेवाओं का उपयोग आप कर सकते हैं। सभी के माध्यम से मुक्त नहीं हैं।

संबंधित मुद्दे