2011-06-11 9 views
113

È possibile senza modificare le API di Android? Ho trovato un articolo su questo. C'è un commento sul fatto che dovrei apportare modifiche alle API di Android. Ma non ha detto come fare la modifica. Qualcuno può darmi qualche suggerimento su come farlo? Grazie!Come posso utilizzare il riconoscimento vocale senza la fastidiosa finestra di dialogo nei telefoni Android


Ho trovato questo articolo; SpeechRecognizer I suoi bisogni sono quasi gli stessi del mio. È un buon riferimento per me!


Ho risolto completamente questo problema.
I Googled un codice di esempio utilizzabile from this China website Ecco il mio codice sorgente

package voice.recognition.test; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.speech.RecognitionListener; 
import android.speech.RecognizerIntent; 
import android.speech.SpeechRecognizer; 
import android.widget.Button; 
import android.widget.TextView; 
import java.util.ArrayList; 
import android.util.Log; 



public class voiceRecognitionTest extends Activity implements OnClickListener 
{ 

    private TextView mText; 
    private SpeechRecognizer sr; 
    private static final String TAG = "MyStt3Activity"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      Button speakButton = (Button) findViewById(R.id.btn_speak);  
      mText = (TextView) findViewById(R.id.textView1);  
      speakButton.setOnClickListener(this); 
      sr = SpeechRecognizer.createSpeechRecognizer(this);  
      sr.setRecognitionListener(new listener());   
    } 

    class listener implements RecognitionListener   
    { 
      public void onReadyForSpeech(Bundle params) 
      { 
        Log.d(TAG, "onReadyForSpeech"); 
      } 
      public void onBeginningOfSpeech() 
      { 
        Log.d(TAG, "onBeginningOfSpeech"); 
      } 
      public void onRmsChanged(float rmsdB) 
      { 
        Log.d(TAG, "onRmsChanged"); 
      } 
      public void onBufferReceived(byte[] buffer) 
      { 
        Log.d(TAG, "onBufferReceived"); 
      } 
      public void onEndOfSpeech() 
      { 
        Log.d(TAG, "onEndofSpeech"); 
      } 
      public void onError(int error) 
      { 
        Log.d(TAG, "error " + error); 
        mText.setText("error " + error); 
      } 
      public void onResults(Bundle results)     
      { 
        String str = new String(); 
        Log.d(TAG, "onResults " + results); 
        ArrayList data = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION); 
        for (int i = 0; i < data.size(); i++) 
        { 
           Log.d(TAG, "result " + data.get(i)); 
           str += data.get(i); 
        } 
        mText.setText("results: "+String.valueOf(data.size()));   
      } 
      public void onPartialResults(Bundle partialResults) 
      { 
        Log.d(TAG, "onPartialResults"); 
      } 
      public void onEvent(int eventType, Bundle params) 
      { 
        Log.d(TAG, "onEvent " + eventType); 
      } 
    } 
    public void onClick(View v) { 
      if (v.getId() == R.id.btn_speak) 
      { 
       Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);   
       intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); 
       intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test"); 

       intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,5); 
        sr.startListening(intent); 
        Log.i("111111","11111111"); 
      } 
    } 
} 

Assicurarsi di eliminare i registri fastidiosi dopo il debug!

+1

È sicuramente possibile farlo, come ho visto altre app lo fanno (Voice infinity) ma per quanto riguarda, non ne ho idea.Immagino che potresti iniziare scaricando la sorgente Android e verificando l'api dove si trova la voce, e quindi sperimentare estendendo ... – Eric

+1

come notato da Femi, assicurati di avere '' nel tuo file AndroidManifest.xml altrimenti SpeechRecognizer non prenderà alcun audio – nommer

risposta

63

Utilizzare l'interfaccia SpeechRecognizer. La tua app deve avere l'autorizzazione RECORD_AUDIO, puoi quindi creare un SpeechRecognizer, dargli un RecognitionListener e quindi chiamare il suo metodo startListening. Otterrai le richiamate all'ascoltatore quando il riconoscimento vocale è pronto per iniziare ad ascoltare la voce e mentre riceve il discorso e lo converte in testo.

+0

Grazie per il tuo consiglio. Proverò ora – Jim31837

+9

inoltre non dimenticare di distruggere SpeechRecognier nel metodo OnDestroy() come indicato qui: http://stackoverflow.com/a/19931355/2048266 per non ottenere 'ha fatto trapelare ServiceConnection android.speech.SpeechRecognizer $ Connection @ 414f0e40 che era stato originariamente associato qui Errore – nommer

+0

Puoi per favore mostrarmi un esempio? Inoltre, posso usarlo mentre lo schermo è spento? –

6

GAST ha una classe astratta a portata di mano che è possibile utilizzare per utilizzare la classe SpeechRecognizer con pochissimo nuovo codice. C'è anche un esempio di esecuzione del SpeechRecognizer come servizio in background usando this e this

+0

Ti dispiacerebbe guidarmi su come implementarli nella MainActivity? Che cosa significa "* Utilizzare {@link Intent} s per avviarlo e fermarlo?" Grazie mille – Dante

+0

Puoi per favore mostrarmi un esempio? Inoltre, posso usarlo mentre lo schermo è spento? –

4

Grazie per aver postato questo! Ho trovato utile per definire l'ascoltatore onclick in OnCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mText = (TextView) findViewById(R.id.textView1);  
    MyRecognitionListener listener = new MyRecognitionListener(); 
    sr = SpeechRecognizer.createSpeechRecognizer(this);  
    sr.setRecognitionListener(listener); 

    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) 
     { 
       Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);  
       intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US"); 
       intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS,1); 
       intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,"voice.recognition.test"); 
       sr.startListening(intent); 
     } 
    });  
} 
3

ho ahve cercato di memorizzare tutto il mio apprendimento da TTS e STT in this Github Repo. Se ti piacciono le fodere allora puoi usare il mio progetto.

Ha usato pattern Factory per convertire Discorso al testo in on line, senza fastidiosi dialogo

SpeechToText (STT).

TranslatorFactory.getInstance().getTranslator(TranslatorFactory.TRANSLATOR_TYPE.SPEECH_TO_TEXT, HomeActivity.this) 
            .initialize("Hello There", HomeActivity.this); 

uscita: -

enter image description here

TextToSpeech (TTS)

TranslatorFactory.getInstance().getTranslator(TranslatorFactory.TRANSLATOR_TYPE.TEXT_TO_SPEECH, HomeActivity.this) 
               .initialize((null != message && !message ? message : "Invalid Input"), HomeActivity.this); 

uscita: -

enter image description here

Problemi correlati