Huawei ML Kit Text to speech duration of audio

77 Views Asked by At

I have implemented On-device TTS from the Huawei ML Kit in my app and it works well. Now I would like to find out the duration of the synthesized audio. I want to for example display the remaining time while the audio is playing.

I tried writing the generated audio fragments from the callback to a .pcm file

override fun onAudioAvailable(
        taskId: String?,
        audioFragment: MLTtsAudioFragment?,
        offset: Int,
        range: android.util.Pair<Int, Int>?,
        bundle: Bundle?
    ) {
        if (taskId != null) {
            if (audioFragment != null) {
                val fileName = "audio.pcm"
                writeToFile(audioFragment.audioData, fileName, true)
            }
        }
    }

fun writeToFile(buffer: ByteArray?, strFileName: String?, append: Boolean) {
    if (speechFile == null) {
        val pcmFileDir: File = view.getExternalFilesDir("/PCM")!!
        speechFile = File(pcmFileDir, strFileName)
    }
    var raf: RandomAccessFile? = null
    var out: FileOutputStream? = null
    try {
        if (append) {
            raf = RandomAccessFile(speechFile, "rw")
            speechFile?.length()?.let { raf.seek(it) }
            raf.write(buffer)
        } else {
            out = FileOutputStream(speechFile)
            out.write(buffer)
            out.flush()
        }
    } catch (e: IOException) {
        e.printStackTrace()
    } finally {
        try {
            raf?.close()
            out?.close()
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
}

and getting the duration that way, but the Android MediaPlayer.getDuration() doesn't seem to work with a .pcm file.

Is there a better way to get the duration of the audio? If not then is it possible to calculate the duration of the .pcm file somehow?

0

There are 0 best solutions below