Как приостановить android.speech.tts.TextToSpeech?

Я проигрываю текст с помощью Android TTS - android.speech.tts.TextToSpeech

Я использую: TextToSpeech.speak , чтобы говорить и .stop , чтобы остановиться. Есть ли способ также приостановить текст?

21
задан Pablo Claus 14 August 2012 в 22:25
поделиться

4 ответа

Я использовал разбиение строки и использовал playsilence (), как показано ниже:

public void speakSpeech(String speech) {

    HashMap<String, String> myHash = new HashMap<String, String>();

    myHash.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "done");

    String[] splitspeech = speech.split("\\.");

    for (int i = 0; i < splitspeech.length; i++) {

        if (i == 0) { // Use for the first splited text to flush on audio stream

            textToSpeech.speak(splitspeech[i].toString().trim(),TextToSpeech.QUEUE_FLUSH, myHash);

        } else { // add the new test on previous then play the TTS

            textToSpeech.speak(splitspeech[i].toString().trim(), TextToSpeech.QUEUE_ADD,myHash);
        }

        textToSpeech.playSilence(750, TextToSpeech.QUEUE_ADD, null);
    }
}
14
ответ дан 29 November 2019 в 06:46
поделиться

При отсутствии опции паузы вы можете добавить тишину на время, когда вы хотите отложить выступление TTS Engine. Это, конечно, должно быть предопределенной «паузой» и не поможет, например, включить функцию кнопки паузы.

Для API < 21: public int playSilence (long durationInMs, int queueMode, параметры HashMap)

Для> 21: public int playSilentUtterance (long durationInMs, int queueMode, String utteranceId)

Не забудьте использовать TextToSpeech.QUEUE_ADD , а не TextToSpeech.QUEUE_FLUSH , иначе это очистит ранее начатую речь.

4
ответ дан 29 November 2019 в 06:46
поделиться

Кроме того, экранированная кавычка (\ "), кажется, также несколько останавливает ее - по крайней мере, если вы поместите ее вокруг слова, это добавляет пробел вокруг слова.

0
ответ дан 29 November 2019 в 06:46
поделиться

Я использовал другой подход.

  1. Разделите ваш текст на предложения
  2. Произнесите каждое предложение одно за другим и следите за произносимым предложением
  3. Пауза остановит текст мгновенно
  4. возобновление начнется с начала последнего произнесенного предложения

код Котлина:

class VoiceService {

    private lateinit var textToSpeech: TextToSpeech    

    var sentenceCounter: Int = 0
    var myList: List<String> = ArrayList()

    fun resume() {
        sentenceCounter -= 1
        speakText()
    }

    fun pause() {
        textToSpeech.stop()
    }

    fun stop() {
        sentenceCounter = 0
        textToSpeech.stop()
    }

    fun speakText() {

        var myText = "This is some text to speak. This is more text to speak."

        myList =myText.split(".")

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        textToSpeech.speak(myList[sentenceCounter], TextToSpeech.QUEUE_FLUSH, null, utteranceId)
            sentenceCounter++
        } else {
            var map: HashMap<String, String> = LinkedHashMap<String, String>()
            map[TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID] = utteranceId
            textToSpeech.speak(myList[sentenceCounter], TextToSpeech.QUEUE_FLUSH, map)
            sentenceCounter++
        }
    }

    override fun onDone(p0: String?) {
        if (sentenceCounter < myList.size) {
            speakText()
        } else {
            speakNextText()
        }
    }
}
1
ответ дан 29 November 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: