2012-04-03 17 views
7

Basit bir konuşma tanıma hizmeti oluşturdum: bu amaçla android.speech.RecognitionService alt sınıfını oluşturdum ve bu hizmeti başlatmak ve durdurmak için bir etkinlik oluşturdum. Amacım RecognitionService ve RecognitionService.Callback sınıfları nasıl çalıştığını anlamak için basitçe çünküÖzel konuşma tanıma hizmeti nasıl kaydedilir?

Benim özel konuşma tanıma hizmete, varsayılan konuşma tanıyıcı kullanır.

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

} 

Aşağıdaki etkinlikleri kullanarak hizmeti başlatıp durduruyorum.

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

Sonunda AndroidManifest.xml benim servis (Android SDK klasör içinde VoiceRecognition örneğe bakın) ilan etti.

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

Sonra bir Android cihazında bu uygulama yüklü ve bunu başlatmak: - Ben hizmetini başlattığınızda, düzgün başlar; - onu durdurduğumda düzgün durur.

Ancak, aşağıdaki kodu başka bir etkinlikte başlatırsam, activitiesList yalnızca varsayılan konuşma tanıyıcı olan bir öğeyi içerir.

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

Konuşma tanıyıcı sistemimde bulunanlar arasında neden iade edilmiyor? daha somut kodu için bu

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

projesinde de bakabilirsiniz gibi

+1

kullanmak gerekir? Şimdi google için kendi genişletilmiş tanıma hizmetimi kullanabilir miyim? –

+1

OnStartListening SimpleVoiceSearch Hizmetini başlattığınızda çalışmaya başladı mı? @ enzom83 –

cevap

7

Eğer aktiviteyi (VoiceServiceStarterActivity) almaya queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) istiyorsanız o zaman bu etkinlik RecognizerIntent.ACTION_RECOGNIZE_SPEECH işleme uygulamanızın Manifestosunun beyan etmek zorunda

  • ACTION_RECOGNIZE_: esasen konuşma tanıma Android'de sağlandığı aracılığıyla arayüzleri açık kaynak uygulamasıdır Kõnele (source code), kapsadığı yani KONUŞMA
  • ACTION_WEB_SEARCH
  • RecognitionService

ve kullanan açık kaynak konuşma tanıma sunucuları.

+1

Neden yeni bir etkinlik oluşturmalıyım anlamıyorum. Şu anda bir 'SpeechRecognizer' nesnesi aracılığıyla varsayılan konuşma tanıyıcıyı işleyen bir etkinliğim ('VoiceDemoActivity') var. Özel bir ses tanıma servisi kullanmak için, 'createSpeechRecognizer' yönteminde 'ComponentName 'nesnesini belirten yeni bir' SpeechRecognizer' nesnesi yaratmalıyım: Sanırım bu 'ComponentName' özel ses tanıyıcı hizmetine başvurmalıdır. Yeni bir "RecognitionService" sınıfı oluşturdum.Neden "ACTION_RECOGNIZE_SPEECH" amacını kaldırabilen başka bir etkinlik gerçekleştirmem gerekiyor? – enzom83

+2

Cevabımı biraz geliştirdim, belki biraz daha açık hale getirdi. – Kaarel

+0

@Kaarel Kõnele'de yaptığınız şeyi gerçekten çok seviyorum (Estonca dilini bilmeme rağmen). Örnek olarak kendi başıma nasıl uygulanacağımı öğrenmek için github'dan kaynak kodunu indirdim (yalnızca İngilizce) ancak kutudan çıkmamıştı ve yayınlanan uygulamanın kendisi (Google Play'den indirilen) sıkışıyor * "Yazım. .. "*. Kodunuzun yapısı hakkında daha fazla bilgiyi nerede bulabilirim (3 farklı paket) ve * neden bu şekilde uygulanmaktadır? Teşekkürler! – ripopenid

0

Evet, bu 'Artık Google' default RecognitionService geçersiz kılmak için bize izin mu createSpeechRecognizer (Bağlam bağlamını, ComponentName serviceComponent)

İlgili konular