2012-04-03 11 views
7

Ho creato un semplice servizio di riconoscimento vocale: per questo scopo ho creato una sottoclasse di android.speech.RecognitionService e ho creato un'attività per avviare e interrompere questo servizio.Come registrare un servizio di riconoscimento vocale personalizzato?

Il mio servizio di riconoscimento vocale personalizzato utilizza banalmente il riconoscimento vocale predefinito, perché il mio obiettivo è semplicemente capire come funzionano le classi RecognitionService e 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(); 
      } 
     } 
    } 

} 

Avvio e interruzione del servizio utilizzando la seguente attività.

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

Finalmente ho dichiarato il mio servizio sul AndroidManifest.xml (vedi VoiceRecognition campione all'interno della cartella Android SDK).

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

Poi ho installato questa applicazione su un dispositivo Android e lo inizio: - quando avvio il servizio, si avvia correttamente; - quando lo interrompo, si arresta correttamente.

Ma se lancio il codice seguente in un'altra attività, activitiesList contiene solo un elemento, che è il riconoscimento vocale predefinito.

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

Perché il mio riconoscimento vocale non viene restituito tra quelli presenti nel sistema?

+1

Questo ci permette di ignorare 'Google Now' default RecognitionService? Voglio dire, posso collegare il mio servizio di riconoscimento esteso per Google ora? –

+1

La tua onStartListening Started funzionava quando avvii il servizio SimpleVoiceSearch? @ enzom83 –

risposta

7

Se si desidera queryIntentActivities(new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0) far salire la vostra attività (VoiceServiceStarterActivity) poi si deve dichiarare nel manifesto della tua app che questa attività gestisce RecognizerIntent.ACTION_RECOGNIZE_SPEECH, come questo

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

Per il codice più concreto uno sguardo al progetto Kõnele (source code) che è essenzialmente un'implementazione open source delle interfacce attraverso le quali il riconoscimento vocale è disponibile su Android, ossia copra:

  • ACTION_RECOGNIZE_ DISCORSO
  • ACTION_WEB_SEARCH
  • RecognitionService

e utilizza i server di riconoscimento vocale open source.

+1

Non capisco perché dovrei creare una nuova attività. Attualmente ho un'attività ('VoiceDemoActivity') che gestisce il riconoscimento vocale predefinito attraverso un oggetto' SpeechRecognizer'. Per poter utilizzare un servizio di riconoscimento vocale personalizzato, devo creare un nuovo oggetto 'SpeechRecognizer' che specifica un oggetto' ComponentName' nel metodo 'createSpeechRecognizer': suppongo che questo' ComponentName' dovrebbe fare riferimento al servizio di riconoscimento vocale personalizzato, quindi Ho creato una nuova classe 'RecognitionService'.Perché devo implementare un'altra attività in grado di gestire l'intento 'ACTION_RECOGNIZE_SPEECH'? – enzom83

+2

Ho migliorato la mia risposta un po ', forse lo ha reso un po' più chiaro. – Kaarel

+0

@ Kaarel Mi piace molto quello che hai fatto in Kõnele (anche se non conosco la lingua estone). Ho scaricato il codice sorgente da github per imparare dall'esempio come implementare il mio (solo in inglese) ma non sarebbe stato costruito fuori dalla scatola e l'app rilasciata stessa (scaricata da Google Play) rimane bloccata in * "Transcribing. .. "*. Dove posso imparare di più sulla struttura del tuo codice (3 pacchetti diversi) e * perché * è implementato così com'è? Grazie! – ripopenid

0

Sì, è necessario utilizzare createSpeechRecognizer (contesto Context, ComponentName ServiceComponent)

Problemi correlati