2012-04-03 16 views
7

मैंने एक साधारण भाषण मान्यता सेवा बनाई: इस उद्देश्य के लिए मैंने android.speech.RecognitionService का उप-वर्ग बनाया और मैंने इस सेवा को शुरू करने और रोकने के लिए एक गतिविधि बनाई।कस्टम भाषण मान्यता सेवा कैसे पंजीकृत करें?

मेरी कस्टम भाषण मान्यता सेवा डिफ़ॉल्ट भाषण पहचानकर्ता का उपयोग करती है, क्योंकि मेरा लक्ष्य यह समझने के लिए है कि RecognitionService और RecognitionService.Callback कक्षाएं कैसे काम करती हैं।

public class SimpleVoiceService extends RecognitionService { 

    private SpeechRecognizer m_EngineSR; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i("SimpleVoiceService", "Service started"); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.i("SimpleVoiceService", "Service stopped"); 
    } 

    @Override 
    protected void onCancel(Callback listener) { 
     m_EngineSR.cancel(); 
    } 

    @Override 
    protected void onStartListening(Intent recognizerIntent, Callback listener) { 
     m_EngineSR.setRecognitionListener(new VoiceResultsListener(listener)); 
     m_EngineSR.startListening(recognizerIntent); 
    } 

    @Override 
    protected void onStopListening(Callback listener) { 
     m_EngineSR.stopListening(); 
    } 


    /** 
    * 
    */ 
    private class VoiceResultsListener implements RecognitionListener { 

     private Callback m_UserSpecifiedListener; 

     /** 
     * 
     * @param userSpecifiedListener 
     */ 
     public VoiceResultsListener(Callback userSpecifiedListener) { 
      m_UserSpecifiedListener = userSpecifiedListener; 
     } 

     @Override 
     public void onBeginningOfSpeech() { 
      try { 
       m_UserSpecifiedListener.beginningOfSpeech(); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onBufferReceived(byte[] buffer) { 
      try { 
       m_UserSpecifiedListener.bufferReceived(buffer); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onEndOfSpeech() { 
      try { 
       m_UserSpecifiedListener.endOfSpeech(); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onError(int error) { 
      try { 
       m_UserSpecifiedListener.error(error); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onEvent(int eventType, Bundle params) { ; } 

     @Override 
     public void onPartialResults(Bundle partialResults) { 
      try { 
       m_UserSpecifiedListener.partialResults(partialResults); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onReadyForSpeech(Bundle params) { 
      try { 
       m_UserSpecifiedListener.readyForSpeech(params); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onResults(Bundle results) { 
      try { 
       m_UserSpecifiedListener.results(results); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onRmsChanged(float rmsdB) { 
      try { 
       m_UserSpecifiedListener.rmsChanged(rmsdB); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

मैं निम्न गतिविधि का उपयोग कर सेवा शुरू और बंद करता हूं।

public class VoiceServiceStarterActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Button startButton = new Button(this); 
     startButton.setText("Start the service"); 
     startButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { startVoiceService(); } 
     }); 
     Button stopButton = new Button(this); 
     stopButton.setText("Stop the service"); 
     stopButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { stopVoiceService(); } 
     }); 
     LinearLayout layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     layout.addView(startButton); 
     layout.addView(stopButton); 
     setContentView(layout); 
    } 

    private void startVoiceService() { 
     startService(new Intent(this, SimpleVoiceService.class)); 
    } 

    private void stopVoiceService() { 
     stopService(new Intent(this, SimpleVoiceService.class)); 
    } 
} 

अंत में मैं AndroidManifest.xml पर मेरी सेवा (एंड्रॉयड एसडीके फ़ोल्डर के भीतर VoiceRecognition नमूना देखें) घोषित कर दिया।

<service android:name="SimpleVoiceService" 
     android:label="@string/service_name" > 

    <intent-filter> 
     <action android:name="android.speech.RecognitionService" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
</service> 

तो मैं एक Android डिवाइस पर इस अनुप्रयोग स्थापित है और मैं इसे शुरू: - जब मैं सेवा शुरू करते हैं, यह ठीक से शुरू होता है; - जब मैं इसे रोकता हूं, तो यह ठीक से बंद हो जाता है।

लेकिन यदि मैं किसी अन्य गतिविधि में निम्न कोड लॉन्च करता हूं, तो में केवल एक तत्व होता है, जो डिफ़ॉल्ट भाषण पहचानकर्ता है।

PackageManager pm = getPackageManager(); 
List<ResolveInfo> activities = pm.queryIntentActivities(
      new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0); 

मेरा भाषण पहचानकर्ता सिस्टम में मौजूद लोगों के बीच क्यों नहीं लौटाया गया है?

+1

उपयोग करने की आवश्यकता? मेरा मतलब है, क्या मैं अब Google के लिए अपनी विस्तारित मान्यता सेवा को हुक कर सकता हूं? –

+1

जब आप SimpleVoiceSearch सेवा शुरू करते हैं तो आपके ऑनस्टार्ट लिस्टिंग काम शुरू कर रहे थे? @ enzom83 –

उत्तर

7

आप queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) चाहते हैं अपनी गतिविधि (VoiceServiceStarterActivity) लेने के लिए तो आप अपने ऐप्लिकेशन के प्रदर्शन में घोषित करने के लिए कि इस गतिविधि संभालती RecognizerIntent.ACTION_RECOGNIZE_SPEECH है, यह

<activity android:name="VoiceServiceStarterActivity"> 
    <intent-filter> 
    <action android:name="android.speech.action.RECOGNIZE_SPEECH" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    </intent-filter> 
    ... 
</activity> 

अधिक ठोस कोड के लिए की तरह परियोजना पर एक नजर है Kõnele (source code) जो अनिवार्य रूप से इंटरफेस जो के माध्यम से वाक् पहचान Android पर प्रदान की जाती है का एक खुला स्रोत कार्यान्वयन है यानि यह शामिल हैं:

  • ACTION_RECOGNIZE_ भाषण
  • ACTION_WEB_SEARCH
  • RecognitionService

और का उपयोग करता है खुला स्रोत भाषण मान्यता सर्वर।

+1

मुझे समझ में नहीं आता कि मुझे एक नई गतिविधि क्यों बनाना चाहिए। वर्तमान में मेरे पास एक गतिविधि है ('VoiceDemoActivity') जो 'स्पीच रिकॉग्नाइज़र' ऑब्जेक्ट के माध्यम से डिफ़ॉल्ट भाषण पहचानकर्ता को संभालती है। एक कस्टम वॉयस मान्यता सेवा का उपयोग करने के लिए, मुझे 'CreateSpeechRecognizer' विधि' में 'घटक नाम' ऑब्जेक्ट निर्दिष्ट करने वाला एक नया 'स्पीच रिकॉग्नाइज़र' ऑब्जेक्ट बनाना होगा: मुझे लगता है कि यह 'घटक नाम' कस्टम वॉयस पहचानकर्ता सेवा का संदर्भ लेना चाहिए, इसलिए मैंने एक नई 'पहचान सेवा' कक्षा बनाई है।मुझे एक और गतिविधि को लागू करने की आवश्यकता क्यों है जो 'ACTION_RECOGNIZE_SPEECH' इरादे को संभाल सकता है? – enzom83

+2

मैंने थोड़ा सा जवाब दिया, शायद यह थोड़ा और स्पष्ट हो गया। – Kaarel

+0

@ करेल मुझे वास्तव में पसंद है जो आपने कोनेले में किया था (हालांकि मुझे एस्टोनियाई भाषा नहीं पता है)। उदाहरण के लिए मैंने गिटूब से सोर्स कोड डाउनलोड किया ताकि उदाहरण के लिए सीखें कि कैसे अपना खुद का अंग्रेजी (केवल अंग्रेज़ी) को कार्यान्वित किया जाए, लेकिन यह बॉक्स से बाहर नहीं होगा और रिलीज ऐप (Google Play से डाउनलोड किया गया) * "ट्रांसक्रिप्शन" में फंस जाएगा। .. "*। मैं आपके कोड की संरचना (3 अलग-अलग पैकेज) के बारे में और कहां से जान सकता हूं और * क्यों * इसे लागू किया गया है? धन्यवाद! – ripopenid

0

हाँ, तो आप इस ओवरराइड करने के लिए 'गूगल अब' डिफ़ॉल्ट RecognitionService लिए सक्षम है createSpeechRecognizer (संदर्भ संदर्भ, ComponentName serviceComponent)

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