Когда я начинаю свою деятельность или фрагмент, я хочу начать распознавание речи, и когда пользователь говорит, и если оно соответствует какой-либо строке, то результат будет отображаться. После результата он должен снова начать распознавать
Вот код, который я пробовал. Он запускается нажатием одной кнопки, и когда пользователь не говорит, он генерирует ошибку, и после этого он не распознает ничего, пока я не начну снова, нажав кнопку.
Я знаю, что выше - это случай по умолчанию для распознавания речи, но как Могу ли я делать непрерывно?
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) {}
}
}