Update TTS Engine APK to support multi-lang (#2294)
This commit is contained in:
@@ -23,6 +23,9 @@ object TtsEngine {
|
||||
// cmn for Mandarin
|
||||
var lang: String? = null
|
||||
|
||||
// if a model supports two languages, set also lang2
|
||||
var lang2: String? = null
|
||||
|
||||
|
||||
val speedState: MutableState<Float> = mutableFloatStateOf(1.0F)
|
||||
val speakerIdState: MutableState<Int> = mutableIntStateOf(0)
|
||||
@@ -76,6 +79,7 @@ object TtsEngine {
|
||||
dataDir = null
|
||||
dictDir = null
|
||||
lang = null
|
||||
lang2 = null
|
||||
|
||||
// Please enable one and only one of the examples below
|
||||
|
||||
@@ -125,6 +129,7 @@ object TtsEngine {
|
||||
// lexicon = "lexicon.txt"
|
||||
// dictDir = "vits-melo-tts-zh_en/dict"
|
||||
// lang = "zho"
|
||||
// lang2 = "eng"
|
||||
|
||||
// Example 7
|
||||
// matcha-icefall-zh-baker
|
||||
@@ -162,6 +167,7 @@ object TtsEngine {
|
||||
// dictDir = "kokoro-multi-lang-v1_0/dict"
|
||||
// lexicon = "kokoro-multi-lang-v1_0/lexicon-us-en.txt,kokoro-multi-lang-v1_0/lexicon-zh.txt"
|
||||
// lang = "eng"
|
||||
// lang2 = "zho"
|
||||
// ruleFsts = "$modelDir/phone-zh.fst,$modelDir/date-zh.fst,$modelDir/number-zh.fst"
|
||||
//
|
||||
// This model supports many languages, e.g., English, Chinese, etc.
|
||||
|
||||
@@ -60,6 +60,9 @@ class TtsService : TextToSpeechService() {
|
||||
|
||||
// see https://github.com/Miserlou/Android-SDK-Samples/blob/master/TtsEngine/src/com/example/android/ttsengine/RobotSpeakTtsService.java#L68
|
||||
onLoadLanguage(TtsEngine.lang, "", "")
|
||||
if (TtsEngine.lang2 != null) {
|
||||
onLoadLanguage(TtsEngine.lang2, "", "")
|
||||
}
|
||||
}
|
||||
|
||||
override fun onDestroy() {
|
||||
@@ -71,7 +74,7 @@ class TtsService : TextToSpeechService() {
|
||||
override fun onIsLanguageAvailable(_lang: String?, _country: String?, _variant: String?): Int {
|
||||
val lang = _lang ?: ""
|
||||
|
||||
if (lang == TtsEngine.lang) {
|
||||
if (lang == TtsEngine.lang || lang == TtsEngine.lang2) {
|
||||
return TextToSpeech.LANG_AVAILABLE
|
||||
}
|
||||
|
||||
@@ -87,12 +90,12 @@ class TtsService : TextToSpeechService() {
|
||||
Log.i(TAG, "onLoadLanguage: $_lang, $_country")
|
||||
val lang = _lang ?: ""
|
||||
|
||||
return if (lang == TtsEngine.lang) {
|
||||
return if (lang == TtsEngine.lang || lang == TtsEngine.lang2) {
|
||||
Log.i(TAG, "creating tts, lang :$lang")
|
||||
TtsEngine.createTts(application)
|
||||
TextToSpeech.LANG_AVAILABLE
|
||||
} else {
|
||||
Log.i(TAG, "lang $lang not supported, tts engine lang: ${TtsEngine.lang}")
|
||||
Log.i(TAG, "lang $lang not supported, tts engine lang: ${TtsEngine.lang}, ${TtsEngine.lang2}")
|
||||
TextToSpeech.LANG_NOT_SUPPORTED
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ vocoder={{ tts_model.vocoder }}
|
||||
voices={{ tts_model.voices }}
|
||||
lang={{ tts_model.lang }}
|
||||
lang_iso_639_3={{ tts_model.lang_iso_639_3 }}
|
||||
lang_iso_639_3_2={{ tts_model.lang_iso_639_3_2 }}
|
||||
|
||||
wget -qq https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/$model_dir.tar.bz2
|
||||
tar xf $model_dir.tar.bz2
|
||||
@@ -59,6 +60,10 @@ pushd android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/en
|
||||
sed -i.bak s/"modelDir = null"/"modelDir = \"$model_dir\""/ ./TtsEngine.kt
|
||||
sed -i.bak s/"lang = null"/"lang = \"$lang_iso_639_3\""/ ./TtsEngine.kt
|
||||
|
||||
{% if tts_model.lang2 %}
|
||||
sed -i.bak s/"lang2 = null"/"lang2 = \"$lang_iso_639_3_2\""/ ./TtsEngine.kt
|
||||
{% endif %}
|
||||
|
||||
{% if tts_model.model_name %}
|
||||
sed -i.bak s/"modelName = null"/"modelName = \"$model_name\""/ ./TtsEngine.kt
|
||||
{% endif %}
|
||||
@@ -109,7 +114,7 @@ if [[ $model_dir == vits-melo-tts-zh_en ]]; then
|
||||
lang=zh_en
|
||||
fi
|
||||
|
||||
if [[ $model_dir == kokoro-multi-lang-v1_0 ]]; then
|
||||
if [[ $model_dir == kokoro-multi-lang-v1_0 || $model_dir == kokoro-multi-lang-v1_1 || $model_dir == kokoro-int8-multi-lang-v1_1 ]]; then
|
||||
lang=zh_en
|
||||
fi
|
||||
|
||||
|
||||
@@ -108,7 +108,7 @@ if [[ $model_dir == vits-melo-tts-zh_en ]]; then
|
||||
lang=zh_en
|
||||
fi
|
||||
|
||||
if [[ $model_dir == kokoro-multi-lang-v1_0 ]]; then
|
||||
if [[ $model_dir == kokoro-multi-lang-v1_0 || $model_dir == kokoro-multi-lang-v1_1 || $model_dir == kokoro-int8-multi-lang-v1_1 ]]; then
|
||||
lang=zh_en
|
||||
fi
|
||||
|
||||
|
||||
@@ -35,12 +35,14 @@ class TtsModel:
|
||||
vocoder: str = "" # for matcha
|
||||
voices: str = "" # for kokoro
|
||||
lang: str = "" # en, zh, fr, de, etc.
|
||||
lang2: str = "" # en, zh, fr, de, etc.
|
||||
rule_fsts: Optional[List[str]] = None
|
||||
rule_fars: Optional[List[str]] = None
|
||||
data_dir: Optional[str] = None
|
||||
dict_dir: Optional[str] = None
|
||||
is_char: bool = False
|
||||
lang_iso_639_3: str = ""
|
||||
lang_iso_639_3_2: str = ""
|
||||
lexicon: str = ""
|
||||
|
||||
|
||||
@@ -48,6 +50,8 @@ def convert_lang_to_iso_639_3(models: List[TtsModel]):
|
||||
for m in models:
|
||||
if m.lang_iso_639_3 == "":
|
||||
m.lang_iso_639_3 = Lang(m.lang).pt3
|
||||
if m.lang2 != "":
|
||||
m.lang_iso_639_3_2 = Lang(m.lang2).pt3
|
||||
|
||||
|
||||
def get_coqui_models() -> List[TtsModel]:
|
||||
@@ -322,6 +326,7 @@ def get_vits_models() -> List[TtsModel]:
|
||||
model_dir="vits-melo-tts-zh_en",
|
||||
model_name="model.onnx",
|
||||
lang="zh",
|
||||
lang2="en",
|
||||
),
|
||||
TtsModel(
|
||||
model_dir="vits-zh-hf-fanchen-C",
|
||||
@@ -438,16 +443,19 @@ def get_kokoro_models() -> List[TtsModel]:
|
||||
model_dir="kokoro-multi-lang-v1_0",
|
||||
model_name="model.onnx",
|
||||
lang="en",
|
||||
lang2="zh",
|
||||
),
|
||||
TtsModel(
|
||||
model_dir="kokoro-multi-lang-v1_1",
|
||||
model_name="model.onnx",
|
||||
lang="en",
|
||||
lang2="zh",
|
||||
),
|
||||
TtsModel(
|
||||
model_dir="kokoro-int8-multi-lang-v1_1",
|
||||
model_name="model.int8.onnx",
|
||||
lang="en",
|
||||
lang2="zh",
|
||||
),
|
||||
]
|
||||
for m in multi_lingual_models:
|
||||
|
||||
Reference in New Issue
Block a user