Fangjun Kuang
Committed by GitHub

Build Android TTS APKs for coqui-ai/TTS models (#704)

... ... @@ -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,15 +6,18 @@ import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.speech.tts.TextToSpeech
class GetSampleText : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var result = TextToSpeech.LANG_AVAILABLE
var text: String = ""
when(TtsEngine.lang) {
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ó"
}
... ... @@ -33,11 +36,20 @@ class GetSampleText : Activity() {
"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."
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"
... ... @@ -54,6 +66,15 @@ class GetSampleText : Activity() {
"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"
}
... ... @@ -81,6 +102,9 @@ class GetSampleText : Activity() {
"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."
}
... ... @@ -105,9 +129,17 @@ class GetSampleText : Activity() {
"zho", "cmn" -> {
text = "使用新一代卡尔迪的语音合成引擎"
}
else -> {
result = TextToSpeech.LANG_NOT_SUPPORTED
}
return text
}
class GetSampleText : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
var result = TextToSpeech.LANG_AVAILABLE
var text: String = getSampleText(TtsEngine.lang ?: "")
if (text.isEmpty()) {
result = TextToSpeech.LANG_NOT_SUPPORTED
}
val intent = Intent().apply{
... ...
... ... @@ -73,109 +73,7 @@ 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) }
... ...
... ... @@ -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]:
... ...