在onInit外部自动运行文本语音转换

时间:2019-03-02 19:23:22

标签: android kotlin text-to-speech

现在,当我运行应用程序时,首先运行showLabel函数,而不是初始化TTS。我总是得到一个错误,即tts为null。有解决这个问题的更好方法吗?我应该在onInit内的showLabel上移动代码吗?它也有一个参数。目标是firstObject将成为TTS的文本。当我尝试在Oninit内部添加.speak时,它可以工作,但在外部时,它将导致null错误。任何帮助将不胜感激!

private var tts: TextToSpeech? = null
var firstObject = ""

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_live_preview)

        tts = TextToSpeech(this, this)

fun showLabel(labels: List<FirebaseVisionImageLabel>?) {
        firstObject = labels!!.first().text
        Log.d(TAG, firstObject)
        tts!!.speak(firstObject, TextToSpeech.QUEUE_FLUSH, null, "")
    }

    override fun onInit(status: Int) {

        if (status == TextToSpeech.SUCCESS) {
            // set US English as language for tts
            val result = tts!!.setLanguage(Locale.US)

            if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                Log.e("TTS","The Language specified is not supported!")
            } else {
                Log.d("TTS", "Initilization Successful")
                tts!!.speak("This is a test", TextToSpeech.QUEUE_FLUSH, null, "") // works
                cameraSource?.setMachineLearningFrameProcessor(ImageLabelingProcessor())
            }

        } else {
            Log.e("TTS", "Initilization Failed!")
        }

    }

1 个答案:

答案 0 :(得分:0)

您不能在尚未初始化的TTS对象上调用talk()。

由于在showLabel()函数中有speak(),这意味着您也无法在初始化TTS之前调用showLabel()。

您可以做的是创建一个类级布尔变量 ttsIsInitialized ,并将其设置为false,直到TTS初始化为止……从onInit()内部将其设置为true。

然后,在showLabel()中,您要做的第一件事是检查布尔值是否仍然为false,然后不执行任何操作。