From 842d8a4d724c414904878137f12e2635caf02c83 Mon Sep 17 00:00:00 2001 From: John Sebastian Peterson Date: Fri, 2 May 2025 02:29:19 +0300 Subject: [PATCH] tts: add voice flag. variant is broken speech variant is apparently broken it always use the default voice. 1 means the variant was missing https://stackoverflow.com/questions/22917260/android-google-tts-select-voice-variant-programmatically ~~~ echo abc|$PREFIX/libexec/termux-api TextToSpeech --es language eng --es region gbr --es variant male logcat -d -v brief|grep TextToSpeech|vim - -R E/TermuxAPI.TextToSpeechService(15083): tts.setLanguage(eng-gbr-male) returned 1 public static final int LANG_AVAILABLE = 0; public static final int LANG_COUNTRY_AVAILABLE = 1; public static final int LANG_COUNTRY_VAR_AVAILABLE = 2; echo abc|$PREFIX/libexec/termux-api TextToSpeech --es voice en-gb-x-gbd-local $PREFIX/libexec/termux-api TextToSpeech --es engine LIST_AVAILABLE|les --- .../com/termux/api/apis/TextToSpeechAPI.java | 45 ++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/termux/api/apis/TextToSpeechAPI.java b/app/src/main/java/com/termux/api/apis/TextToSpeechAPI.java index 2dae2dd1c..1fc990d51 100644 --- a/app/src/main/java/com/termux/api/apis/TextToSpeechAPI.java +++ b/app/src/main/java/com/termux/api/apis/TextToSpeechAPI.java @@ -9,6 +9,7 @@ import android.speech.tts.TextToSpeech.Engine; import android.speech.tts.TextToSpeech.EngineInfo; import android.speech.tts.UtteranceProgressListener; +import android.speech.tts.Voice; import android.util.JsonWriter; import com.termux.api.util.ResultReturner; @@ -63,6 +64,7 @@ public void onDestroy() { protected void onHandleIntent(final Intent intent) { Logger.logDebug(LOG_TAG, "onHandleIntent:\n" + IntentUtils.getIntentString(intent)); + final String speechVoice = intent.getStringExtra("voice"); final String speechLanguage = intent.getStringExtra("language"); final String speechRegion = intent.getStringExtra("region"); final String speechVariant = intent.getStringExtra("variant"); @@ -133,6 +135,35 @@ public void writeResult(PrintWriter out) { writer.name("default").value(defaultEngineName.equals(info.name)); writer.endObject(); } + + // writer.name("default"); + Voice v = mTts.getDefaultVoice(); + // Voice v = mTts.getDefaultEngine().getDefaultVoice(); + Locale l = v.getLocale(); + writer.beginObject(); + writer.name("default").value(v.getName()); + writer.name("language").value(l.getLanguage()); + writer.name("region").value(l.getCountry()); + writer.name("variant").value(l.getVariant()); + writer.endObject(); + + String name = "en-gb-x-gbd-local"; + v = new Voice(name, Locale.getDefault(), 1, 1, false, null); + l = v.getLocale(); + // writer.name("example"); + writer.beginObject(); + writer.name("example").value(v.getName()); + writer.name("language").value(l.getLanguage()); + writer.name("variant").value(l.getVariant()); + writer.endObject(); + + + writer.beginArray(); + for (Voice vv : mTts.getVoices()) { + writer.value(vv.getName()); + } + writer.endArray(); + writer.endArray(); } out.println(); @@ -163,14 +194,24 @@ public void onDone(String utteranceId) { ttsDoneUtterancesCount.notify(); } } + }); + if (speechVoice != null) { + // int setVoiceResult = mTts.setVoice(mTts.getDefaultVoice()); + // int res = mTts.setVoice(new Voice("en-gb-x-gbd-local", Locale.getDefault(), 1, 1, false, null)); + int setVoiceResult = mTts.setVoice(new Voice(speechVoice, Locale.getDefault(), 1, 1, false, null)); + if (setVoiceResult != TextToSpeech.SUCCESS) { + Logger.logError(LOG_TAG, "tts.setVoice('" + speechVoice + "') returned " + setVoiceResult); + } + } + if (speechLanguage != null) { int setLanguageResult = mTts.setLanguage(getLocale(speechLanguage, speechRegion, speechVariant)); if (setLanguageResult != TextToSpeech.LANG_AVAILABLE) { - Logger.logError(LOG_TAG, "tts.setLanguage('" + speechLanguage + "') returned " + setLanguageResult); - } + Logger.logError(LOG_TAG, "tts.setLanguage(" + speechLanguage + "-" + speechRegion + "-" + speechVariant + ") returned " + setLanguageResult); } + } mTts.setPitch(speechPitch); mTts.setSpeechRate(intent.getFloatExtra("rate", 1.0f));