diff --git a/amethyst/src/main/AndroidManifest.xml b/amethyst/src/main/AndroidManifest.xml index 1adc0f659..3b878e3cb 100644 --- a/amethyst/src/main/AndroidManifest.xml +++ b/amethyst/src/main/AndroidManifest.xml @@ -8,8 +8,12 @@ + + + + diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechEngine.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechEngine.kt index 09bd72fa8..19fed32e0 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechEngine.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/tts/TextToSpeechEngine.kt @@ -21,6 +21,8 @@ package com.vitorpamplona.amethyst.service.tts import android.content.Context +import android.media.AudioAttributes +import android.os.Build import android.speech.tts.TextToSpeech import android.speech.tts.UtteranceProgressListener import java.util.Locale @@ -42,8 +44,8 @@ fun getErrorText(errorCode: Int): String = class TextToSpeechEngine private constructor() { private var tts: TextToSpeech? = null - private var defaultPitch = 0.8f - private var defaultSpeed = 0.8f + private var defaultPitch = DEF_SPEECH_AND_PITCH + private var defaultSpeed = DEF_SPEECH_AND_PITCH private var defLanguage = Locale.getDefault() private var onStartListener: (() -> Unit)? = null private var onDoneListener: (() -> Unit)? = null @@ -67,13 +69,27 @@ class TextToSpeechEngine private constructor() { message: String, ) { tts = - TextToSpeech(context) { - if (it == TextToSpeech.SUCCESS) { - tts?.let { - it.language = defLanguage - it.setPitch(defaultPitch) - it.setSpeechRate(defaultSpeed) - it.setListener( + TextToSpeech(context) { result -> + if (result == TextToSpeech.SUCCESS) { + tts?.let { engine -> + val result = engine.setLanguage(defLanguage) + if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { + engine.language = Locale.US + } + engine.setPitch(defaultPitch) + engine.setSpeechRate(defaultSpeed) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + val audioAttributes = + AudioAttributes + .Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) + .setUsage(AudioAttributes.USAGE_MEDIA) + .build() + engine.setAudioAttributes(audioAttributes) + } + + engine.setListener( onStart = { onStartListener?.invoke() }, onError = { e -> e?.let { error -> onErrorListener?.invoke(error) } }, onRange = { start, end -> @@ -86,7 +102,7 @@ class TextToSpeechEngine private constructor() { speak(message) } } else { - onErrorListener?.invoke(getErrorText(it)) + onErrorListener?.invoke(getErrorText(result)) } } }