Fangjun Kuang
Committed by GitHub

Add Android TTS Engine APK for KittenTTS (#2465)

... ... @@ -192,6 +192,7 @@ class MainActivity : AppCompatActivity() {
var dataDir: String?
var dictDir: String?
var assets: AssetManager? = application.assets
var isKitten = false
// The purpose of such a design is to make the CI test easier
// Please see
... ... @@ -291,6 +292,14 @@ class MainActivity : AppCompatActivity() {
// lexicon = "kokoro-multi-lang-v1_0/lexicon-us-en.txt,kokoro-multi-lang-v1_0/lexicon-zh.txt"
// ruleFsts = "$modelDir/phone-zh.fst,$modelDir/date-zh.fst,$modelDir/number-zh.fst"
// Example 11
// kitten-nano-en-v0_1-fp16
// modelDir = "kitten-nano-en-v0_1-fp16"
// modelName = "model.fp16.onnx"
// voices = "voices.bin"
// dataDir = "kokoro-multi-lang-v1_0/espeak-ng-data"
// isKitten = true
if (dataDir != null) {
val newDir = copyDataDir(dataDir!!)
dataDir = "$newDir/$dataDir"
... ... @@ -315,6 +324,7 @@ class MainActivity : AppCompatActivity() {
dictDir = dictDir ?: "",
ruleFsts = ruleFsts ?: "",
ruleFars = ruleFars ?: "",
isKitten = isKitten,
)!!
tts = OfflineTts(assetManager = assets, config = config)
... ...
... ... @@ -53,6 +53,7 @@ object TtsEngine {
private var dataDir: String? = null
private var dictDir: String? = null
private var assets: AssetManager? = null
private var isKitten = false
init {
// The purpose of such a design is to make the CI test easier
... ... @@ -172,6 +173,15 @@ object TtsEngine {
//
// This model supports many languages, e.g., English, Chinese, etc.
// We set lang to eng here.
// Example 11
// kitten-nano-en-v0_1-fp16
// modelDir = "kitten-nano-en-v0_1-fp16"
// modelName = "model.fp16.onnx"
// voices = "voices.bin"
// dataDir = "kitten-nano-en-v0_1-fp16/espeak-ng-data"
// lang = "eng"
// isKitten = true
}
fun createTts(context: Context) {
... ... @@ -207,7 +217,8 @@ object TtsEngine {
dataDir = dataDir ?: "",
dictDir = dictDir ?: "",
ruleFsts = ruleFsts ?: "",
ruleFars = ruleFars ?: ""
ruleFars = ruleFars ?: "",
isKitten = isKitten,
)
speed = PreferenceHelper(context).getSpeed()
... ...
... ... @@ -64,6 +64,11 @@ sed -i.bak s/"lang = null"/"lang = \"$lang_iso_639_3\""/ ./TtsEngine.kt
sed -i.bak s/"lang2 = null"/"lang2 = \"$lang_iso_639_3_2\""/ ./TtsEngine.kt
{% endif %}
{% if tts_model.is_kitten %}
sed -i.bak s/"isKitten = false"/"isKitten = true"/ ./TtsEngine.kt
{% endif %}
{% if tts_model.model_name %}
sed -i.bak s/"modelName = null"/"modelName = \"$model_name\""/ ./TtsEngine.kt
{% endif %}
... ...
... ... @@ -101,6 +101,10 @@ sed -i.bak s/"modelDir = null"/"modelDir = \"$model_dir\""/ ./MainActivity.kt
sed -i.bak s%"lexicon = null"%"lexicon = \"$lexicon\""% ./MainActivity.kt
{% endif %}
{% if tts_model.is_kitten %}
sed -i.bak s/"isKitten = false"/"isKitten = true"/ ./MainActivity.kt
{% endif %}
git diff
popd
... ...
... ... @@ -44,6 +44,7 @@ class TtsModel:
lang_iso_639_3: str = ""
lang_iso_639_3_2: str = ""
lexicon: str = ""
is_kitten: bool = False
def convert_lang_to_iso_639_3(models: List[TtsModel]):
... ... @@ -494,6 +495,22 @@ def get_kokoro_models() -> List[TtsModel]:
return english_models + multi_lingual_models
def get_kitten_models() -> List[TtsModel]:
english_models = [
TtsModel(
model_dir="kitten-nano-en-v0_1-fp16",
model_name="model.fp16.onnx",
lang="en",
)
]
for m in english_models:
m.data_dir = f"{m.model_dir}/espeak-ng-data"
m.voices = "voices.bin"
m.is_kitten = True
return english_models
def main():
args = get_args()
index = args.index
... ... @@ -507,6 +524,7 @@ def main():
all_model_list += get_coqui_models()
all_model_list += get_matcha_models()
all_model_list += get_kokoro_models()
all_model_list += get_kitten_models()
convert_lang_to_iso_639_3(all_model_list)
print(all_model_list)
... ...
... ... @@ -535,6 +535,10 @@ template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
AAssetManager *mgr, const std::string &tokens, const std::string &data_dir,
const OfflineTtsKokoroModelMetaData &kokoro_meta_data);
template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
AAssetManager *mgr, const std::string &tokens, const std::string &data_dir,
const OfflineTtsKittenModelMetaData &kokoro_meta_data);
#endif
#if __OHOS__
... ... @@ -552,6 +556,11 @@ template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
NativeResourceManager *mgr, const std::string &tokens,
const std::string &data_dir,
const OfflineTtsKokoroModelMetaData &kokoro_meta_data);
template PiperPhonemizeLexicon::PiperPhonemizeLexicon(
NativeResourceManager *mgr, const std::string &tokens,
const std::string &data_dir,
const OfflineTtsKittenModelMetaData &kokoro_meta_data);
#endif
} // namespace sherpa_onnx
... ...