Запуск текста в речь автоматически вне onInit - PullRequest
0 голосов
/ 02 марта 2019

Так что сейчас, когда я запускаю приложение, сначала запускается функция showLabel, а не инициализация TTS.Я всегда получаю сообщение об ошибке, что tts является нулевымЕсть ли лучший способ исправить это?Должен ли я переместить свой код на showLabel внутри onInit?У него тоже есть параметр.Цель будет firstObject будет текст для TTS.Когда я пытаюсь добавить .speak внутри Oninit, он работает, но когда он снаружи, это приведет к нулевой ошибке.Любая помощь будет благодарна!

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 голосов
/ 03 марта 2019

Вы не можете вызывать говорить () для объекта TTS, который еще не инициализирован.

Поскольку у вас есть функция say () внутри функции showLabel (), это означает, что вы не можете вызывать showLabel () до инициализации TTS, либо.

Что вы можете сделать, это создать булеву переменную уровня класса, ttsIsInitialized и установить ее в значение false, пока TTS не инициализируется ... устанавливая ееtrue изнутри onInit ().

Затем в showLabel () первое, что вы делаете, проверяете логическое значение an, если оно все еще ложно, затем возвращаете / ничего не делаете.

...