簡體   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