繁体   English   中英

如何在应用程序 class 中启动 TextToSpeech,然后使用 Kotlin 在 android 的另一个活动中使用它?

[英]How can I start the TextToSpeech in application class and then use it in another activity in android using Kotlin?

我正在开发一个在其中一项活动中使用 TextToSpeech 的锻炼应用程序。 但问题是 TextToSpeech 需要很长时间才能开始,所以它完全错过了一个练习,然后它就完美地工作了。 我试图在互联网上寻找解决方案,发现在应用程序 class 中初始化 TextToSpeech 将在应用程序启动时加载到 TextToSpeech,然后它可能工作正常。 问题是我不知道如何在应用程序 class 中初始化 TextToSpeech,然后在我需要它的活动中使用它。我在整个互联网上搜索了这个并没有找到解决方案。 请帮我解决这个问题,我被卡住了。

谢谢你!

这是我使用文本到语音的活动的代码

package khan.sajad.example.letsworkout

import android.content.Intent
import android.os.Bundle
import android.os.CountDownTimer
import android.speech.tts.TextToSpeech
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import khan.sajad.example.letsworkout.data.Exercises
import khan.sajad.example.letsworkout.databinding.ActivityExerciseBinding
import java.util.*

class ExerciseActivity : AppCompatActivity(), TextToSpeech.OnInitListener {
   private lateinit var binding: ActivityExerciseBinding
   private var position = 0
   private var exerciseList = Exercises().loadExercises()

   // Text To speech variable
   private lateinit var textToSpeech: TextToSpeech

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       binding = ActivityExerciseBinding.inflate(layoutInflater)
       setContentView(binding.root)
       setSupportActionBar(binding.exerciseToolbar)
       // enables back button on toolbar
       supportActionBar?.setDisplayHomeAsUpEnabled(true)
       // click-listener to the back button on the toolbar
       binding.exerciseToolbar.setNavigationOnClickListener {
           position = 0
           onBackPressed()
           finish()
       }

       // Starting Text To Speech
       textToSpeech = TextToSpeech(this, this)

       startTimer()
   }

   private fun startTimer(){
       binding.tvTitle.text = getString(R.string.get_ready, exerciseList[position].name)

       // Speak out
       textToSpeech.speak(binding.tvTitle.text, TextToSpeech.QUEUE_FLUSH, null, "")
       
       object : CountDownTimer(10000, 1000) {
           override fun onTick(millisUntilFinished: Long) {
               binding.tvTimer.text = (millisUntilFinished / 1000).toString()
               binding.progressBar.progress = ((millisUntilFinished)/1000).toInt()
           }

           override fun onFinish() {

               setExerciseVisibility()
               startTimer30()
           }
       }.start()
   }

   private fun startTimer30(){
           val exercise = exerciseList[position]
           binding.tvTitle30.text = exercise.name
           showGif(exercise.image)
           object : CountDownTimer(30000, 1000) {
           override fun onTick(millisUntilFinished: Long) {
               binding.tvTimer30.text = (millisUntilFinished / 1000).toString()
               binding.progressBar30.progress = ((millisUntilFinished)/1000).toInt()
           }

           override fun onFinish() {
               position++
               if(position != exerciseList.size){
                   setBreakVisibility()
                   startTimer()
               }
               else{
                   setResultActivity()
               }
           }
       }.start()
   }

   private fun showGif(id: Int) {
       Glide.with(this).load(id).into(binding.ImageView30)
   }
   private fun setExerciseVisibility(){
       binding.frameLayout.visibility = View.GONE
       binding.tvTitle.visibility = View.GONE
       binding.frameLayout30.visibility = View.VISIBLE
       binding.tvTitle30.visibility = View.VISIBLE
       binding.ImageView30.visibility = View.VISIBLE
   }

   private fun setBreakVisibility(){
       binding.frameLayout30.visibility = View.GONE
       binding.tvTitle30.visibility = View.GONE
       binding.ImageView30.visibility = View.GONE
       binding.frameLayout.visibility = View.VISIBLE
       binding.tvTitle.visibility = View.VISIBLE
   }
   private fun setResultActivity(){
       val intent = Intent(this, ResultActivity::class.java)
       startActivity(intent)
       finish()
   }


   // OnIt for text to speech
   override fun onInit(status: Int) {
       if(status == TextToSpeech.SUCCESS){
           val langSet = textToSpeech.setLanguage(Locale.ENGLISH)
           if(langSet == TextToSpeech.LANG_MISSING_DATA || langSet == TextToSpeech.LANG_NOT_SUPPORTED){
               Log.e("TTS", "Unable set the language!")
           }
       }
       else{
           Log.e("TTS", "Failed to start Text to speech")
       }
   }

Inside your application onCreate()

val textToSpeech = TextToSpeech(getApplicationContext(), this) 

and then implement onInit(status: Int) method.

also create a public function.

fun getTTSPlayer(){
    return textToSpeech;
}

在您的活动中,使用您的应用程序实例调用 getTTsPlayer。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM