Come posso utilizzare il riconoscimento vocale senza il fastidioso dialogo nei telefoni Android


124

È possibile senza modificare le API Android? Ho trovato un articolo su questo. C'è un commento che dovrei apportare modifiche alle API Android. Ma non diceva come fare la modifica. Qualcuno può darmi qualche suggerimento su come farlo? Grazie!


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


Ho completamente risolto questo problema.
Ho cercato su Google un codice di esempio utilizzabile da questo sito Web cinese. 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");
            }
   }
}

Assicurati di eliminare i fastidiosi log dopo il debug!


1
È sicuramente possibile, come ho visto farlo in altre app (Voice infinity) ma per quanto riguarda come, non ho la più pallida idea. Immagino che potresti iniziare scaricando la sorgente Android e controllando l'API in cui si trova la voce, quindi sperimentare l'estensione ...
Eric

1
come notato da Femi, assicurati di avere <uses-permission android:name="android.permission.RECORD_AUDIO" />nel tuo file AndroidManifest.xml altrimenti SpeechRecognizer non rileverà alcun audio
nommer

Risposte:


72

Usa l' interfaccia SpeechRecognizer . La tua app deve avere l'autorizzazione RECORD_AUDIO e puoi quindi creare un SpeechRecognizer, assegnargli un RecognitionListener e quindi chiamare il suo startListeningmetodo. Riceverai una richiamata per l'ascoltatore quando il riconoscimento vocale è pronto per iniziare ad ascoltare il parlato e quando riceve il parlato e lo converte in testo.


Grazie per il tuo consiglio. Proverò ora
Jim31837

10
inoltre, non dimenticare di distruggere SpeechRecognier nel metodo OnDestroy () come indicato qui: stackoverflow.com/a/19931355/2048266 per non ottenere has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound hereerrori
nommer

Puoi mostrarmi un esempio? Inoltre, posso usarlo mentre lo schermo è spento?
Ruchir Baronia

7

GAST ha una pratica classe astratta che puoi usare per usare la SpeechRecognizerclasse con pochissimo codice nuovo. C'è anche un esempio di esecuzione di SpeechRecognizercome servizio in background usando questo e questo


Ti dispiacerebbe guidarmi su come implementarli in MainActivity? Cosa significa "* Usa {@link Intent} per avviarlo e interromperlo?" Grazie mille
Dante

Puoi mostrarmi un esempio? Inoltre, posso usarlo mentre lo schermo è spento?
Ruchir Baronia

6

Grazie per aver postato questo! Ho trovato utile 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);
        }
    });     
}

4

Finisco per creare un progetto Github per convertire il testo in parlato e il parlato in testo senza fastidiosi dialoghi,

https://github.com/hiteshsahu/Android-TTS-STT/tree/master/app/src/main/java/com/hiteshsahu/stt_tts/translation_engine

 //SPEECH TO TEXT DEMO
    speechToText.setOnClickListener({ view ->

        Snackbar.make(view, "Speak now, App is listening", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show()

        TranslatorFactory
                .instance
                .with(TranslatorFactory.TRANSLATORS.SPEECH_TO_TEXT,
                        object : ConversionCallback {
                            override fun onSuccess(result: String) {
                                sttOutput.text = result
                            }

                            override fun onCompletion() {
                            }

                            override fun onErrorOccurred(errorMessage: String) {
                                erroConsole.text = "Speech2Text Error: $errorMessage"
                            }

                        }).initialize("Speak Now !!", this@HomeActivity)

    })


    //TEXT TO SPEECH DEMO
    textToSpeech.setOnClickListener({ view ->

        val stringToSpeak :String = ttsInput.text.toString()

        if (null!=stringToSpeak &&  stringToSpeak.isNotEmpty()) {

            TranslatorFactory
                    .instance
                    .with(TranslatorFactory.TRANSLATORS.TEXT_TO_SPEECH,
                            object : ConversionCallback {
                                override fun onSuccess(result: String) {
                                }

                                override fun onCompletion() {
                                }

                                override fun onErrorOccurred(errorMessage: String) {
                                    erroConsole.text = "Text2Speech Error: $errorMessage"
                                }

                            })
                    .initialize(stringToSpeak, this)

        } else {
            ttsInput.setText("Invalid input")
            Snackbar.make(view, "Please enter some text to speak", Snackbar.LENGTH_LONG).show()
        }

    })

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.