diff --git a/android/SherpaOnnxTts/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt b/android/SherpaOnnxTts/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt index becc4fc3..86c565e3 100644 --- a/android/SherpaOnnxTts/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt +++ b/android/SherpaOnnxTts/app/src/main/java/com/k2fsa/sherpa/onnx/MainActivity.kt @@ -186,6 +186,12 @@ class MainActivity : AppCompatActivity() { // ruleFsts = "vits-zh-aishell3/rule.fst" // lexicon = "lexicon.txt" + // Example 4: + // https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-coqui-de-css10.tar.bz2 + // modelDir = "vits-coqui-de-css10" + // modelName = "model.onnx" + // lang = "deu" + if (dataDir != null) { val newDir = copyDataDir(modelDir) modelDir = newDir + "/" + modelDir diff --git a/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GetSampleText.kt b/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GetSampleText.kt index c6e237a3..bd5b9ea5 100644 --- a/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GetSampleText.kt +++ b/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GetSampleText.kt @@ -6,108 +6,140 @@ import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.speech.tts.TextToSpeech +fun getSampleText(lang: String): String { + var text = "" + when (lang) { + "ara" -> { + text = "هذا هو محرك تحويل النص إلى كلام باستخدام الجيل القادم من كالدي" + } + "ben" -> { + text = "এটি একটি টেক্সট-টু-স্পীচ ইঞ্জিন যা পরবর্তী প্রজন্মের কালডি ব্যবহার করে" + } + "bul" -> { + text = "Това е машина за преобразуване на текст в реч, използваща Kaldi от следващо поколение" + } + "cat" -> { + text = "Aquest és un motor de text a veu que utilitza Kaldi de nova generació" + } + "ces" -> { + text = "Toto je převodník textu na řeč využívající novou generaci kaldi" + } + "dan" -> { + text = "Dette er en tekst til tale-motor, der bruger næste generation af kaldi" + } + "deu" -> { + text = "Dies ist eine Text-to-Speech-Engine, die Kaldi der nächsten Generation verwendet" + } + "ell" -> { + text = "Αυτή είναι μια μηχανή κειμένου σε ομιλία που χρησιμοποιεί kaldi επόμενης γενιάς" + } + "eng" -> { + text = "This is a text-to-speech engine using next generation Kaldi" + } + "est" -> { + text = "See on teksti kõneks muutmise mootor, mis kasutab järgmise põlvkonna Kaldi" + } + "fin" -> { + text = "Tämä on tekstistä puheeksi -moottori, joka käyttää seuraavan sukupolven kaldia" + } + "fra" -> { + text = "Il s'agit d'un moteur de synthèse vocale utilisant Kaldi de nouvelle génération" + } + "gle" -> { + text = "Is inneall téacs-go-hurlabhra é seo a úsáideann Kaldi den chéad ghlúin eile" + } + "hrv" -> { + text = "Ovo je mehanizam za pretvaranje teksta u govor koji koristi Kaldi sljedeće generacije" + } + "hun" -> { + text = "Ez egy szövegfelolvasó motor a következő generációs kaldi használatával" + } + "isl" -> { + text = "Þetta er texta í tal vél sem notar næstu kynslóð kaldi" + } + "ita" -> { + text = "Questo è un motore di sintesi vocale che utilizza kaldi di nuova generazione" + } + "kat" -> { + text = "ეს არის ტექსტიდან მეტყველების ძრავა შემდეგი თაობის კალდის გამოყენებით" + } + "kaz" -> { + text = "Бұл келесі буын kaldi көмегімен мәтіннен сөйлеуге арналған қозғалтқыш" + } + "mlt" -> { + text = "Din hija magna text-to-speech li tuża Kaldi tal-ġenerazzjoni li jmiss" + } + "lav" -> { + text = "Šis ir teksta pārvēršanas runā dzinējs, kas izmanto nākamās paaudzes Kaldi" + } + "lit" -> { + text = "Tai teksto į kalbą variklis, kuriame naudojamas naujos kartos Kaldi" + } + "ltz" -> { + text = "Dëst ass en Text-zu-Speech-Motor mat der nächster Generatioun Kaldi" + } + "nep" -> { + text = "यो अर्को पुस्ता काल्डी प्रयोग गरेर स्पीच इन्जिनको पाठ हो" + } + "nld" -> { + text = "Dit is een tekst-naar-spraak-engine die gebruik maakt van Kaldi van de volgende generatie" + } + "nor" -> { + text = "Dette er en tekst til tale-motor som bruker neste generasjons kaldi" + } + "pol" -> { + text = "Jest to silnik syntezatora mowy wykorzystujący Kaldi nowej generacji" + } + "por" -> { + text = "Este é um mecanismo de conversão de texto em fala usando Kaldi de próxima geração" + } + "ron" -> { + text = "Acesta este un motor text to speech care folosește generația următoare de kadi" + } + "rus" -> { + text = "Это движок преобразования текста в речь, использующий Kaldi следующего поколения." + } + "slk" -> { + text = "Toto je nástroj na prevod textu na reč využívajúci kaldi novej generácie" + } + "slv" -> { + text = "To je mehanizem za pretvorbo besedila v govor, ki uporablja Kaldi naslednje generacije" + } + "spa" -> { + text = "Este es un motor de texto a voz que utiliza kaldi de próxima generación." + } + "srp" -> { + text = "Ово је механизам за претварање текста у говор који користи калди следеће генерације" + } + "swa" -> { + text = "Haya ni maandishi kwa injini ya hotuba kwa kutumia kizazi kijacho kaldi" + } + "swe" -> { + text = "Detta är en text till tal-motor som använder nästa generations kaldi" + } + "tur" -> { + text = "Bu, yeni nesil kaldi'yi kullanan bir metinden konuşmaya motorudur" + } + "ukr" -> { + text = "Це механізм перетворення тексту на мовлення, який використовує kaldi нового покоління" + } + "vie" -> { + text = "Đây là công cụ chuyển văn bản thành giọng nói sử dụng kaldi thế hệ tiếp theo" + } + "zho", "cmn" -> { + text = "使用新一代卡尔迪的语音合成引擎" + } + } + return text +} + class GetSampleText : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) var result = TextToSpeech.LANG_AVAILABLE - var text: String = "" - when(TtsEngine.lang) { - "ara" -> { - text = "هذا هو محرك تحويل النص إلى كلام باستخدام الجيل القادم من كالدي" - } - "cat" -> { - text = "Aquest és un motor de text a veu que utilitza Kaldi de nova generació" - } - "ces" -> { - text = "Toto je převodník textu na řeč využívající novou generaci kaldi" - } - "dan" -> { - text = "Dette er en tekst til tale-motor, der bruger næste generation af kaldi" - } - "deu" -> { - text = "Dies ist eine Text-to-Speech-Engine, die Kaldi der nächsten Generation verwendet" - } - "ell" -> { - text = "Αυτή είναι μια μηχανή κειμένου σε ομιλία που χρησιμοποιεί kaldi επόμενης γενιάς" - } - "eng" -> { - text = "This is a text-to-speech engine using next generation Kaldi" - } - "fin" -> { - text = "Tämä on tekstistä puheeksi -moottori, joka käyttää seuraavan sukupolven kaldia" - } - "fra" -> { - text = "Il s'agit d'un moteur de synthèse vocale utilisant Kaldi de nouvelle génération." - } - "hun" -> { - text = "Ez egy szövegfelolvasó motor a következő generációs kaldi használatával" - } - "isl" -> { - text = "Þetta er texta í tal vél sem notar næstu kynslóð kaldi" - } - "ita" -> { - text = "Questo è un motore di sintesi vocale che utilizza kaldi di nuova generazione" - } - "kat" -> { - text = "ეს არის ტექსტიდან მეტყველების ძრავა შემდეგი თაობის კალდის გამოყენებით" - } - "kaz" -> { - text = "Бұл келесі буын kaldi көмегімен мәтіннен сөйлеуге арналған қозғалтқыш" - } - "ltz" -> { - text = "Dëst ass en Text-zu-Speech-Motor mat der nächster Generatioun Kaldi" - } - "nep" -> { - text = "यो अर्को पुस्ता काल्डी प्रयोग गरेर स्पीच इन्जिनको पाठ हो" - } - "nld" -> { - text = "Dit is een tekst-naar-spraak-engine die gebruik maakt van Kaldi van de volgende generatie" - } - "nor" -> { - text = "Dette er en tekst til tale-motor som bruker neste generasjons kaldi" - } - "pol" -> { - text = "Jest to silnik syntezatora mowy wykorzystujący Kaldi nowej generacji" - } - "por" -> { - text = "Este é um mecanismo de conversão de texto em fala usando Kaldi de próxima geração" - } - "ron" -> { - text = "Acesta este un motor text to speech care folosește generația următoare de kadi" - } - "rus" -> { - text = "Это движок преобразования текста в речь, использующий Kaldi следующего поколения." - } - "slk" -> { - text = "Toto je nástroj na prevod textu na reč využívajúci kaldi novej generácie" - } - "spa" -> { - text = "Este es un motor de texto a voz que utiliza kaldi de próxima generación." - } - "srp" -> { - text = "Ово је механизам за претварање текста у говор који користи калди следеће генерације" - } - "swa" -> { - text = "Haya ni maandishi kwa injini ya hotuba kwa kutumia kizazi kijacho kaldi" - } - "swe" -> { - text = "Detta är en text till tal-motor som använder nästa generations kaldi" - } - "tur" -> { - text = "Bu, yeni nesil kaldi'yi kullanan bir metinden konuşmaya motorudur" - } - "ukr" -> { - text = "Це механізм перетворення тексту на мовлення, який використовує kaldi нового покоління" - } - "vie" -> { - text = "Đây là công cụ chuyển văn bản thành giọng nói sử dụng kaldi thế hệ tiếp theo" - } - "zho", "cmn" -> { - text = "使用新一代卡尔迪的语音合成引擎" - } - else -> { - result = TextToSpeech.LANG_NOT_SUPPORTED - } + var text: String = getSampleText(TtsEngine.lang ?: "") + if (text.isEmpty()) { + result = TextToSpeech.LANG_NOT_SUPPORTED } val intent = Intent().apply{ diff --git a/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/MainActivity.kt b/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/MainActivity.kt index 1a723b74..d42b1b1f 100644 --- a/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/MainActivity.kt +++ b/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/MainActivity.kt @@ -73,110 +73,8 @@ class MainActivity : ComponentActivity() { ) } - var testTextContent = "" - - when(TtsEngine.lang) { - "ara" -> { - testTextContent = "هذا هو محرك تحويل النص إلى كلام باستخدام الجيل القادم من كالدي" - } - "cat" -> { - testTextContent = "Aquest és un motor de testText a veu que utilitza Kaldi de nova generació" - } - "ces" -> { - testTextContent = "Toto je převodník testTextu na řeč využívající novou generaci kaldi" - } - "dan" -> { - testTextContent = "Dette er en tekst til tale-motor, der bruger næste generation af kaldi" - } - "deu" -> { - testTextContent = "Dies ist eine testText-to-Speech-Engine, die Kaldi der nächsten Generation verwendet" - } - "ell" -> { - testTextContent = "Αυτή είναι μια μηχανή κειμένου σε ομιλία που χρησιμοποιεί kaldi επόμενης γενιάς" - } - "eng" -> { - testTextContent = "This is a testText-to-speech engine using next generation Kaldi" - } - "fas" -> { - testTextContent = "این یک موتور تبدیل متن به گفتار است برپایه نسخه پیشگام کالدی" - } - "fin" -> { - testTextContent = "Tämä on tekstistä puheeksi -moottori, joka käyttää seuraavan sukupolven kaldia" - } - "fra" -> { - testTextContent = "Il s'agit d'un moteur de synthèse vocale utilisant Kaldi de nouvelle génération." - } - "hun" -> { - testTextContent = "Ez egy szövegfelolvasó motor a következő generációs kaldi használatával" - } - "isl" -> { - testTextContent = "Þetta er testTexta í tal vél sem notar næstu kynslóð kaldi" - } - "ita" -> { - testTextContent = "Questo è un motore di sintesi vocale che utilizza kaldi di nuova generazione" - } - "kat" -> { - testTextContent = "ეს არის ტექსტიდან მეტყველების ძრავა შემდეგი თაობის კალდის გამოყენებით" - } - "kaz" -> { - testTextContent = "Бұл келесі буын kaldi көмегімен мәтіннен сөйлеуге арналған қозғалтқыш" - } - "ltz" -> { - testTextContent = "Dëst ass en testText-zu-Speech-Motor mat der nächster Generatioun Kaldi" - } - "nep" -> { - testTextContent = "यो अर्को पुस्ता काल्डी प्रयोग गरेर स्पीच इन्जिनको पाठ हो" - } - "nld" -> { - testTextContent = "Dit is een tekst-naar-spraak-engine die gebruik maakt van Kaldi van de volgende generatie" - } - "nor" -> { - testTextContent = "Dette er en tekst til tale-motor som bruker neste generasjons kaldi" - } - "pol" -> { - testTextContent = "Jest to silnik syntezatora mowy wykorzystujący Kaldi nowej generacji" - } - "por" -> { - testTextContent = "Este é um mecanismo de conversão de testTexto em fala usando Kaldi de próxima geração" - } - "ron" -> { - testTextContent = "Acesta este un motor testText to speech care folosește generația următoare de kadi" - } - "rus" -> { - testTextContent = "Это движок преобразования текста в речь, использующий Kaldi следующего поколения." - } - "slk" -> { - testTextContent = "Toto je nástroj na prevod testTextu na reč využívajúci kaldi novej generácie" - } - "spa" -> { - testTextContent = "Este es un motor de testTexto a voz que utiliza kaldi de próxima generación." - } - "srp" -> { - testTextContent = "Ово је механизам за претварање текста у говор који користи калди следеће генерације" - } - "swa" -> { - testTextContent = "Haya ni maandishi kwa injini ya hotuba kwa kutumia kizazi kijacho kaldi" - } - "swe" -> { - testTextContent = "Detta är en testText till tal-motor som använder nästa generations kaldi" - } - "tur" -> { - testTextContent = "Bu, yeni nesil kaldi'yi kullanan bir metinden konuşmaya motorudur" - } - "ukr" -> { - testTextContent = "Це механізм перетворення тексту на мовлення, який використовує kaldi нового покоління" - } - "vie" -> { - testTextContent = "Đây là công cụ chuyển văn bản thành giọng nói sử dụng kaldi thế hệ tiếp theo" - } - "zho", "cmn" -> { - testTextContent = "使用新一代卡尔迪的语音合成引擎" - } - else -> { - testTextContent = "" - } - } - + val testTextContent = getSampleText(TtsEngine.lang ?: "") + var testText by remember { mutableStateOf(testTextContent) } val numSpeakers = TtsEngine.tts!!.numSpeakers() diff --git a/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsEngine.kt b/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsEngine.kt index e4e4c9b7..f814a2e0 100644 --- a/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsEngine.kt +++ b/android/SherpaOnnxTtsEngine/app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsEngine.kt @@ -57,6 +57,7 @@ object TtsEngine { // Please enable one and only one of the examples below // Example 1: + // https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-vctk.tar.bz2 // modelDir = "vits-vctk" // modelName = "vits-vctk.onnx" // lexicon = "lexicon.txt" @@ -71,11 +72,19 @@ object TtsEngine { // lang = "eng" // Example 3: + // https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-icefall-zh-aishell3.tar.bz2 // modelDir = "vits-zh-aishell3" // modelName = "vits-aishell3.onnx" // ruleFsts = "vits-zh-aishell3/rule.fst" // lexicon = "lexicon.txt" // lang = "zho" + + // Example 4: + // https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/vits-coqui-de-css10.tar.bz2 + // This model does not need lexicon or dataDir + // modelDir = "vits-coqui-de-css10" + // modelName = "model.onnx" + // lang = "deu" } diff --git a/scripts/apk/build-apk-tts-engine.sh.in b/scripts/apk/build-apk-tts-engine.sh.in index 58c7d8ee..766846c1 100644 --- a/scripts/apk/build-apk-tts-engine.sh.in +++ b/scripts/apk/build-apk-tts-engine.sh.in @@ -59,7 +59,7 @@ sed -i.bak s/"lang = null"/"lang = \"$lang_iso_639_3\""/ ./TtsEngine.kt {% if tts_model.data_dir %} data_dir={{ tts_model.data_dir }} sed -i.bak s%"dataDir = null"%"dataDir = \"$data_dir\""% ./TtsEngine.kt -{% else %} +{% elif not tts_model.is_char %} sed -i.bak s/"lexicon = null"/"lexicon = \"lexicon.txt\""/ ./TtsEngine.kt {% endif %} diff --git a/scripts/apk/build-apk-tts.sh.in b/scripts/apk/build-apk-tts.sh.in index 0358ea38..a5a0d5ea 100644 --- a/scripts/apk/build-apk-tts.sh.in +++ b/scripts/apk/build-apk-tts.sh.in @@ -57,7 +57,7 @@ sed -i.bak s/"modelName = null"/"modelName = \"$model_name\""/ ./MainActivity.kt {% if tts_model.data_dir %} data_dir={{ tts_model.data_dir }} sed -i.bak s%"dataDir = null"%"dataDir = \"$data_dir\""% ./MainActivity.kt -{% else %} +{% elif not tts_model.is_char %} sed -i.bak s/"lexicon = null"/"lexicon = \"lexicon.txt\""/ ./MainActivity.kt {% endif %} diff --git a/scripts/apk/generate-tts-apk-script.py b/scripts/apk/generate-tts-apk-script.py index 1a8c28b5..38ffd79d 100755 --- a/scripts/apk/generate-tts-apk-script.py +++ b/scripts/apk/generate-tts-apk-script.py @@ -34,6 +34,7 @@ class TtsModel: lang: str = "" # en, zh, fr, de, etc. rule_fsts: Optional[List[str]] = None data_dir: Optional[str] = None + is_char: bool = False lang_iso_639_3: str = "" @@ -57,7 +58,35 @@ def get_coqui_models() -> List[TtsModel]: m.model_name = "model.onnx" m.lang = "en" - return models + character_models = [ + TtsModel(model_dir="vits-coqui-bg-cv", lang="bg"), + TtsModel(model_dir="vits-coqui-bn-custom_female", lang="bn"), + TtsModel(model_dir="vits-coqui-cs-cv", lang="cs"), + TtsModel(model_dir="vits-coqui-da-cv", lang="da"), + TtsModel(model_dir="vits-coqui-de-css10", lang="de"), + TtsModel(model_dir="vits-coqui-es-css10", lang="es"), + TtsModel(model_dir="vits-coqui-et-cv", lang="et"), + TtsModel(model_dir="vits-coqui-fi-css10", lang="fi"), + TtsModel(model_dir="vits-coqui-fr-css10", lang="fr"), + TtsModel(model_dir="vits-coqui-ga-cv", lang="ga"), + TtsModel(model_dir="vits-coqui-hr-cv", lang="hr"), + TtsModel(model_dir="vits-coqui-lt-cv", lang="lt"), + TtsModel(model_dir="vits-coqui-lv-cv", lang="lv"), + TtsModel(model_dir="vits-coqui-mt-cv", lang="mt"), + TtsModel(model_dir="vits-coqui-nl-css10", lang="nl"), + TtsModel(model_dir="vits-coqui-pl-mai_female", lang="pl"), + TtsModel(model_dir="vits-coqui-pt-cv", lang="pt"), + TtsModel(model_dir="vits-coqui-ro-cv", lang="ro"), + TtsModel(model_dir="vits-coqui-sk-cv", lang="sk"), + TtsModel(model_dir="vits-coqui-sl-cv", lang="sl"), + TtsModel(model_dir="vits-coqui-sv-cv", lang="sv"), + TtsModel(model_dir="vits-coqui-uk-mai", lang="uk"), + ] + for m in character_models: + m.is_char = True + m.model_name = "model.onnx" + + return models + character_models def get_piper_models() -> List[TtsModel]: