好的,我正在建立一个小应用程序来学习一些语音识别在科特林。我正在经历的问题是,我的EditText没有发布正在说的内容。它返回一个空值。所以当我访问text.text = result?.get(0).tostring()时,它说它必须是可编辑的!
然后我把它改为text.append(Editable.Factory.getInstance().newEditable(result?.get(0).toString())) --我也试过setText,append和text.text
我不明白我的代码在应用程序的null字段中发布editText的位置。我的清单中有正确的权限,下面是我的代码:
MainActivity
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*
class MainActivity : AppCompatActivity() {
private val RQ_SPEECH_REC = 102
private lateinit var mic : Button
private lateinit var text : EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mic = findViewById(R.id.btnMic)
text = findViewById(R.id.etMain)
mic.setOnClickListener {
askSpeechInput()
}
}
@Suppress("DEPRECATION")
@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == RQ_SPEECH_REC && resultCode == Activity.RESULT_OK){
val result = data?.getStringArrayExtra(RecognizerIntent.EXTRA_RESULTS)
if(text.length() >= 0){
text.append(text.editableText.toString() + result?.get(0).toString())
}else{
text.setText(result?.get(0).toString())
}
// text.append(Editable.Factory.getInstance().newEditable(result?.get(0).toString()))
}
}
@Suppress("DEPRECATION")
private fun askSpeechInput() {
if (!SpeechRecognizer.isRecognitionAvailable(this)){
Toast.makeText(this, "Speech is Not Available", Toast.LENGTH_SHORT).show()
}else{
val i = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
i.putExtra(RecognizerIntent.EXTRA_PROMPT, "Begin Speaking")
startActivityForResult(i, RQ_SPEECH_REC)
}
}
}我正在学科特林语的概念。然而,这个应用程序,将用作打字源和语音识别源,以键入文件。我已经在C#上建立了无数的演讲,但是我想学习Kotlin的演讲来扩展我的应用程序和知识,我已经花了3个多小时尝试不同的方法。我甚至使用了TextView,并出现了相同的结果。任何帮助都是非常感谢的。
这也是结果:



发布于 2022-11-18 00:44:43
好的,经过一些测试和转换,我终于得到了解决方案。当您调用Google时,您必须将其设置为Array。然后将Array拉到编辑文本。因此,下面的代码是正确的方式,使用演讲文本,并附加新的文本序列,以及已经说的。我也赞扬温斯顿指出了正确的方向。这不是确切的密码,但它打开了我的眼睛正确的可能性。
Mainifest
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>MainActivity.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.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintEditText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:padding="5dp"
app:layout_constraintBottom_toTopOf="@+id/constraintMic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<EditText
android:id="@+id/etMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/text_outline"
android:text=""
android:gravity="start"
android:hint="Text Goes Here"
android:inputType="textMultiLine"
android:textSize="15sp"
android:padding="10dp"
android:scrollbarAlwaysDrawVerticalTrack="true"
tools:ignore="Autofill" />
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintMic"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginBottom="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/btnMic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/round_button_mic"
android:text="Start"
app:icon="@drawable/ic_baseline_mic_none_24"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>MainActivity
import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.speech.RecognizerIntent
import android.speech.SpeechRecognizer
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : AppCompatActivity() {
private val RQ_SPEECH_REC = 102
private lateinit var mic : Button
lateinit var text : EditText
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mic = findViewById(R.id.btnMic)
text = findViewById(R.id.etMain)
mic.setOnClickListener {
askSpeechInput()
}
}
@Suppress("DEPRECATION")
@Deprecated("Deprecated in Java")
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if ((requestCode == RQ_SPEECH_REC) && (resultCode == Activity.RESULT_OK && data != null)){
val res: ArrayList<String> =
data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) as ArrayList<String>
if (text.text.length >= 0)
{
text.append(" " + res[0])
}else {
text.setText(Objects.requireNonNull(res)[0])
}
}
}
@Suppress("DEPRECATION")
private fun askSpeechInput() {
if (!SpeechRecognizer.isRecognitionAvailable(this)){
Toast.makeText(this, "Speech is Not Available",
Toast.LENGTH_SHORT).show()
}else{
val i = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM)
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault())
i.putExtra(RecognizerIntent.EXTRA_PROMPT, "Begin Speaking")
startActivityForResult(i, RQ_SPEECH_REC)
}
}
}这样,您可以更改UI一些和添加更多的功能,您也可以编辑文本和添加文本通过键入,以及使用声音。
发布于 2022-11-16 19:12:30
您可能希望看到这个示例:
public void onResults(Bundle results) {
ArrayList data =
results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
float[] confidence = results.getFloatArray(SpeechRecognizer.CONFIDENCE_SCORES);出发地:https://gist.github.com/alexschoeberl/d84ce738e353b5e1bd38
https://stackoverflow.com/questions/74465409
复制相似问题