2011-04-18 14 views
5

He estado tratando de seguir the example in this post.Usando SpeechRecognizer API directamente - onResults() sigue devolviendo nulo

Como no estoy tratando de implementar esto en un servicio, sino en una actividad estándar, no he experimentado los problemas descritos en the aforementioned post.

Sigo recibiendo, sin embargo, "No hay resultados de voz" - como se implementó en esa publicación, cuando getStringArrayList (RecognizerIntent.EXTRA_RESULTS) devuelve nulo.

Claramente, me falta calle detrás de lo que hay que hacer además a

recognizer.setRecognitionListener(listener); 
recognizer.startListening(intent);  

¿Qué me falta?

¿Es posible que además de startListening() también tenga que iniciarActivityForResult()? Si es así, ya intenté esto, pero invocó la actividad completa de Búsqueda por voz de Google (que es lo que trato de evitar, al igual que @ vladimir.vivien, escribió here). Esto crea aún más problemas debido a que 2 reconocedores funcionan al mismo tiempo ...

Al principio pensé que lo que faltaba era el envío real a los servidores de Google, pero cuando examiné la salida LogCat desde el inicio de la sesión de reconocimiento de voz hasta su final (ver a continuación), veo que realmente crea una sesión TCP con http://www.google.com/m/voice-search.

Entonces la pregunta obvia es ¿qué me estoy perdiendo?

04-18 07:02:17.770: INFO/RecognitionController(623): startRecognition(#Intent;action=android.speech.action.RECOGNIZE_SPEECH;S.android.speech.extra.LANGUAGE_MODEL=free_form;S.android.speech.extra.PROMPT=LEARNSR;S.calling_package=com.example.learnsr.SrActivity;end) 
04-18 07:02:17.770: INFO/RecognitionController(623): State change: STARTING -> STARTING 
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Switching audio device to 
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Speakerphone 
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): AudioHardware PCM record is going to standby. 
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Switching audio device to 
04-18 07:02:17.780: DEBUG/AudioHardwareQSD(121): Speakerphone 
04-18 07:02:17.780: INFO/AudioHardwareQSD(121): AudioHardware PCM record is going to standby. 
04-18 07:02:17.780: INFO/AudioService(164): AudioFocus requestAudioFocus() from [email protected] 
04-18 07:02:17.780: DEBUG/AudioFlinger(121): setParameters(): io 3, keyvalue routing=262144;vr_mode=1, tid 155, calling tid 121 
04-18 07:02:17.790: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:17.790: INFO/AudioHardwareQSD(121): do input routing device 40000 
04-18 07:02:17.790: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:17.790: INFO/RecognitionController(623): State change: STARTING -> RECOGNIZING 
04-18 07:02:17.790: INFO/ServerConnectorImpl(623): Starting TCP session, url=http://www.google.com/m/voice-search 
04-18 07:02:17.930: DEBUG/ServerConnectorImpl(623): Created session a7918495c042db1746d3e09514baf621 
04-18 07:02:17.930: INFO/ServerConnectorImpl(623): Creating TCP connection to 74.125.115.126:19294 
04-18 07:02:17.980: DEBUG/AudioHardwareQSD(121): Switching audio device to 
04-18 07:02:17.980: DEBUG/AudioHardwareQSD(121): Speakerphone 
04-18 07:02:18.070: INFO/ServerConnectorImpl(623): startRecognize RecognitionParameters{session=a7918495c042db1746d3e09514baf621,request=1} 
04-18 07:02:18.390: INFO/RecognitionController(623): onReadyForSpeech, noise level:10.29969, snr:-0.42756215 
04-18 07:02:19.760: DEBUG/dalvikvm(659): GC_EXPLICIT freed 5907 objects/353648 bytes in 67ms 
04-18 07:02:21.030: INFO/AudioHardwareQSD(121): AudioHardware pcm playback is going to standby. 
04-18 07:02:24.090: INFO/RecognitionController(623): onBeginningOfSpeech 
04-18 07:02:24.760: DEBUG/dalvikvm(669): GC_EXPLICIT freed 1141 objects/74296 bytes in 48ms 
04-18 07:02:25.080: INFO/RecognitionController(623): onEndOfSpeech 
04-18 07:02:25.080: INFO/AudioService(164): AudioFocus abandonAudioFocus() from [email protected] 
04-18 07:02:25.140: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:25.200: INFO/RecognitionController(623): State change: RECOGNIZING -> RECOGNIZED 
04-18 07:02:25.200: INFO/RecognitionController(623): Final state: RECOGNIZED 
04-18 07:02:25.260: INFO/ServerConnectorImpl(623): ClientReport{session_id=a7918495c042db1746d3e09514baf621,request_id=1,application_id=intent-speech-api,client_perceived_request_status=0,request_ack_latency_ms=118,total_latency_ms=7122,user_perceived_latency_ms=116,network_type=1,endpoint_trigger_type=3,} 
04-18 07:02:25.260: INFO/AudioService(164): AudioFocus abandonAudioFocus() from [email protected] 
04-18 07:02:25.270: DEBUG/AudioHardwareQSD(121): Switching audio device to 
04-18 07:02:25.270: DEBUG/AudioHardwareQSD(121): Speakerphone 
04-18 07:02:25.270: INFO/RecognitionController(623): State change: RECOGNIZED -> PAUSED 
04-18 07:02:25.270: INFO/AudioService(164): AudioFocus abandonAudioFocus() from [email protected] 
04-18 07:02:25.270: INFO/ClientReportSender(623): Sending 1 client reports over HTTP 
04-18 07:02:25.280: INFO/AudioHardwareQSD(121): AudioHardware PCM record is going to standby. 
04-18 07:02:25.280: DEBUG/AudioFlinger(121): setParameters(): io 3, keyvalue routing=0, tid 155, calling tid 121 
04-18 07:02:25.280: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:25.280: INFO/AudioHardwareQSD(121): Routing audio to Speakerphone 
04-18 07:02:25.280: DEBUG/AudioHardwareQSD(121): Switching audio device to 
04-18 07:02:25.280: DEBUG/AudioHardwareQSD(121): Speakerphone 
04-18 07:02:25.280: INFO/AudioHardwareQSD(121): AudioHardware PCM record is going to standby. 

