Как получить плавный перевод текста в речь с идентификаторами высказываний - PullRequest
0 голосов
/ 29 мая 2018

Моя цель - использовать Android для преобразования текста в речь для воспроизведения предложения текста в качестве речи при отслеживании текущего произнесенного слова.

Чтобы получить плавное естественное воспроизведение, я использую:

tts.speak("This is the sentence", TextToSpeech.QUEUE_FLUSH, null, null)

но тогда я не могу отследить текущее произнесенное слово.

Чтобы воспроизвести предложение, следя за текущим произнесенным словом, которое я использую:

val words = "This is the sentence".split(" ")
words.forEachIndexed { index, element ->
    tts.speak(element, TextToSpeech.QUEUE_ADD, null, index.toString())
}

в сочетании с UtteranceProgressListener, но тогда речь очень резкая и не зачитывается как естественное предложение.

Есть ли способ получить как естественно произнесенное предложение, так и одновременно отслеживатьтекущее слово?

1 Ответ

0 голосов
/ 30 мая 2018

Если вы загляните в последнюю документацию по Android, вы заметите новый метод, введенный в UtteranceProgressListener на уровне API 26 - он называется onRangeStart ((String utteranceId, int start, int end, int frame)

https://developer.android.com/reference/android/speech/tts/UtteranceProgressListener.html#onRangeStart(java.lang.String,%20int,%20int,%20int)

Однако, как указано в документации:

"Вызывается только в том случае, если механизм предоставляет информацию о времени, вызывая rangeStart (int, int, int)"

Это реализовано вthe SynthesisCallback: https://developer.android.com/reference/android/speech/tts/SynthesisCallback.html#rangeStart(int,%20int,%20int)

Опять документация гласит:

«Служба может вызывать этот метод для предоставления временной информации о произносимом тексте.»

Итак, к сожалению, это означаетчто обратный вызов, предоставляющий необходимую информацию о времени, зависит от реализации.

На моем устройстве под управлением Android 8.0.0 и с использованием механизма tts по умолчанию (com.google.android.tts) я не получил обратный вызов.

Для тестирования вам потребуется

  • для сборки с SDK уровня 26 или выше
  • Реализация собственного UtteranceProgressListener
  • Установите его в движок TextToSpeech, вызвав TextToSpeech.setOnUtteranceProgressListener (listener);
  • Переопределите метод onRangeStart (String, int, int) в вашем UtteranceProgressListener.

Если ваша реализация поддерживает информацию о времени, вы получите обратный вызов, если, возможно, вам лучше не искать другую реализацию движка или, возможно, реализовать свою собственную TextToSpeechService.

...