首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用EditText对文本的语音转换

使用EditText对文本的语音转换
EN

Stack Overflow用户
提问于 2022-11-16 18:22:46
回答 2查看 32关注 0票数 0

好的,我正在建立一个小应用程序来学习一些语音识别在科特林。我正在经历的问题是,我的EditText没有发布正在说的内容。它返回一个空值。所以当我访问text.text = result?.get(0).tostring()时,它说它必须是可编辑的!

然后我把它改为text.append(Editable.Factory.getInstance().newEditable(result?.get(0).toString())) --我也试过setTextappendtext.text

我不明白我的代码在应用程序的null字段中发布editText的位置。我的清单中有正确的权限,下面是我的代码:

MainActivity

代码语言:javascript
复制
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,并出现了相同的结果。任何帮助都是非常感谢的。

这也是结果:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-18 00:44:43

好的,经过一些测试和转换,我终于得到了解决方案。当您调用Google时,您必须将其设置为Array。然后将Array拉到编辑文本。因此,下面的代码是正确的方式,使用演讲文本,并附加新的文本序列,以及已经说的。我也赞扬温斯顿指出了正确的方向。这不是确切的密码,但它打开了我的眼睛正确的可能性。

Mainifest

代码语言:javascript
复制
 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.RECORD_AUDIO"/>

MainActivity.xml

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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一些和添加更多的功能,您也可以编辑文本和添加文本通过键入,以及使用声音。

票数 0
EN

Stack Overflow用户

发布于 2022-11-16 19:12:30

您可能希望看到这个示例:

代码语言:javascript
复制
  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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74465409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档