2011-04-18 9 views
5

Ho cercato di seguire the example in this post.Utilizzo dell'API SpeechRecognizer direttamente - onResults() continua a restituire null

Poiché non sto cercando di implementarlo in un servizio ma piuttosto in un'attività standard, non ho riscontrato i problemi descritti in the aforementioned post.

Continuo a ricevere, tuttavia, "Nessun risultato vocale" - come implementato in quel post, quando getStringArrayList (RecognizerIntent.EXTRA_RESULTS) restituisce null.

Chiaramente, mi manca someting in quello che deve essere fatto in aggiunta a

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

Che cosa mi manca?

È possibile che oltre a startListening() sia necessario avviareActivityForResult()? Se è così, ho già provato questo, ma ha invocato l'intera attività di ricerca vocale di Google (che è quello che sto cercando di evitare, proprio come @vladimir.vivien ha scritto here). Ciò crea ancora più problemi a causa di 2 riconoscitori in esecuzione contemporaneamente ...

All'inizio ho pensato che mancasse effettivamente l'invio ai server di Google, ma quando esamino l'output di LogCat dall'inizio della sessione di riconoscimento vocale fino alla sua fine (vedi sotto), vedo che crea effettivamente una sessione TCP con http://www.google.com/m/voice-search.

Quindi la domanda ovvia è che cosa mi manca?

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. 

risposta

2

Secondo the documentation of the listener è necessario richiedere i risultati con SpeechRecognizer.RESULTS_RECOGNITION dal fascio dato a onResults(). Hai provato?

RecognizerIntent.EXTRA_RESULTS deve essere utilizzato quando si utilizza l'intento RECOGNIZE_SPEECH.

+0

Grazie per aver segnalato questo. Ho sicuramente perso questo. – srf

0

Non rispondo direttamente alla domanda, ma consiglio di provare a utilizzare la funzionalità desiderata in un modo diverso.

vedere il commento di satur9nine. Perché è necessario scrivere una classe speechrecognizer? L'altro ragazzo stava cercando di farlo come un servizio, ma dal momento che lo stai facendo da un'attività, puoi facilmente licenziare un intento. Questo ti farà risparmiare un tonnellata di sforzi.

Qui ci sono due link api tutorial da Google (im solo reinserire):

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

punti suggerimento di satur9nine all'implementazione basata su Voice Search ** ** di attività. È troppo facile. ;-) – srf

0

questo codice funziona perfettamente:

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

solo lui testare

Problemi correlati