Build Android TTS APKs for coqui-ai/TTS models (#704)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
|
||||
@@ -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]:
|
||||
|
||||
Reference in New Issue
Block a user