Bagaimana saya bisa menggunakan pengenalan suara tanpa dialog yang mengganggu di ponsel android


124

Apakah ini mungkin tanpa mengubah API android? Saya telah menemukan artikel tentang ini. Ada satu komentar yang harus saya lakukan modifikasi pada API android. Tetapi tidak disebutkan bagaimana cara melakukan modifikasi. Adakah yang bisa memberi saya beberapa saran tentang bagaimana melakukan itu? Terima kasih!


Saya telah menemukan artikel ini; SpeechRecognizer Kebutuhannya hampir sama dengan kebutuhan saya. Ini adalah referensi yang bagus untuk saya!


Saya benar-benar punya masalah ini terpecahkan.
Saya mencari di Google kode contoh yang dapat digunakan dari situs web China ini. Ini kode sumber saya

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

Pastikan untuk menghapus Log yang mengganggu setelah debugging!


1
Itu pasti mungkin untuk dilakukan, karena saya telah melihat aplikasi lain melakukannya (Suara tak terbatas) tetapi untuk bagaimana, saya tidak tahu. Saya membayangkan Anda bisa mulai dengan mengunduh sumber android dan memeriksa api di mana suaranya, dan kemudian bereksperimen dengan memperluas ...
Eric

1
seperti dicatat oleh Femi, pastikan untuk memiliki <uses-permission android:name="android.permission.RECORD_AUDIO" />file AndroidManifest.xml Anda jika tidak SpeechRecognizer tidak akan mengambil audio apa pun
nommer

Jawaban:


72

Gunakan antarmuka SpeechRecognizer . Aplikasi Anda harus memiliki izin RECORD_AUDIO, lalu Anda dapat membuat SpeechRecognizer, memberinya RecognitionListener , lalu memanggil startListeningmetodenya. Anda akan mendapatkan panggilan balik ke pendengar saat pengenal ucapan siap untuk mulai mendengarkan ucapan dan saat alat tersebut menerima ucapan dan mengubahnya menjadi teks.


Terima kasih atas saranmu. Saya akan mencoba sekarang
Jim31837

10
juga jangan lupa untuk menghancurkan SpeechRecognier dalam metode OnDestroy () seperti yang disebutkan di sini: stackoverflow.com/a/19931355/2048266 agar tidak mendapatkan has leaked ServiceConnection android.speech.SpeechRecognizer$Connection@414f0e40 that was originally bound herekesalahan
nommer

Bisa tolong tunjukkan saya contoh? Selain itu, dapatkah saya menggunakan ini saat layar mati?
Ruchir Baronia

7

GAST memiliki kelas abstrak praktis yang dapat Anda gunakan untuk menggunakan SpeechRecognizerkelas dengan kode baru yang sangat sedikit. Ada juga contoh menjalankan layanan SpeechRecognizersebagai latar belakang menggunakan ini dan ini


Maukah Anda membimbing saya tentang cara menerapkannya ke dalam MainActivity? Apa artinya "* Gunakan {@link Intent} untuk memulai dan menghentikannya?" Terima kasih banyak
Dante

Bisa tolong tunjukkan saya contoh? Selain itu, dapatkah saya menggunakan ini saat layar mati?
Ruchir Baronia

6

Terima kasih telah memposting ini! Saya merasa terbantu untuk mendefinisikan pendengar onclick di 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

Saya akhirnya membuat proyek Github untuk mengonversi Teks ke ucapan dan ucapan ke teks tanpa dialog yang mengganggu,

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

    })

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.