TtsService.kt 2.79 KB
package com.tools.tts.service

import android.speech.tts.SynthesisCallback
import android.speech.tts.SynthesisRequest
import android.speech.tts.TextToSpeech
import android.speech.tts.TextToSpeechService
import android.util.Log
import com.tools.tts.tts.TtsManager
import java.util.*

class TtsService : TextToSpeechService() {
    private val currentLanguage: MutableList<String> = mutableListOf("zho", "CHN", "")

    override fun onCreate() {
        super.onCreate()
        // Initialize the TtsManager here, as this is the entry point of the service.
        TtsManager.initModels(this)
    }

    override fun onIsLanguageAvailable(_lang: String?, _country: String?, _variant: String?): Int {
        val lang = _lang ?: ""
        val country = _country ?: ""
        val variant = _variant ?: ""
//        Log.i("Test", "======》$lang, $country, $variant")

        return if (Locale.SIMPLIFIED_CHINESE.isO3Language == lang
            || Locale.US.isO3Language == lang
        ) {
            if (Locale.SIMPLIFIED_CHINESE.isO3Country == country
                || Locale.US.isO3Country == country
            )
                TextToSpeech.LANG_COUNTRY_AVAILABLE
            else
                TextToSpeech.LANG_AVAILABLE
        } else TextToSpeech.LANG_NOT_SUPPORTED
    }

    override fun onGetLanguage(): Array<String> {
        Log.i("Test", "onGetLanguage: ${currentLanguage.toTypedArray()}")
        return currentLanguage.toTypedArray()
    }

    override fun onLoadLanguage(_lang: String?, _country: String?, _variant: String?): Int {
        val lang = _lang ?: ""
        val country = _country ?: ""
        val variant = _variant ?: ""
        Log.i("Test", "$lang, $country, $variant")
        val result = onIsLanguageAvailable(lang, country, variant)
        currentLanguage.clear()
        currentLanguage.addAll(arrayOf<String>(lang, country, variant))
        return result
    }

    override fun onStop() {
        TtsManager.stop()
    }

    override fun onSynthesizeText(request: SynthesisRequest?, callback: SynthesisCallback?) {
        if (request == null || callback == null) return
        val language = request.language
        val country = request.country
        val variant = request.variant
        val text = request.charSequenceText.toString()

        Log.d("Test", "---->onSynthesizeText: $language, $country, $variant")

        val load = onIsLanguageAvailable(language, country, variant)
        if (load == TextToSpeech.LANG_NOT_SUPPORTED) {
            callback.error()
            Log.d("Test", "---->LANG_NOT_SUPPORTED")
            return
        }
        if (!TtsManager.isReady) {
            Log.d("Test", "---->TtsManager.isReady - false")
            callback.error()
            return
        }
        Log.e("Test", "---->text=$text")
        TtsManager.speechAsync(text, callback)
    }
}