pull/2339/head
			
			
		
		
							parent
							
								
									719155b2ce
								
							
						
					
					
						commit
						49f286313f
					
				| @ -0,0 +1,100 @@ | ||||
| package io.legado.app.help | ||||
| 
 | ||||
| import android.speech.tts.TextToSpeech | ||||
| import android.speech.tts.UtteranceProgressListener | ||||
| import io.legado.app.R | ||||
| import io.legado.app.constant.AppLog | ||||
| import io.legado.app.utils.splitNotBlank | ||||
| import io.legado.app.utils.toastOnUi | ||||
| import splitties.init.appCtx | ||||
| 
 | ||||
| class TTS { | ||||
| 
 | ||||
|     private val tag = "legado_tts" | ||||
| 
 | ||||
|     private var textToSpeech: TextToSpeech? = null | ||||
| 
 | ||||
|     private var text: String? = null | ||||
| 
 | ||||
|     private val initListener by lazy { | ||||
|         InitListener() | ||||
|     } | ||||
| 
 | ||||
|     private val utteranceListener by lazy { | ||||
|         TTSUtteranceListener() | ||||
|     } | ||||
| 
 | ||||
|     fun speak(text: String) { | ||||
|         this.text = text | ||||
|         if (textToSpeech == null) { | ||||
| 
 | ||||
|         } else { | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private fun initTts() { | ||||
|         textToSpeech == TextToSpeech(appCtx, initListener) | ||||
|     } | ||||
| 
 | ||||
|     private fun clearTts() { | ||||
|         textToSpeech?.let { tts -> | ||||
|             tts.stop() | ||||
|             tts.shutdown() | ||||
|         } | ||||
|         textToSpeech = null | ||||
|     } | ||||
| 
 | ||||
|     private fun addTextToSpeakList() { | ||||
|         textToSpeech?.let { tts -> | ||||
|             kotlin.runCatching { | ||||
|                 var result = tts.speak("", TextToSpeech.QUEUE_FLUSH, null, null) | ||||
|                 if (result == TextToSpeech.ERROR) { | ||||
|                     clearTts() | ||||
|                     textToSpeech = TextToSpeech(appCtx, initListener) | ||||
|                     return | ||||
|                 } | ||||
|                 text?.splitNotBlank("\n")?.forEachIndexed { i, s -> | ||||
|                     result = tts.speak(s, TextToSpeech.QUEUE_ADD, null, tag + i) | ||||
|                     if (result == TextToSpeech.ERROR) { | ||||
|                         AppLog.put("tts朗读出错:$text") | ||||
|                     } | ||||
|                 } | ||||
|             }.onFailure { | ||||
|                 AppLog.put("tts朗读出错", it) | ||||
|                 appCtx.toastOnUi(it.localizedMessage) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private inner class InitListener : TextToSpeech.OnInitListener { | ||||
| 
 | ||||
|         override fun onInit(status: Int) { | ||||
|             if (status == TextToSpeech.SUCCESS) { | ||||
|                 textToSpeech?.setOnUtteranceProgressListener(utteranceListener) | ||||
|             } else { | ||||
|                 appCtx.toastOnUi(R.string.tts_init_failed) | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 朗读监听 | ||||
|      */ | ||||
|     private inner class TTSUtteranceListener : UtteranceProgressListener() { | ||||
| 
 | ||||
|         override fun onStart(utteranceId: String?) { | ||||
|             TODO("Not yet implemented") | ||||
|         } | ||||
| 
 | ||||
|         override fun onDone(utteranceId: String?) { | ||||
|             TODO("Not yet implemented") | ||||
|         } | ||||
| 
 | ||||
|         override fun onError(utteranceId: String?) { | ||||
|             TODO("Not yet implemented") | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue