2012-04-03 3 views
7

Я создал простую службу распознавания речи: для этой цели я создал подкласс android.speech.RecognitionService, и я создал действие для запуска и остановки этой службы.Как зарегистрировать пользовательскую услугу распознавания речи?

Моя обычная служба распознавания речи тривиально использует распознаватель речи по умолчанию, потому что моя цель - просто понять, как работают классы .

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 внутри папки 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> 

Затем я установил это приложение на Android в устройстве, и я начинаю его: - когда я запустить службу, он начинает правильно; - когда я его останавливаю, он останавливается должным образом.

Но если я запустил следующий код в другом действии, то activitiesList содержит только элемент, который является распознавателем речи по умолчанию.

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

Почему мой распознаватель речи не возвращается среди присутствующих в системе?

+1

это дает нам возможность переопределить 'Google Now' по умолчанию RecognitionService ли? Я имею в виду, могу ли я подключить мою расширенную службу распознавания для google сейчас? –

+1

Было ли ваше onStartListening начато работать при запуске службы 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_ SPEECH
  • ACTION_WEB_SEARCH
  • RecognitionService

и использует с открытым исходным кодом сервера распознавания речи.

+1

Я не понимаю, почему я должен создать новую деятельность. В настоящее время у меня есть активность ('VoiceDemoActivity'), которая обрабатывает распознаватель речи по умолчанию через объект' SpeechRecognizer'. Чтобы использовать пользовательскую услугу распознавания голоса, мне нужно создать новый объект 'SpeechRecognizer', определяющий объект' ComponentName' в методе 'createSpeechRecognizer': я полагаю, что это' ComponentName' должно относиться к службе пользовательского голосового распознавания, поэтому Я создал новый класс «RecognitionService».Зачем мне нужно реализовать другое действие, которое может обрабатывать намерение 'ACTION_RECOGNIZE_SPEECH'? – enzom83

+2

Я немного улучшил свой ответ, возможно, это немного улучшило его. – Kaarel

+0

@ Kaarel Мне очень нравится то, что вы сделали в Kõnele (хотя я не знаю эстонский язык). Я загрузил исходный код из github, чтобы узнать на примере, как реализовать свой собственный (только на английском языке), но он не будет построен из коробки, и само выпущенное приложение (загруженное из Google Play) застрянет в * «Transcribing. .. "*. Где я могу узнать больше о структуре вашего кода (3 разных пакета) и * почему * он реализован так, как есть? Благодаря! – ripopenid

0

Да, вам нужно использовать createSpeechRecognizer (контекст Context, ComponentName serviceComponent)

Смежные вопросы