Respuesta

2

Según the documentation of the listener necesita solicitar los resultados con SpeechRecognizer.RESULTS_RECOGNITION desde el haz dado a onResults(). ¿Has probado eso?

RecognizerIntent.EXTRA_RESULTS se debe utilizar cuando se utiliza RECOGNIZE_SPEECH intento.

+0

Gracias por señalar esto. Definitivamente me lo perdí. – srf

0

No estoy respondiendo su pregunta directamente, pero le recomiendo que trate de obtener la funcionalidad deseada de otra manera.

ver el comentario de satur9nine. ¿Por qué necesita escribir una clase de reconocimiento de voz? El otro tipo estaba tratando de hacerlo como un servicio, pero como lo estás haciendo a partir de una actividad, puedes disparar fácilmente un intento. Esto te ahorrará un montón de esfuerzo.

Aquí hay dos enlaces API tutorial de Google (im simplemente volver a colocar):

http://developer.android.com/resources/articles/speech-input.html

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/VoiceRecognition.html

+0

puntos sugerencia de satur9nine de aplicación basado en la actividad de búsqueda por voz ** **. Es demasiado fácil. ;-) – srf

0

este código de trabajo a la perfección:

package com.example.android.voicerecognitionservice; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.os.Bundle; 
import android.speech.RecognitionListener; 
import android.speech.RecognizerIntent; 
import android.speech.SpeechRecognizer; 
import android.widget.TextView; 
import android.widget.Toast; 

public class VoiceRecognitionSettings extends Activity implements RecognitionListener { 
    /** Text display */ 
    private TextView blurb; 

    /** Parameters for recognition */ 
    private Intent recognizerIntent; 

    /** The ear */ 
    private SpeechRecognizer recognizer; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.speech); 

    blurb = (TextView) findViewById(R.id.text1); 

    // muteSystemAudio(); 

    recognizer = SpeechRecognizer.createSpeechRecognizer(this); 
    recognizer.setRecognitionListener(this); 

    recognizerIntent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, "com.example.android.voicerecognitionservice"); 
    recognizerIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true); 

    recognizer.startListening(recognizerIntent); 
    } 

    @Override 
    public void onBeginningOfSpeech() { 
    blurb.append("["); 
    } 

    @Override 
    public void onBufferReceived(byte[] arg0) { 
    } 

    @Override 
    public void onEndOfSpeech() { 
    blurb.append("] "); 
    } 

    @Override 
    public void onError(int arg0) { 
    } 

    @Override 
    public void onEvent(int arg0, 
         Bundle arg1) { 
    } 

    @Override 
    public void onPartialResults(Bundle arg0) { 
    } 

    @Override 
    public void onReadyForSpeech(Bundle arg0) { 
    blurb.append("> "); 
    } 

@Override 
    public void onResults(Bundle bundle) { 
    ArrayList<String> results = bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
    blurb.append(results.toString() + "\n"); 

// if (results!=null){ 
//  Toast.makeText(VoiceRecognitionSettings.this,results.toString()+"55", Toast.LENGTH_LONG).show(); 
// 
// }else{ 
//  Toast.makeText(VoiceRecognitionSettings.this,"vide", Toast.LENGTH_LONG).show(); 
// 
// } 
    recognizer.startListening(recognizerIntent); 


    } 

    @Override 
    public void onRmsChanged(float arg0) { 
    } 

    public void muteSystemAudio(){ 
     AudioManager amanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE); 
     amanager.setStreamMute(AudioManager.STREAM_SYSTEM, true); 
    } 
} 

acaba de ponerlo a prueba

Cuestiones relacionadas