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