Я использовал ИИ для создания основ и настройки движка с системой Android. Но мне не удалось заставить TTS нормально работать при чтении текста в программе для чтения книг.
Служба, которую я использую, возвращает файлы WAV, которые работают нормально. Но при их фрагментировании для добавления в TTS я продолжаю получать искажения и искаженный текст (например, отсутствие звука на старых ЭЛТ-телевизорах). Единственное, о чем я могу думать, это разбиение аудио при передаче к системному обработчику.
Вот основной цикл кода:
Код: Выделить всё
// This function is called when apps ask to convert TTS
// callback is an injected object to interact with the app asking for the TTS
override fun onSynthesizeText(
request: SynthesisRequest?,
callback: SynthesisCallback
) {
val text = request?.charSequenceText?.toString()
if (text.isNullOrEmpty()) {
callback.error()
return
}
runBlocking(Dispatchers.IO) {
try {
when (val result = repository.generateSpeech(text)) {
is TtsRepository.TtsResult.Success -> {
val audioData = result.audioData
val inputStream = audioData.byteStream()
// reading the WAV header
val headerBytes = ByteArray(44)
inputStream.read(headerBytes)
val wavInfo = parseWavHeader(headerBytes)
// finding the audio format, mostly for debugging
val audioFormat = when (wavInfo.bitsPerSample) {
8 -> AudioFormat.ENCODING_PCM_8BIT
16 -> AudioFormat.ENCODING_PCM_16BIT
24 -> AudioFormat.ENCODING_PCM_24BIT_PACKED
32 -> AudioFormat.ENCODING_PCM_32BIT
else -> AudioFormat.ENCODING_PCM_16BIT
}
val channelConfig = when (wavInfo.channels) {
1 -> 1
2 -> AudioFormat.CHANNEL_OUT_FRONT_LEFT or AudioFormat.CHANNEL_OUT_FRONT_RIGHT
else -> AudioFormat.CHANNEL_CONFIGURATION_INVALID
}
callback.start(wavInfo.sampleRate, audioFormat, 1)
Log.d(TAG, "TTS request started: ${wavInfo.sampleRate}Hz, ${wavInfo.channels}ch, ${wavInfo.bitsPerSample}bit")
val maxBufferSize = callback.maxBufferSize // {
callback.error()
}
}
} catch (e: Exception) {
callback.error()
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ndroid-tts
Мобильная версия