Непрерывное распознавание речи в Android - PullRequest
0 голосов
/ 08 апреля 2020

Когда я начинаю свою деятельность или фрагмент, я хочу начать распознавание речи, и когда пользователь говорит, и если оно соответствует какой-либо строке, то результат будет отображаться. После результата он должен снова начать распознавать

Вот код, который я пробовал. Он запускается нажатием одной кнопки, и когда пользователь не говорит, он генерирует ошибку, и после этого он не распознает ничего, пока я не начну снова, нажав кнопку.

Я знаю, что выше - это случай по умолчанию для распознавания речи, но как Могу ли я делать непрерывно?

Activity_main. xml

    <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/speak"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="?selectableItemBackground"
        android:src="@android:drawable/ic_btn_speak_now"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

    class MainActivity : AppCompatActivity() {

    private lateinit var mSpeechRecognizer: SpeechRecognizer
    private lateinit var mSpeechRecognizerIntent: Intent
    private var mIslistening = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        speak.setOnClickListener {
            mIslistening = true;
            mSpeechRecognizer.stopListening()
            val listener: SpeechRecognitionListener = SpeechRecognitionListener()
            mSpeechRecognizer.setRecognitionListener(listener)
            mSpeechRecognizer.startListening(mSpeechRecognizerIntent)

        }
        speechToText()
    }

    override fun onDestroy() {
        super.onDestroy()
        if (mSpeechRecognizer != null) {
            mSpeechRecognizer.destroy()
        }
    }

    private fun speechToText() {
        mSpeechRecognizer = SpeechRecognizer.createSpeechRecognizer(this)
        mSpeechRecognizerIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
        mSpeechRecognizerIntent.putExtra(
            RecognizerIntent.EXTRA_LANGUAGE_MODEL,
            RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
        )
        mSpeechRecognizerIntent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE, this.packageName)

    }


    inner class SpeechRecognitionListener() : RecognitionListener {

        override fun onBeginningOfSpeech() {
        }

        override fun onBufferReceived(buffer: ByteArray) {}
        override fun onEndOfSpeech() {
            Log.e("TAG", "onEndOfSpeech");
        }

        override fun onError(error: Int) {

            Log.d("TAG", "error = $error");
        }

        override fun onEvent(eventType: Int, params: Bundle) {}
        override fun onPartialResults(partialResults: Bundle) {}
        override fun onReadyForSpeech(params: Bundle) {
            Log.d("TAG", "onReadyForSpeech") //$NON-NLS-1$
        }

        override fun onResults(results: Bundle) {
            //Log.d(TAG, "onResults"); //$NON-NLS-1$
            val matches = results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
            matches?.let {
                if (matches.isNotEmpty()) {
                    text.text = matches[0].toString()
                    Log.e("Test", matches[0].toString());
                }
            }

            // matches are the return values of speech recognition engine
            // Use these values for whatever you wish to do
        }

        override fun onRmsChanged(rmsdB: Float) {}
    }
}
...