2013-08-07 13 views
5

Próbuję uruchomić rozpoznawanie głosu w systemie Android jako usługę. Mogę zweryfikować, że metody onCreate() i onStart() usługi są wywoływane, ale nie są wywoływane żadne wywołania zwrotne do metod rozpoznawania mowy, pomimo faktu, że poprawnie skonfigurowałem obiekt SpeechRecognizer. Rozpoznawanie mowy wydaje się działać, gdy jest wykonywane w działaniu zamiast w usłudze. Jak sprawić, by działał jako usługa? Czy to jest oczywisty problem?Jak korzystać z usługi Android SpeechRecognizer jako usługi?

package net.viralpatel.android.speechtotextdemo; 

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 

import android.app.Service; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.speech.RecognitionListener; 
import android.speech.RecognizerIntent; 
import android.speech.SpeechRecognizer; 
import android.util.Log; 
import android.widget.Toast; 

public class MyService extends Service implements RecognitionListener { 
    private SpeechRecognizer speechRecognizer; 
    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
     Log.d("tag", "onCreate"); 
     speechRecognizer = SpeechRecognizer.createSpeechRecognizer(getApplicationContext()); 
     speechRecognizer.setRecognitionListener(this); 

     Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
     intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
       RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH); 

     speechRecognizer.startListening(intent); 
    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
     Log.d("tag", "onDestroy"); 
    } 

    @Override 
    public void onStart(Intent intent, int startid) { 
     Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     Log.d("tag", "onStart"); 
    } 

    @Override 
    public void onBeginningOfSpeech() { 
     Log.d("Speech", "onBeginningOfSpeech"); 
    } 

    @Override 
    public void onBufferReceived(byte[] buffer) { 
     Log.d("Speech", "onBufferReceived"); 
    } 

    @Override 
    public void onEndOfSpeech() { 
     Log.d("Speech", "onEndOfSpeech"); 
    } 

    @Override 
    public void onError(int error) { 
     Log.d("Speech", "onError"); 
    } 

    @Override 
    public void onEvent(int eventType, Bundle params) { 
     Log.d("Speech", "onEvent"); 
    } 

    @Override 
    public void onPartialResults(Bundle partialResults) { 
     Log.d("Speech", "onPartialResults"); 
    } 

    @Override 
    public void onReadyForSpeech(Bundle params) { 
     Log.d("Speech", "onReadyForSpeech"); 
    } 

    @Override 
    public void onResults(Bundle results) { 
     Log.d("Speech", "onResults"); 
     ArrayList strlist = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
     for (int i = 0; i < strlist.size();i++) { 
     Log.d("Speech", "result=" + strlist.get(i)); 
     } 
     BufferedWriter out; 
    try { 
     out = new BufferedWriter(new FileWriter("mnt/sdcard/results.txt")); 
//  out.write(processor.execute(strlist.get(0).toString())); 
      out.write("hello world"); 
    } catch (IOException e) { 
     Log.e("Speech",e.toString()); 
    } 
    } 

    @Override 
    public void onRmsChanged(float rmsdB) { 
     Log.d("Speech", "onRmsChanged"); 
    } 
} 
+1

Czy szukałeś w StackOverflow przed zadaniem pytania? :) - http://stackoverflow.com/questions/9997720/how-to-register-a-custom-speech-recognition-service - http://stackoverflow.com/questions/14940657/android-speech-recognition-as -a-service-on-android-4-1-4-2 - [Przykład: SpeechActivationService.java] (https://github.com/gast-lib/gast-lib/blob/master/library/src/root /gast/speech/activation/SpeechActivationService.java "Przykładowy kod źródłowy") – Organ

Odpowiedz

0

Są dwie rzeczy, które moim zdaniem wymagają wyjaśnienia i mogą stanowić rozwiązanie tymczasowe.

  1. Czy zadeklarowano usługę w manifeście? Sądzę, że to już zostało rozwiązane.

  2. Rozpoznawanie mowy nie może rozpocząć się od "onCreate" usługi. Zrobiłem podobną implementację, ale nie zadziałało. Możesz spróbować umieścić startListening (intent) w innej metodzie i wywołać ją jawnie. To działało dla mnie.

Daj mi znać, jeśli to pomoże.

Powiązane problemy