.
================================================
FILE: README.md
================================================
```
Google has announced that, starting in 2026/2027, all apps on certified Android devices
will require the developer to submit personal identity details directly to Google.
Since the developers of this app do not agree to this requirement, this app will no longer
work on certified Android devices after that time.
```
## Donate
Send a coffee to
woheller69@t-online.de
Or via this link (with fees)
# SherpaTTS
SherpaTTS is an Android Text-to-Speech engine based on Next-gen Kaldi. It uses voices from [Piper Voices](https://rhasspy.github.io/piper-samples/) or [Coqui](https://github.com/coqui-ai/TTS/).
[ ](https://f-droid.org/de/packages/org.woheller69.ttsengine/) [ ]( https://www.openapk.net/ttsengine/org.woheller69.ttsengine/)
## Installing Voice Models
### From Hugging Face
The app provides a built-in model downloader that lets you install Piper and Coqui voice models directly from the "Manage Languages" screen. Simply select a language and the app will download and install the model automatically.
Please note that this is the only instance where internet permission is required.
Once the model is downloaded, text-to-speech works entirely offline, ensuring your privacy and convenience.
Voices can be tested [here](https://huggingface.co/spaces/k2-fsa/text-to-speech/).
### From SD Card (Sideloading)
You can install custom Piper models directly from your device storage:
1. Open the app and go to "Manage Languages"
2. Tap "Install from SD Card"
3. Enter a 3-letter language code (e.g., `eng`, `deu`, `fra`)
4. Enter a model name (this will be displayed in the language list)
5. Select your model file (`.onnx` format)
6. Select your tokens file (`.txt` format)
7. Tap "OK"
**Requirements:**
- The model file must be in `.onnx` format (make sure the model has been converted a described here: [Sherpa ONNX conversion](https://k2-fsa.github.io/sherpa/onnx/tts/piper.html))
- The tokens file must contain the vocabulary mapping (typically `tokens.txt`)
### Via ADB (Alternative Method)
You can also install models via ADB:
1. Create a directory: `modelDir` in `sdcard/Android/data/org.woheller69.ttsengine/files`
2. Place 3 files there:
- `model.onnx` - The converted model file
- `tokens.txt` - The vocabulary file
- `lang` - A text file with:
- Line 1: 3-letter language code (e.g., `eng`)
- Line 2: Model name
At next start, the app will migrate it to the new directory structure and add it to installed languages.
Make sure the model has been converted a described here: [Sherpa ONNX conversion](https://k2-fsa.github.io/sherpa/onnx/tts/piper.html)
## Contribute
For translations use https://toolate.othing.xyz/projects/sherpatts/
# License
This work is licensed under GPLv3 license, © woheller69
- This app is based on the [Sherpa ONNX Project](https://github.com/k2-fsa/sherpa-onnx), published under Apache-2.0 license
- It uses data from [eSpeak NG](https://github.com/espeak-ng/espeak-ng), published under GPLv3 license
- It uses [jsoup](https://github.com/jhy/jsoup), published under MIT license
- At first start it downloads and installs a Piper or Coqui voice model from Hugging Face.
# OTHER APPS
| **RadarWeather** | **Gas Prices** | **Smart Eggtimer** |
|:---:|:---:|:--:|
| [ ](https://f-droid.org/packages/org.woheller69.weather/) | [ ](https://f-droid.org/packages/org.woheller69.spritpreise/) | [ ](https://f-droid.org/packages/org.woheller69.eggtimer/) |
| **Bubble** | **hEARtest** | **GPS Cockpit** |
| [ ](https://f-droid.org/packages/org.woheller69.level/) | [ ](https://f-droid.org/packages/org.woheller69.audiometry/) | [ ](https://f-droid.org/packages/org.woheller69.gpscockpit/) |
| **Audio Analyzer** | **LavSeeker** | **TimeLapseCam** |
| [ ](https://f-droid.org/packages/org.woheller69.audio_analyzer_for_android/) |[ ](https://f-droid.org/packages/org.woheller69.lavatories/) | [ ](https://f-droid.org/packages/org.woheller69.TimeLapseCam/) |
| **Arity** | **Cirrus** | **solXpect** |
| [ ](https://f-droid.org/packages/org.woheller69.arity/) | [ ](https://f-droid.org/packages/org.woheller69.omweather/) | [ ](https://f-droid.org/packages/org.woheller69.solxpect/) |
| **gptAssist** | **dumpSeeker** | **huggingAssist** |
| [ ](https://f-droid.org/packages/org.woheller69.gptassist/) | [ ](https://f-droid.org/packages/org.woheller69.dumpseeker/) | [ ](https://f-droid.org/packages/org.woheller69.hugassist/) |
| **FREE Browser** | **whoBIRD** | **PeakOrama** |
| [ ](https://f-droid.org/packages/org.woheller69.browser/) | [ ](https://f-droid.org/packages/org.woheller69.whobird/) | [ ](https://f-droid.org/packages/org.woheller69.PeakOrama/) |
| **Whisper** | **Seamless** | **SherpaTTS** |
| [ ](https://f-droid.org/packages/org.woheller69.whisper/) | [ ](https://f-droid.org/packages/org.woheller69.seemless/) | [ ](https://f-droid.org/packages/org.woheller69.ttsengine/) |
================================================
FILE: app/.gitignore
================================================
/build
/release/output-metadata.json
================================================
FILE: app/build.gradle.kts
================================================
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "com.k2fsa.sherpa.onnx.tts.engine"
compileSdk = 35
defaultConfig {
applicationId = "org.woheller69.ttsengine"
minSdk = 29
targetSdk = 35
versionCode = 31
versionName = "3.1"
vectorDrawables {
useSupportLibrary = true
}
buildFeatures {
viewBinding = true
buildConfig = true
compose = true
}
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
ndk {
abiFilters.addAll(listOf("armeabi-v7a", "arm64-v8a"))
}
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
composeOptions {
kotlinCompilerExtensionVersion = "1.5.1"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
lint {
disable += "MissingTranslation"
}
}
dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.6.2")
implementation("androidx.activity:activity-compose:1.8.2")
implementation(platform("androidx.compose:compose-bom:2023.08.00"))
implementation("androidx.compose.ui:ui")
implementation("androidx.compose.ui:ui-graphics")
implementation("androidx.compose.ui:ui-tooling-preview")
implementation("androidx.compose.material3:material3")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.9.0")
implementation("com.github.k2-fsa:sherpa-onnx:v1.10.42")
implementation("androidx.preference:preference:1.2.1")
implementation("com.github.woheller69:FreeDroidWarn:+")
implementation("org.jsoup:jsoup:1.22.1")
}
================================================
FILE: app/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
================================================
FILE: app/src/main/AndroidManifest.xml
================================================
================================================
FILE: app/src/main/assets/.gitkeep
================================================
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/aav/vi
================================================
name Vietnamese (Northern)
language vi
words 1 2
pitch 95 175
tone 100 225 800 100 2000 50 5400 75 8000 200
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/aav/vi-VN-x-central
================================================
name Vietnamese (Central)
language vi-vn-x-central
phonemes vi-hue
dictrules 1
words 1
pitch 82 118 //80 118
voicing 90 //18
flutter 20
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/aav/vi-VN-x-south
================================================
name Vietnamese (Southern)
language vi-vn-x-south
phonemes vi-sgn
dictrules 2
words 1
pitch 82 118 //80 118
voicing 90 //18
flutter 20
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/eo
================================================
name Esperanto
language eo
apostrophe 2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/ia
================================================
name Interlingua
language ia
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/io
================================================
name Ido
language io
phonemes eo
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/jbo
================================================
name Lojban
language jbo
speed 80 // speed adjustment, percentage
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/lfn
================================================
name Lingua Franca Nova
language lfn
phonemes base2
l_unpronouncable 0
numbers 2 3
stressLength 150 140 180 180 0 0 200 200
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/piqd
================================================
name Klingon
language piqd
status testing
stressRule 3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/py
================================================
name Pyash
language py
maintainer Logan Streondj
status testing
speed 80 // speed adjustment, percentage
stressRule 0
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/qdb
================================================
name Lang Belta
language qdb
numbers 4 3
replace 1 t ?
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/qya
================================================
name Quenya
language qya
stressRule 2
// rule=penultimate, with qya_rules for light penultimate syllables to move primary stress to the preceding (antepenultimate) syllable
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/art/sjn
================================================
name Sindarin
language sjn
stressRule 2
// rule=penultimate, with sjn_rules for light penultimate syllables to move primary stress to the preceding (antepenultimate) syllable
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/azc/nci
================================================
name Nahuatl (Classical)
language nci
intonation 3
stressRule 2
stressLength 190 190 200 200 0 0 220 240
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/bat/lt
================================================
name Lithuanian
language lt
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/bat/ltg
================================================
name Latgalian
language ltg
maintainer Valdis Vitolins
status testing
phonemes lv
dictionary lv
dictrules 2 // Setting for Latgalian pronunciation
words 0 2
pitch 64 118
tone 60 150 204 100 400 255 700 10 3000 255
stressAmp 12 10 8 8 0 0 15 16
stressLength 160 140 200 140 0 0 240 160
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/bat/lv
================================================
name Latvian
language lv
maintainer Valdis Vitolins
status mature
words 0 2
pitch 67 123
tone 60 150 204 100 400 255 700 10 3000 255
stressAmp 11 8 11 9 0 0 14 12
stressLength 160 120 200 130 0 0 230 180
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/bnt/sw
================================================
name Swahili
language sw
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/bnt/tn
================================================
name Setswana
language tn
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ccs/ka
================================================
name Georgian
language ka
lowercaseSentence // A period followed by a lowercase letter is considered a sentence (mkhedruli)
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/cel/cy
================================================
name Welsh
language cy
intonation 4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/cel/ga
================================================
name Gaelic (Irish)
language ga
dictrules 1 // fix for eclipsis
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/cel/gd
================================================
name Gaelic (Scottish)
language gd
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/cus/om
================================================
name Oromo
language om
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/dra/kn
================================================
name Kannada
language kn
intonation 2
//consonants 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/dra/ml
================================================
name Malayalam
language ml
intonation 2
//consonants 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/dra/ta
================================================
name Tamil
language ta
intonation 2
consonants 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/dra/te
================================================
name Telugu
language te
status testing
intonation 2
//consonants 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/esx/kl
================================================
name Greenlandic
language kl
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/eu
================================================
name Basque
language eu
status testing
stressRule 15
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmq/da
================================================
name Danish
language da
tunes s2 c2 q2 e2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmq/is
================================================
name Icelandic
language is
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmq/nb
================================================
name Norwegian Bokmål
language nb
language no
phonemes no
dictionary no
intonation 4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmq/sv
================================================
name Swedish
language sv
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/af
================================================
name Afrikaans
language af
maintainer Christo de Klerk
status mature
roughness 0
pitch 63 120
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/de
================================================
name German
language de
tunes s4 c1 q4 e1
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en
================================================
name English (Great Britain)
language en-gb 2
language en 2
maintainer Reece H. Dunn
status mature
tunes s1 c1 q1 e1
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-029
================================================
name English (Caribbean)
language en-029
language en 10
maintainer Reece H. Dunn
status mature
phonemes en-wi
dictrules 8
stressLength 175 175 175 175 220 220 250 290
replace 00 D d
replace 00 T t[
replace 00 U@ o@
replace 03 @ a#
replace 03 3 a#
replace 03 N n
formant 1 98 100 100
formant 2 98 100 100
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-scotland
================================================
name English (Scotland)
language en-gb-scotland
language en 4
maintainer Reece H. Dunn
status mature
phonemes en-sc
dictrules 2 5 6 7
stressLength 180 130 200 200 0 0 250 270
replace 03 @ V
replace 03 I i
replace 03 I2 i
replace 01 aI aI2
replace 02 a a/
replace 02 u: U
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-x-gbclan
================================================
name English (Lancaster)
language en-gb-x-gbclan
language en-gb 3
language en 5
maintainer Reece H. Dunn
status mature
phonemes en-n
stressLength 160 150 180 180 220 220 290 290
replace 03 N n
replace 03 i I2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-x-gbcwmd
================================================
name English (West Midlands)
language en-gb-x-gbcwmd
language en-gb 9
language en 9
phonemes en-wm
replace 00 h NULL
replace 00 o@ O@
dictrules 6
intonation 4
stressAdd 0 0 0 0 0 0 0 20
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-GB-x-rp
================================================
name English (Received Pronunciation)
language en-gb-x-rp
language en-gb 4
language en 5
maintainer Reece H. Dunn
status mature
phonemes en-rp
replace 00 o@ O@
replace 03 I i
replace 03 I2 i
replace 03 @ a#
replace 03 3 a#
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-US
================================================
name English (America)
language en-us 2
language en 3
maintainer Reece H. Dunn
status mature
phonemes en-us
dictrules 3 6
stressLength 140 120 190 170 0 0 255 300
stressAmp 17 16 19 19 19 19 21 19
replace 03 I i
replace 03 I2 i
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/en-US-nyc
================================================
name English (America, New York City)
language en-us-nyc
maintainer Richard Calvi
status testing
phonemes en-us-nyc
dictrules 3 6
stressLength 140 120 190 170 0 0 255 300
stressAmp 17 16 19 19 19 19 21 19
replace 03 I i
replace 03 I2 i
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/lb
================================================
name Luxembourgish
language lb
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/gmw/nl
================================================
name Dutch
language nl
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/grk/el
================================================
name Greek
language el
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/grk/grc
================================================
name Greek (Ancient)
language grc
stressLength 170 170 190 190 0 0 230 240
dictrules 1
words 3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/as
================================================
name Assamese
language as
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/bn
================================================
name Bengali
language bn
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/bpy
================================================
name Bishnupriya Manipuri
language bpy
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/gu
================================================
name Gujarati
language gu
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/hi
================================================
name Hindi
language hi
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/kok
================================================
name Konkani
language kok
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/mr
================================================
name Marathi
language mr
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/ne
================================================
name Nepali
language ne
dictrules 1
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/or
================================================
name Oriya
language or
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/pa
================================================
name Punjabi
language pa
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/sd
================================================
name Sindhi
language sd
maintainer Ejaz Shah
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/si
================================================
name Sinhala
language si
status testing
intonation 2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/inc/ur
================================================
name Urdu
language ur
maintainer Ejaz Shah
status testing
stressRule 6
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ine/hy
================================================
name Armenian (East Armenia)
language hy
language hy-arevela
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ine/hyw
================================================
name Armenian (West Armenia)
language hyw
language hy-arevmda
language hy 8
dictionary hy
dictrules 1
phonemes hy
// change consonants for West Armenian pronunciation
replace 00 b p#
replace 00 d t#
replace 00 dz ts#
replace 00 dZ tS#
replace 00 g k#
replace 00 p b
replace 00 t d
replace 00 ts dz
replace 00 tS dZ
replace 00 k g
replace 00 R2 R // ??
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ine/sq
================================================
name Albanian
language sq
// add this line to remove 'ë' at the end of words
// replace 00 @/ NULL
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ira/fa
================================================
name Persian
language fa
maintainer Shadyar Khodayari
status mature
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ira/fa-Latn
================================================
name Persian (Pinglish)
// Sometimes, Farsi speakers write Farsi words using English characters, particularly in Chat and SMS (texte messages).), called Pinglish
language fa-latn
maintainer Shadyar Khodayari
status mature
dictrules 1
phonemes fa
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ira/ku
================================================
name Kurdish
language ku
//words 1 48
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/iro/chr
================================================
name Cherokee //https://github.com/espeak-ng/espeak-ng/blob/master/docs/voices.md
language chr-US-Qaaa-x-west 5
maintainer Michael Conrad
status testing
pitch 90 160
voicing 100
consonants 100 100
speed 100
words 2 1
phonemes chr
//stress on all syllables to simulate stress on no syllables
stressRule 9
stressLength 175 175 175 175 175 175 175 175 //all vowels the same length regardless of stress
stressAmp 10 10 10 10 10 10 10 10 //all vowels the same strength regardless of marked stress
intonation 1
tunes chrs chrc chrq chre
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/itc/la
================================================
name Latin
language la
stressRule 2 0 2
// rule=penultimate
// unstressed_wd1=0
// unstressed_wd2=2
stressOpt 0 5 // flags=0100001 (no automatic secondary stress + don't stres monosyllables)
// short gap between words
words 2
// Note: The Latin voice needs long vowels to be marked with macrons
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/jpx/ja
================================================
name Japanese
language ja
phonemes ja
intonation 4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/ko
================================================
name Korean
language ko
pitch 80 118
intonation 2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/map/haw
================================================
name Hawaiian
language haw
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/miz/mto
================================================
name Totontepec Mixe
language mto
maintainer Bill Dengler and Elizabeth Resendiz
status testing
lowercaseSentence
tunes s6 c6 q6 e6
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/myn/quc
================================================
name K'iche'
language quc
status testing
stressRule 3 // stress on final syllable
stressAmp 8 8 20 15 0 0 25 25 // reduce unstressed vowels
stressLength 120 120 200 150 0 0 250 250 // reduce unstressed vowels
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/poz/id
================================================
name Indonesian
language id
stressLength 160 200 180 180 0 0 220 240
stressAmp 16 18 18 18 0 0 22 21
consonants 80 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/poz/mi
================================================
name Māori
language mi
status testing
// https://github.com/espeak-ng/espeak-ng/blob/master/docs/voices.md#words
words 1 2
// taken from Jacky
pitch 115 130
formant 0 150 155 100
formant 1 90 155 70
formant 2 95 70 64
formant 3 15 20 30
formant 4 20 30 40
formant 5 65 20 65
formant 6 70 80 100
formant 7 20 80 100
formant 8 100 95 80
voicing 135
consonants 110
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/poz/ms
================================================
// Last updated: 14 October 2010, Jason Ong (jason@portalgroove.com)
name Malay
language ms
phonemes id
stressLength 160 200 180 180 0 0 220 240
stressAmp 16 18 18 18 0 0 22 21
intonation 3 // Less intonation, and comma does not raise the pitch.
// Nuance - Peninsula Malaysia
// replace 3 a @ // change 'saya' to 'saye'
// (only the last phoneme of a word, only in unstressed syllables)
consonants 80 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/qu
================================================
name Quechua
language qu
stressRule 2 // stress on penultimate syllable
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/an
================================================
name Aragonese
language an
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/ca
================================================
name Catalan
language ca
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/es
================================================
name Spanish (Spain)
language es
dictrules 1
tunes s6 c6 q6 e6
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/es-419
================================================
name Spanish (Latin America)
language es-419
language es-mx 6
phonemes es-la
dictrules 2
intonation 2
stressLength 170 200 230 180 0 0 250 280
tunes s6 c6 q6 e6
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/fr
================================================
name French (France)
language fr-fr
language fr
dictrules 1
tunes s3 c3 q3 e3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/fr-BE
================================================
name French (Belgium)
language fr-be
language fr 8
dictrules 2
tunes s3 c3 q3 e3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/fr-CH
================================================
name French (Switzerland)
language fr-ch
language fr 8
dictrules 3
tunes s3 c3 q3 e3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/ht
================================================
name Haitian Creole
language ht
status testing
maintainer // TODO somebody should take responsibility for this
phonemes ht
dictionary ht
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/it
================================================
name Italian
language it
maintainer Christian Leo M
status mature
tunes s4 c4 q4 e4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/pap
================================================
name Papiamento
language pap
status testing
phonemes base2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/pt
================================================
name Portuguese (Portugal)
language pt
language pt-pt
phonemes pt-pt
dictrules 1
intonation 2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/pt-BR
================================================
name Portuguese (Brazil)
language pt-br
language pt 6
dictrules 2
stressLength 200 115 230 230 0 0 250 270
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/roa/ro
================================================
name Romanian
language ro
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sai/gn
================================================
name Guarani
language gn
dictrules 1
words 0 1
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sem/am
================================================
name Amharic
language am
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sem/ar
================================================
name Arabic
language ar
phonemes ar
stressRule 4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sem/he
================================================
name Hebrew
language he
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sem/mt
================================================
name Maltese
language mt
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sit/cmn
================================================
name Chinese (Mandarin, latin as English)
language cmn
language zh-cmn
language zh
phonemes cmn
dictionary cmn
words 1
pitch 80 118
dict_min 100000
//for some dialects
//[en]: replace ng with n
//[zh]: ��������ng���n
//replace 0 N n
//[en]: replace rfx consonants
//[zh]: ��������r���l��z��er���e
//replace 0 ts.h tsh
//replace 0 ts. ts
//replace 0 s. s
//replace 0 i. i[
//replace 0 z. l
//replace 0 z. z
//replace 0 @r @
//[en]: replace beginning n or l
//[zh]: ����nl��n���l��l���n
//replace 2 n l
//replace 2 l n
//[en]: replace beginning w with v
//[zh]: w���v
//replace 0 w v
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sit/cmn-Latn-pinyin
================================================
name Chinese (Mandarin, latin as Pinyin)
language cmn-latn-pinyin
language zh-cmn
language zh
phonemes cmn
dictionary cmn
words 1
pitch 80 118
dict_min 100000
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sit/hak
================================================
name Hakka Chinese
language hak
maintainer Chen Chien-ting
status testing
phonemes hak
dictionary hak
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sit/my
================================================
name Myanmar (Burmese)
maintainer Min Maung
language my
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sit/yue
================================================
name Chinese (Cantonese)
language yue
language zh-yue
language zh 8
phonemes yue
dictionary yue
// interpret English letters as 1=English words, 2=jyutping
dictrules 1
words 1
dict_min 10000
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/sit/yue-Latn-jyutping
================================================
name Chinese (Cantonese, latin as Jyutping)
language yue
language zh-yue
language zh 8
phonemes yue
dictionary yue
// interpret English letters as 1=English words, 2=jyutping
dictrules 2
words 1
dict_min 10000
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/tai/shn
================================================
name Shan (Tai Yai)
language shn
maintainer ronaldaug
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/tai/th
================================================
name Thai
language th
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/az
================================================
name Azerbaijani
language az
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/ba
================================================
name Bashkir
language ba
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/cv
================================================
name Chuvash
language cv
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/kk
================================================
name Kazakh
language kk
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/ky
================================================
name Kyrgyz
language ky
tunes s3 c3 q3 e3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/nog
================================================
name Nogai
language nog
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/tk
================================================
name Turkmen
language tk
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/tr
================================================
name Turkish
language tr
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/tt
================================================
name Tatar
language tt
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/ug
================================================
name Uyghur
language ug
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/trk/uz
================================================
name Uzbek
language uz
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/urj/et
================================================
name Estonian
language et
stressAmp 18 16 22 22 20 22 22 22
stressLength 150 180 200 200 0 0 210 250
stressOpt 1 2 4 6 // (S_NO_DIM + S_FINAL_DIM = S_FINAL_DIM_ONLY), S_FINAL_NO_2, S_2_TO_HEAVY
stressRule 0
intonation 3
spellingStress
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/urj/fi
================================================
name Finnish
language fi
stressAmp 18 16 22 22 20 22 22 22
stressLength 150 180 200 200 0 0 210 250
stressOpt 1 2 4 6 // (S_NO_DIM + S_FINAL_DIM = S_FINAL_DIM_ONLY), S_FINAL_NO_2, S_2_TO_HEAVY
stressRule 0
intonation 3
spellingStress
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/urj/hu
================================================
name Hungarian
language hu
brackets 0
bracketsAnnounced 0
pitch 81 117
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/urj/smj
================================================
name Lule Saami
language smj
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zle/be
================================================
name Belarusian
language be
dict_min 2000
speed 95
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zle/ru
================================================
name Russian
language ru
replace 03 a a#
dict_min 20000
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zle/ru-LV
================================================
name Russian (Latvia)
language ru-lv 2
maintainer Valdis Vitolins
status testing
phonemes ru-lv
dictrules 2
dict_min 20000
speed 95
words 0 2
tone 150 220 450 255 750 20 3500 255
stressAmp 12 10 8 8 0 0 16 17
stressLength 160 140 200 140 0 0 240 160
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zle/ru-cl
================================================
name Russian (Classic)
language ru-cl
replace 03 a a#
dict_min 20000
speed 95
dictrules 3
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zle/uk
================================================
name Ukrainian
language uk
maintainer Andrij Mizyk
status testing
speed 80
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zls/bg
================================================
name Bulgarian
language bg
stressAmp 13 12 17 17 20 22 22 21
stressLength 180 170 200 200 200 200 210 220
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zls/bs
================================================
name Bosnian
language bs
phonemes hr
pitch 81 120
formant 0 100 100 100
formant 1 97 97 100
formant 2 97 97 100
formant 3 97 102 100
formant 4 97 102 100
formant 5 97 102 100
stressAdd 10 10 0 0 0 0 -30 -30
dictrules 3 4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zls/hr
================================================
name Croatian
language hr
language hbs
// attributes towards !variant3
pitch 81 120
formant 0 100 100 100
formant 1 97 97 100
formant 2 97 97 100
formant 3 97 102 100
formant 4 97 102 100
formant 5 97 102 100
stressAdd 10 10 0 0 0 0 -30 -30
dictrules 1
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zls/mk
================================================
name Macedonian
language mk
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zls/sl
================================================
name Slovenian
language sl
status testing
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zls/sr
================================================
name Serbian
language sr
// attributes towards !variant3 pitch 80 120
formant 0 100 100 100
formant 1 97 97 100
formant 2 97 97 100
formant 3 97 102 100
formant 4 97 102 100
formant 5 97 102 100
stressAdd 10 10 0 0 0 0 -30 -30
dictrules 2 4
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zlw/cs
================================================
name Czech
language cs
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zlw/pl
================================================
name Polish
language pl
intonation 2
================================================
FILE: app/src/main/assets/espeak-ng-data/lang/zlw/sk
================================================
name Slovak
language sk
================================================
FILE: app/src/main/assets/espeak-ng-data/phondata-manifest
================================================
# This file lists the type of data that has been compiled into the
# phondata file
#
# The first character of a line indicates the type of data:
# S - A SPECT_SEQ structure
# W - A wavefile segment
# E - An envelope
#
# Address is the displacement within phondata of this item
#
# Address Data file
# ------- ---------
W 0x00008 ustop/null
S 0x00158 vowel/@
S 0x0021c vowel/@-
S 0x002e0 vowel/a
S 0x003e4 vowel/e
S 0x004e8 vowel/i
S 0x005ec vowel/oo
S 0x006f0 vowel/u
S 0x007f4 klatt/m-syl
S 0x008f8 m/m-syl
S 0x009bc klatt/n-syl
S 0x00ac0 n/n-syl
S 0x00b84 nn/nn-syl
W 0x00cc8 ustop/percus10
S 0x00ed4 vowelr/r-voc
S 0x01018 vwl_hi/l-voc
S 0x0111c r/r@
S 0x011e0 r/ra
S 0x012a4 r/re
S 0x01368 r/ri
S 0x0142c r/ro
S 0x014f0 r/ru
S 0x015b4 r/xr
S 0x01638 r/_r
S 0x016fc r/tr
S 0x01780 r/r
S 0x01844 r3/r_n
W 0x018c8 r3/rx
S 0x02c20 r/trr
S 0x02ce4 r/rr
S 0x02da8 r3/r_
S 0x02e2c r3/r_trill2
W 0x02ef0 r3/r_trill2.wav
S 0x035fc r3/r_trill
W 0x03700 r3/r_trill.wav
W 0x0416c r3/r_trill3.wav
S 0x045b0 r3/r_uvl
W 0x046b4 r3/r_uvl.wav
S 0x055bc l/l@
S 0x05680 l/la
S 0x05704 l/le
S 0x05788 l/li
S 0x0584c l/lo
S 0x05950 l/lu
S 0x05a14 l/L1_@L
S 0x05b18 l/L1_aL
S 0x05c1c l/L1_eL
S 0x05ce0 l/L1_iL
S 0x05de4 l/L1_oL
S 0x05f28 l/L1_uL
S 0x0602c l/l_
S 0x060b0 l/xl
S 0x06134 l/_l
S 0x061f8 l/tl
S 0x0627c l/l_long
S 0x06300 l/l
S 0x06384 l/L2_eL
S 0x06448 l/L2_uL
S 0x0654c l/L2_@L
S 0x06650 l/L2_aL
S 0x06754 l/L2_iL
S 0x06858 l/L2_oL
S 0x0699c l/l_@
S 0x06a20 l/l_a
S 0x06aa4 l/l_e
S 0x06b28 l/l_i
S 0x06bec l/l_o
S 0x06cb0 l/l_u
S 0x06d34 l^/j2@
S 0x06df8 l^/j2a
S 0x06ebc l^/j2e
S 0x06f80 l^/j2i
S 0x07044 l^/j2o
S 0x07148 l^/j2u
S 0x0724c l^/_l^
S 0x07350 l^/l^
S 0x07454 l^/l_rfx
S 0x07518 ll/xll
S 0x075dc ll/_ll
S 0x076e0 ll/ll
S 0x077a4 w/w@
S 0x07868 w/wa
S 0x0792c w/we
S 0x079f0 w/wi
S 0x07ab4 w/wo
S 0x07b78 w/wu
S 0x07c3c w/xw
S 0x07cc0 w/w
S 0x07d44 w/_w
S 0x07e08 w/iw_
S 0x07f0c w/w_
S 0x07fd0 j/j@
S 0x080d4 j/ja
S 0x081d8 j/je
S 0x082dc j/ji
S 0x083a0 j/jo
S 0x084e4 j/ju
S 0x085a8 j/xj
S 0x0862c j/_j
S 0x086b0 j/j_
S 0x08774 j2/j2@
S 0x08838 j2/j2a
S 0x088fc j2/j2e
S 0x089c0 j2/j2i
S 0x08a84 j2/j2o
S 0x08b88 j2/j2u
S 0x08c4c j2/xj2
S 0x08cd0 j2/_j2
S 0x08d54 klatt/m_
S 0x08e58 klatt/m
S 0x08f5c m/m@
S 0x09060 m/ma
S 0x09164 m/me
S 0x09268 m/mi
S 0x093ac m/mo
S 0x094b0 m/mu
S 0x095b4 m/mj
S 0x09678 m/_m
S 0x096fc m/m_
S 0x097c0 klatt/n
S 0x098c4 n/n@
S 0x099c8 n/na
S 0x09acc n/ne
S 0x09bd0 n/ni
S 0x09cd4 n/no
S 0x09dd8 n/nu
S 0x09edc n/nj
S 0x09fa0 n/_n
S 0x0a024 n/n_
S 0x0a0e8 klatt/nr
S 0x0a1ec n/nr@
S 0x0a2f0 n/nra
S 0x0a3f4 n/nre
S 0x0a4f8 n/nri
S 0x0a5fc n/nro
S 0x0a700 n/nru
S 0x0a804 n/_nr
S 0x0a888 n/nr_
S 0x0a94c klatt/n^@
S 0x0a9d0 klatt/n^
S 0x0aad4 n^/n^@
S 0x0ac58 n^/n^a
S 0x0ad9c n^/n^e
S 0x0af20 n^/n^i
S 0x0b0a4 n^/n^o
S 0x0b268 n^/n^u
S 0x0b3ec n^/_n^
S 0x0b470 n^/n^_
S 0x0b5b4 klatt/nn_
S 0x0b6b8 klatt/nn
S 0x0b7bc nn/nn@
S 0x0b880 nn/nna
S 0x0b944 nn/nne
S 0x0ba08 nn/nni
S 0x0bacc nn/nno
S 0x0bb90 nn/nnu
S 0x0bc54 nn/inn
S 0x0bd18 nn/nnj
S 0x0bd9c nn/_nn
S 0x0be20 nn/nn_
S 0x0bee4 r3/@tap2
S 0x0c028 r3/@tap
S 0x0c16c d/tap1
S 0x0c230 d/tap3
S 0x0c334 d/dr
S 0x0c3b8 r3/@tap_rfx_
S 0x0c4fc r3/@tap_rfx
S 0x0c640 b/xb
S 0x0c704 klatt/b
W 0x0c7c8 x/b_
W 0x0cbe0 x/b
S 0x0cd44 b/b_
S 0x0ce08 b/b@2
S 0x0cf0c b/b@
S 0x0d010 b/ba
S 0x0d114 b/be
S 0x0d218 b/bi
S 0x0d31c b/bo
S 0x0d420 b/bu
S 0x0d524 b/b
S 0x0d628 d/xd
S 0x0d6ec d/d_
W 0x0d7b0 x/d_
S 0x0dbd8 d/d
W 0x0dc9c x/d
W 0x0deb8 x/d_dnt
S 0x0e19c dzh/xdzh
S 0x0e260 dzh/dzh_
W 0x0e324 x/dzh_
S 0x0ed5c dzh/dzh
W 0x0ee20 x/dzh
W 0x0f22c x/dz_pzd
S 0x0f68c dzh/xdz_pzd
S 0x0f750 klatt/dz_pzd_
S 0x0f814 klatt/dz_pzd
S 0x0f8d8 dzh/dz_pzd_
S 0x0f99c dzh/dz_pzd
S 0x0fa60 g/xg
S 0x0fb24 g/g_
W 0x0fbe8 x/g_
S 0x0ffa8 g/g
W 0x1006c x/g2
S 0x102f4 klatt/v_
W 0x103b8 vocw/v
S 0x10cb8 klatt/bh
S 0x10d7c voc/v_
S 0x10e40 voc/bh
S 0x10f04 klatt/v
S 0x10fc8 voc/v
S 0x110cc voc/v#_
S 0x11190 voc/v#
S 0x11294 voc/dh_
W 0x11358 vocw/dh
S 0x11c60 voc/dh
S 0x11d24 voc/z_
W 0x11de8 ufric/s_
S 0x1289c voc/z
S 0x12960 klatt/zh_
W 0x12a24 vocw/zh
S 0x1338c klatt/zh
S 0x13450 voc/zh_
S 0x13514 voc/zh
W 0x135d8 vocw/zh_rfx
S 0x13e68 voc/z_pzd_
W 0x13f2c ufric/s_pzd_
S 0x14a30 voc/z_pzd
W 0x14af4 ufric/s_pzd
W 0x1542c ufric/sh_pzd_
W 0x15ef4 ufric/sh_pzd
S 0x16828 voc/j
W 0x1692c ufric/ch
S 0x17044 klatt/qqh_
W 0x17108 vocw/Q_
S 0x17914 klatt/qqh
W 0x179d8 vocw/Q
S 0x181e4 voc/Q_
S 0x182a8 voc/Q
S 0x1836c voc/Q_ulv
W 0x18470 ufric/xx
W 0x18f6c ustop/p_
W 0x1977c ustop/pr
W 0x19bc4 ustop/p_unasp
W 0x19ef0 ustop/pl
W 0x1a2e8 ustop/p
W 0x1a658 ustop/t_
W 0x1ab18 ustop/tr
W 0x1b278 ustop/t_dnt
W 0x1b688 ustop/t
W 0x1babc ustop/t_hi
W 0x1bd88 ustop/tsh_
W 0x1c6c8 ustop/tsh
W 0x1cd08 ustop/ts_pzd
W 0x1d40c ustop/t_pzd
W 0x1d858 ustop/c
W 0x1db08 ustop/k_
W 0x1dfc4 ustop/kr
W 0x1e604 ustop/ki
W 0x1ebcc ustop/kl
W 0x1f1fc ustop/k_unasp
W 0x1f6d0 ustop/k
W 0x1fba4 ustop/q
W 0x1fd10 ustop/q_u
W 0x1fe30 ufric/f_
W 0x20900 ufric/f
W 0x210f0 ufric/th_
W 0x21970 ufric/th
W 0x22208 ufric/s!
W 0x22ab8 ufric/s
W 0x23258 ufric/sh_
W 0x23d08 ufric/sh
W 0x246b8 ufric/sh_rfx
W 0x25054 ufric/l#
W 0x25a98 ufric/ch_
W 0x263c0 ufric/x_
W 0x26f1c ufric/x_hr
W 0x27830 h/h@
W 0x27d84 h/ha
W 0x28400 h/he
W 0x28a94 h/hi
W 0x2902c h/ho
W 0x296e8 h/hu
W 0x29e0c h/h_
W 0x2a4b8 ustop/ts_
W 0x2ae18 ustop/ts
S 0x2b874 d/xdz
W 0x2b938 ustop/p_unasp_
W 0x2ba74 ustop/p_asp
W 0x2bf78 ustop/t_short
W 0x2c1bc ustop/ts_pzd_
W 0x2c680 ustop/ts_pzd2
W 0x2c9b4 ustop/k_asp
W 0x2d0b8 ustop/k_asp_e
W 0x2d820 ustop/k_asp_a
W 0x2e0a4 ufric/s_continue
S 0x2e854 vowel/a#
S 0x2e958 vowel/a_2
S 0x2ea5c vowel/ee_1
S 0x2eba0 vowel/o
S 0x2ece4 vowel/oo_4
S 0x2ede8 vowel/u_bck
S 0x2eeec vowel/uu_2
S 0x2eff0 vowel/y
S 0x2f134 vowel/y#
S 0x2f238 vdiph/au_4
S 0x2f3bc vdiph/eu
S 0x2f500 vdiph2/iu
S 0x2f684 vdiph/ai
S 0x2f7c8 vdiph/ei
S 0x2f90c vdiph/eei
S 0x2fa90 vdiph/oi
S 0x2fc54 vdiph/ui
S 0x2fd98 w/w2
W 0x2fe5c ustop/t_dnt2
S 0x300b4 vowel/ii_5
S 0x301b8 vowel/e_mid2
S 0x302bc vowel/ii#_2
S 0x303c0 vdiph/ai_5
S 0x30504 vowel/a_6
S 0x30608 vdiph/@i_2
S 0x3074c vowel/@_3
S 0x30810 vowel/o-_4
S 0x30914 vowel/u_2
W 0x30a18 ustop/tsh_unasp
W 0x30ed8 ustop/k_ejc
W 0x31688 vwl_ar/hah
W 0x325ec vwl_ar/dhad
W 0x3364c vwl_ar/shin
S 0x34428 vowel/aa_7
S 0x3452c vowel/u_7
S 0x34630 vowel/ii#
S 0x34734 vowel/oe
S 0x34838 vowel/o_mid
S 0x3493c vowel/@_2
S 0x34a40 vowel/ee
S 0x34b44 vowel/aa_8
S 0x34c48 vowel/0_3
S 0x34d4c vowel/e_6
S 0x34e50 vowel/ii
E 0x34f54 envelope/i_risefall
E 0x34fd4 envelope/p_fall
E 0x35054 envelope/p_214
E 0x350d4 envelope/p_rise
E 0x35154 envelope/p_level
S 0x351d4 n/n_long_
S 0x35298 nn/nn2_
W 0x3535c ustop/t_unasp2
W 0x35468 ustop/k_unasp_
W 0x35724 ustop/tsh_pzd_unasp
W 0x35f74 ustop/tsh_pzd
W 0x36ab4 ufric/sh_pzd2
W 0x37604 ustop/ts_unasp
W 0x37e7c ustop/ts_rfx_unasp
W 0x38a68 ustop/ts_rfx
S 0x39748 vwl_zh/a_n
S 0x3984c vowel/aa_2
S 0x399d0 vowel/a_3
S 0x39ad4 vdiph/ai_6
S 0x39c98 vwl_zh/aau
S 0x39ddc vowel/@_bck
S 0x39ee0 vowel/3_2
S 0x3a024 vowelr/V3_r
S 0x3a168 vowel/ee_2
S 0x3a26c vdiph2/ei_4
S 0x3a3b0 vowel/ii_2
S 0x3a4b4 vowel/i#_7
S 0x3a5b8 vowel/i#_6
S 0x3a6bc vwl_zh/iaa
S 0x3a800 vwl_zh/iaau
S 0x3a984 vwl_zh/ie
S 0x3aac8 vdiph2/iioo
S 0x3ac0c vwl_zh/iou
S 0x3ad90 vnasal/oo_n2
S 0x3aed4 vdiph2/o_oo
S 0x3b018 vowel/8
S 0x3b11c vdiph/8u
S 0x3b260 vwl_zh/ong
S 0x3b3e4 vnasal/u_n
S 0x3b4e8 vwl_zh/uaa
S 0x3b62c vdiph2/oa
S 0x3b770 vwl_zh/uai
S 0x3b8f4 vdiph2/o@
S 0x3ba78 vwl_zh/uei
S 0x3bbfc vwl_zh/uo
S 0x3bd80 vowel/uu_3
S 0x3be44 vowel/y_2
S 0x3bf88 vdiph2/yu
S 0x3c10c vwl_zh/y&
S 0x3c250 vwl_zh/yee
S 0x3c394 vdiph2/y@
S 0x3c4d8 vdiph/yi
S 0x3c61c vowel/ii_3
S 0x3c720 vowel/oo_2
S 0x3c824 vowel/i#
S 0x3c928 vowel/o_2
S 0x3ca6c vdiph/aai_2
S 0x3cc30 vdiph/ai_2
S 0x3cdf4 vdiph2/iu_4
S 0x3cf38 vdiph/ooi
S 0x3d0fc vdiph/ui_3
S 0x3d280 vowel/a#_3
S 0x3d384 r/a_
S 0x3d448 vowel/i_4
S 0x3d54c vowel/&
S 0x3d650 vowel/a_8
S 0x3d754 vowel/o_5
S 0x3d858 vowel/V_4
S 0x3d95c vowel/yy
S 0x3da60 vowel/V
S 0x3db64 r/aa
S 0x3dc68 r2/r2@
S 0x3dd2c r2/r2a
S 0x3ddf0 r2/r2e
S 0x3def4 r2/r2i
S 0x3dfb8 r2/r2o
S 0x3e07c r2/r2u
S 0x3e140 vowel/@_6
S 0x3e244 vwl_en/@L
S 0x3e308 vowel/ee_5
S 0x3e40c vowel/ii#_3
S 0x3e510 vowel/ii_4
S 0x3e614 vowel/ii_7
S 0x3e718 vowel/0
S 0x3e81c vowel/V_2
S 0x3e920 vowel/8_2
S 0x3ea24 vowel/uu
S 0x3eb28 vowel/3_en
S 0x3ec6c w/wi2
S 0x3ed70 vowel/i_en
S 0x3eeb4 vowel/oo_en
S 0x3eff8 vwl_en/u_L
S 0x3f13c vdiph2/uw_2
S 0x3f280 vdiph/au
S 0x3f404 vdiph/@u_en
S 0x3f588 vdiph2/ii@
S 0x3f70c vdiph2/8@
S 0x3f850 vdiph2/uu@
S 0x3f9d4 vwl_en/aI@
S 0x3fb98 vwl_en/aU@
S 0x3fd1c vowelr/V_r
S 0x3fe60 vnasal/aa_n2
S 0x3ffa4 vowel/oo_1
S 0x400e8 vdiph/eei_2
S 0x4022c vdiph/ooi_2
S 0x403f0 vowel/aa_9
S 0x404f4 vowel/aa
S 0x405f8 vowel/e#
S 0x406fc vowel/e_7
S 0x40800 vowel/ee#_2
S 0x40904 vowel/i_8
S 0x40a08 vowel/i_7
S 0x40b0c vowel/u_bck2
S 0x40c10 vowel/u_bck3
S 0x40d14 vowel/u_5
S 0x40e18 vowel/8_7
S 0x40f1c vowel/8_4
S 0x41020 vdiph/&i
S 0x41164 vdiph/@i
W 0x412a8 ufric/s_pal
S 0x41b5c d/xd_pzd
W 0x41c20 x/d_pzd
S 0x42034 vdiph/ou_2
S 0x42178 vowel/aa#
S 0x4227c vowel/uu_4
S 0x42380 vdiph/aai_3
S 0x42504 vdiph/y#i
S 0x42648 vdiph/ui_4
S 0x4278c vdiph/aau
S 0x42910 vdiph/ou
S 0x42a54 vdiph/eu_2
S 0x42b98 vdiph2/iu_2
S 0x42d1c vdiph/&y
S 0x42e60 vdiph/eey
S 0x42fa4 vdiph/y#y
S 0x430e8 vdiph2/iy
S 0x4322c vdiph2/uo
S 0x43370 vdiph2/ie
S 0x434b4 vdiph2/y-y#
S 0x435f8 r3/r_trill_short
W 0x436fc h/hu_fi
S 0x43fec vowel/@_4
S 0x440b0 vowel/ee_4
S 0x441b4 vowel/u#_2
S 0x442b8 vowel/oe_2
S 0x443bc vwl_fr/y2r
S 0x44440 vwl_fr/e_2r
S 0x444c4 vwl_fr/aa2r
S 0x44548 vwl_fr/ee2r
S 0x4460c vwl_fr/oo2r
S 0x446d0 vwl_fr/@2r
S 0x44754 vwl_fr/a2r
S 0x447d8 vwl_fr/e2r
S 0x4485c vwl_fr/i2r
S 0x448e0 vwl_fr/o2r
S 0x44964 vwl_fr/u2r
S 0x449e8 vwl_fr/re2
S 0x44a6c vwl_fr/r@2
S 0x44af0 vwl_fr/raa
S 0x44b74 vwl_fr/ree
S 0x44bf8 vwl_fr/ry
S 0x44c7c vwl_fr/rw
S 0x44d00 vwl_fr/roo
S 0x44d84 vwl_fr/rj
S 0x44e08 vwl_fr/r@
S 0x44e8c vwl_fr/ra
S 0x44f10 vwl_fr/re
S 0x44f94 vwl_fr/ri
S 0x45018 vwl_fr/ro
S 0x4509c vwl_fr/ru
S 0x45120 vwl_fr/r
S 0x451a4 vwl_fr/trr
S 0x45268 vwl_fr/rr
S 0x452ec vwl_fr/r_@
S 0x45370 vwl_fr/r_a
S 0x453f4 vwl_fr/r_e
S 0x45478 vwl_fr/r_i
S 0x454fc vwl_fr/r_o
S 0x45580 vwl_fr/r_u
S 0x45604 vwl_fr/r_y
S 0x45688 vwl_fr/r_n
S 0x4574c vwl_fr/r_
S 0x457d0 vwl_fr/tr
S 0x458d4 vwl_fr/br
S 0x459d8 vwl_fr/lo
S 0x45a5c l/l_y
S 0x45ae0 vowel/@_hgh
S 0x45ba4 vowel/a_7
S 0x45ca8 vowel/e_8
S 0x45dac vowel/e_mid
S 0x45eb0 vwl_fr/j
S 0x45fb4 vowel/o_8
S 0x460f8 vowel/o_mid2
S 0x461fc vwl_fr/wa
S 0x462c0 vnasal/aa_n4
S 0x46404 vnasal/W_n
S 0x46548 vnasal/o_n5
S 0x4668c b/xbr
S 0x46750 b/br
S 0x467d4 d/xdr
S 0x46898 g/xgr
S 0x4695c g/gr
W 0x46a20 x/g
W 0x46ce0 ustop/t_short_
S 0x46f6c vwl_af/r@
S 0x47030 vwl_af/@
S 0x470f4 vowel/a_4
S 0x471f8 vdiph/@u_3
S 0x4737c vdiph2/i@
S 0x47540 vdiph2/u@
S 0x476c4 vnasal/a#_n2
S 0x477c8 vnasal/a_n
S 0x4790c vnasal/e_n
S 0x47a10 vnasal/i_n
S 0x47b14 vnasal/o_n
S 0x47c58 vowel/yy_4
S 0x47d5c vowel/o-
S 0x47e60 vwl_lv/a
S 0x47f64 vwl_lv/aa
S 0x48028 vwl_lv/e
S 0x480ec vwl_lv/ee
S 0x481b0 vwl_lv/i
S 0x48274 vwl_lv/ii
S 0x48338 vwl_lv/o
S 0x483fc vwl_lv/oo
S 0x484c0 vwl_lv/u
S 0x48584 vwl_lv/uu
S 0x48648 vdiph/aai
S 0x487cc vdiph2/ie_2
S 0x48910 vdiph2/ua
S 0x48a14 vowel/@_low
S 0x48ad8 vowel/V_3
S 0x48bdc vowel/i_fnt
S 0x48ce0 vowel/ii_6
S 0x48da4 vowel/e_2
S 0x48ea8 vdiph/ee-e
S 0x48fec vowel/a_5
S 0x490f0 vowel/uu_bck
S 0x491f4 vnasal/i_n2
S 0x492f8 vnasal/ii_n
S 0x493fc vnasal/ee_n2
S 0x49540 vnasal/V_n
S 0x49644 vdiph/aau_3
S 0x497c8 d/xd3
W 0x4988c ustop/th_rfx2
S 0x49e90 g2/xg
W 0x49f54 ustop/percus02
W 0x4a284 ustop/ts2
S 0x4a754 vowel/y#_2
S 0x4a858 vowel/e_3
S 0x4a95c vowel/e_e
S 0x4aa60 vowel/a#_2
S 0x4ab64 vowel/oo_5
S 0x4ac68 vowel/y##
S 0x4ad6c vowel/y#_3
S 0x4ae70 vdiph/ai_7
S 0x4aff4 vdiph/ou_3
S 0x4b0f8 vdiph/y#i_2
S 0x4b23c m/m#_
S 0x4b340 n/n#_
S 0x4b444 n^/n^#_
S 0x4b548 nn/nn#_
W 0x4b64c ufric/tl#
S 0x4bfb4 r3/r#_
S 0x4c038 vowel/oo_3
W 0x4c0fc ustop/k_asp_u
W 0x4c92c ufric/x2
S 0x4d284 vowel/aa_6
S 0x4d3c8 vowel/u#_7
S 0x4d4cc vowel/V_6
W 0x4d5d0 ustop/t_unasp
W 0x4d708 ustop/ts_pzd3
S 0x4dd88 vowel/i_2
S 0x4de8c vdiph/aau_2
S 0x4dfd0 vdiph/ae
S 0x4e114 vdiph/eeu_2
S 0x4e258 vdiph/ae_2
S 0x4e3dc vdiph/eei_5
S 0x4e520 vwl_ru/ee
S 0x4e664 vdiph2/ea
S 0x4e7a8 vowel/i_3
S 0x4e8ac vowel/i_6
S 0x4e9b0 vdiph2/uaa
S 0x4eb34 vdiph/eei_3
S 0x4ec78 vwl_lv/e2
S 0x4ed3c vwl_lv/ee2
S 0x4ee00 vwl_lv/y
S 0x4ef04 vwl_lv/yy
S 0x4f008 vwl_lv/ai
S 0x4f18c vwl_lv/au
S 0x4f310 vwl_lv/ei
S 0x4f454 vwl_lv/ie
S 0x4f598 vwl_lv/iu
S 0x4f71c vwl_lv/ui
S 0x4f860 vwl_lv/ua
S 0x4f964 vwl_lv/oi
W 0x4fb28 h/h-lv
S 0x504a8 l^/l^_
W 0x505ac myanmar/k
W 0x5149c myanmar/kh
W 0x520b4 myanmar/g.wav
S 0x52ef8 myanmar/ny
W 0x530bc myanmar/s
W 0x54258 myanmar/hs
W 0x553f4 myanmar/z
W 0x564dc myanmar/t_short
W 0x5662c myanmar/ht
W 0x571b4 myanmar/d
W 0x57d28 myanmar/p
W 0x58c54 myanmar/t_hi
W 0x58f20 myanmar/h
S 0x5a228 myanmar/yy
S 0x5a42c myanmar/a
S 0x5a4b0 myanmar/ky
W 0x5a6f4 myanmar/by.wav
W 0x5ac00 myanmar/ch.wav
W 0x5b454 myanmar/gya.wav
W 0x5c7d8 myanmar/htya.wav
W 0x5db1c myanmar/phya.wav
W 0x5e7d4 myanmar/pya.wav
W 0x5fc58 myanmar/ty.wav
W 0x60f18 myanmar/sh.wav
S 0x61b2c myanmar/a01
S 0x61c30 myanmar/a02
S 0x61db4 myanmar/a03
S 0x62038 myanmar/a04
S 0x620fc myanmar/a05
S 0x62200 myanmar/a06
S 0x62584 myanmar/a07
S 0x626c8 myanmar/a08
S 0x6284c myanmar/a09
S 0x62b50 myanmar/a11
S 0x62cd4 myanmar/a12
S 0x62f98 myanmar/a14
S 0x6315c myanmar/a13
S 0x633e0 myanmar/a17
S 0x636a4 myanmar/a16
S 0x639a8 myanmar/a20
S 0x63b2c myanmar/a19
S 0x63d70 myanmar/a21
S 0x64034 myanmar/a23
S 0x64138 myanmar/a22
S 0x642bc myanmar/a24
S 0x64600 myanmar/a29
S 0x64744 myanmar/a28
S 0x64988 myanmar/a30
S 0x64d0c myanmar/a32
S 0x64f50 myanmar/a31
S 0x65214 myanmar/a33
S 0x65318 myanmar/a35
S 0x655dc myanmar/a34
S 0x658a0 myanmar/a36
S 0x65ba4 myanmar/a43
S 0x65de8 myanmar/a42
S 0x6602c myanmar/a44
S 0x66430 myanmar/a49
S 0x665b4 myanmar/a50
S 0x66838 myanmar/a46
S 0x66a3c myanmar/a45
S 0x66c40 myanmar/a47
S 0x66f44 myanmar/a25
S 0x67088 myanmar/a26
S 0x672cc myanmar/a27
S 0x67490 myanmar/a37
S 0x67654 myanmar/a38
S 0x67798 myanmar/a39
S 0x679dc myanmar/a40
S 0x67b60 myanmar/a41
S 0x67ce4 vowel/y_4
S 0x67de8 vwl_no/y#
S 0x67eec vwl_no/&
S 0x67ff0 vwl_no/u#
S 0x680f4 vwl_no/u#2
S 0x68238 vdiph/0i_2
S 0x683bc vdiph/ai_3
S 0x68500 vwl_no/y#y
S 0x68644 vwl_no/au-
S 0x68808 vowel/ee#
S 0x6890c vnasal/ee_u_n
S 0x68a90 vnasal/oo_n3
S 0x68c14 vowel/aa_3
W 0x68d18 vocw/Q2
W 0x695e4 ustop/tsh_asp
W 0x6a24c x/g3
S 0x6a434 vwl_ro/mi
S 0x6a578 vwl_ru/ii-
S 0x6a63c vwl_ru/ii
S 0x6a740 vwl_ru/ii#
S 0x6a804 vwl_ru/i#
S 0x6a908 vwl_ru/e
S 0x6aa0c vwl_ru/E#
S 0x6ab10 vwl_ru/E@
S 0x6ac14 vwl_ru/o
S 0x6ad18 vwl_ru/oo
S 0x6addc vwl_ru/u
S 0x6aee0 vwl_ru/u#
S 0x6b024 vwl_ru/u#u
S 0x6b168 vwl_ru/8
S 0x6b22c vwl_ru/ju
S 0x6b330 vwl_ru/ja
S 0x6b4b4 vwl_ru/a
S 0x6b5b8 vwl_ru/aa
S 0x6b6bc r3/r_ru2
W 0x6b7c0 r3/r_ru
S 0x6bac4 vwl_it/o_open
S 0x6bbc8 vdiph/eeu
S 0x6bd0c vdiph/au_2
S 0x6be90 vdiph/ooi_3
S 0x6c014 vdiph/aau_4
S 0x6c198 vowel/8_6
S 0x6c29c vdiph/ooi_4
S 0x6c3e0 vdiph2/ye
S 0x6c524 l/l_front_
S 0x6c668 l/l_front
S 0x6c76c l/l_4
S 0x6c830 vowel/ee_6
S 0x6c8f4 vowel/y_5
S 0x6ca38 vowel/yy_3
S 0x6cb3c vowel/oe_4
S 0x6cc00 vowel/aa_4
W 0x6cd04 ufric/sx_sv
S 0x6d54c vowel/o_4
W 0x6d650 ustop/t_hard
W 0x6d890 ufric/sh3
S 0x6e224 vwl_tn/r@
S 0x6e2e8 vwl_tn/@
S 0x6e3ac vwl_tn/I
S 0x6e470 vdiph/i@_2
S 0x6e5f4 vowel/0_2
W 0x6e6f8 ufric/tlh
E 0x6fc14 envelope/p_fallrise
E 0x6fc94 envelope/vi_5amp
E 0x6fd14 envelope/p_512
E 0x6fd94 envelope/vi_6amp
S 0x6fe14 vietnam/a_2
S 0x6ff58 vietnam/aa
S 0x7005c vietnam/e_e_2
S 0x70160 vietnam/e
S 0x70264 vietnam/e_short_1
S 0x703e8 vietnam/i
S 0x704ec vietnam/i_2
S 0x705f0 vietnam/oo
S 0x70734 vietnam/o_2
S 0x70878 vietnam/u
S 0x7097c vietnam/y_2
S 0x70a80 vietnam/V_2
S 0x70b84 vietnam/@_2
S 0x70c88 vdiph/&i_2
S 0x70dcc vdiph/u-i
S 0x70f10 vdiph/@u
S 0x71054 vdiph2/ii@_3
S 0x711d8 vietnam/y@
S 0x7131c vietnam/u@
S 0x714a0 vietnam/o#
S 0x715e4 vietnam/O_short_2
S 0x71728 vietnam/oe
S 0x7186c vietnam/ie
S 0x719b0 vnasal/oi_n
S 0x71b74 vdiph/@i_3
S 0x71cb8 vowel/u_3
W 0x71dbc vietnam/c_2
W 0x722f8 vietnam/c
S 0x72834 n/nm
S 0x728f8 l/l_vi
W 0x729fc vietnam/th
W 0x72fec vietnam/tr
W 0x732dc vietnam/dda_2
W 0x737a8 vietnam/ch
W 0x73d04 vietnam/w
S 0x73f5c vietnam/_w
S 0x74020 vietnam/w_
S 0x740e4 vietnam/n^_
W 0x74228 vietnam/hi
W 0x74594 vietnam/hu
S 0x74c18 vwl_zh/ang
S 0x74e1c vwl_zh/aang
S 0x75060 vwl_zh/eng
S 0x75264 vwl_zh/ing
S 0x754a8 vwl_zh/ng
S 0x755ec vwl_zh/oeng
S 0x757b0 vwl_zh/ung
S 0x75934 vowel/8_3
S 0x75a38 vdiph/y#y_2
W 0x75bbc ustop/tsh_sr
E 0x764d4 envelope/chr_fall21
E 0x76554 envelope/chr_level2
E 0x765d4 envelope/chr_rise23
E 0x76654 envelope/chr_fall32
E 0x766d4 envelope/chr_level3
E 0x76754 envelope/chr_rise4
E 0x767d4 envelope/chr_fall43
S 0x76854 vnasal/a#_n
W 0x76958 x/dz_pzd_
S 0x77048 vwl_es/oo_
S 0x7710c vwl_es/ooi_
S 0x77290 vwl_es/ooi
S 0x77414 voc/v2
W 0x774d8 ufric/z_eu
W 0x77ee0 ufric/ts_eu
W 0x78888 ufric/tz_eu
S 0x792f4 vdiph/0i
S 0x794b8 vdiph/oou
S 0x795fc vwl_it/a
S 0x79700 vwl_it/e_open
S 0x79804 vwl_it/i
S 0x79908 vwl_it/o
S 0x79a4c vwl_it/u
S 0x79b50 vowel/8_5
S 0x79c54 vowel/o_7
S 0x79d58 vdiph/eeu_3
S 0x79e9c vnasal/a#u_n
S 0x79fe0 vowel/ee_3
S 0x7a0a4 d/x_tap
S 0x7a168 d/tap2
S 0x7a22c vwl_ro/li
S 0x7a330 vwl_ro/ni
S 0x7a434 vwl_ro/ii-
S 0x7a4f8 vowel/i#_5
S 0x7a5fc vdiph/ii
S 0x7a7c0 vdiph/i#i
S 0x7a904 vdiph2/uw_3
S 0x7aa48 vdiph2/eo
S 0x7abcc vdiph2/e_u
S 0x7ad10 d/tap_i
S 0x7add4 d/tap
S 0x7ae98 vowel/u#
S 0x7af9c vowel/@_fr
S 0x7b060 vowel/o-_2
S 0x7b164 vowel/aa_5
S 0x7b2a8 vwl_en_n/O@
S 0x7b3ac vdiph2/uw_4
S 0x7b4f0 vdiph2/ee@
S 0x7b634 vowel/ii_final
S 0x7b738 vowel/o-_3
S 0x7b83c vwl_en_rp/aa
S 0x7b980 vowel/3_3
S 0x7bac4 vowel/uu#_2
S 0x7bbc8 vdiph/au_3
S 0x7bd4c vdiph/@u_2
S 0x7be90 vdiph2/ei_2
S 0x7bfd4 vdiph2/ee@_2
S 0x7c118 vwl_en_rp/i@
S 0x7c29c vwl_en_rp/aU@
S 0x7c420 vowel/e_5
S 0x7c524 vowel/u#_4
S 0x7c628 vowelr/aa_r
S 0x7c7ec vowelr/e_r
S 0x7c970 vowel/i_5
S 0x7ca74 vwl_en_us/or
S 0x7cbb8 vowelr/oo_r
S 0x7ccbc vdiph/au#
S 0x7ce00 vowel/o_3
S 0x7cf44 vwl_en/aI@_2
S 0x7d0c8 vdiph2/e@
S 0x7d20c vowelr/i_r
S 0x7d350 vdiph2/u#@
S 0x7d494 vwl_en/@L_2
S 0x7d598 vwl_en_us/3_us
S 0x7d69c vowel/@_low2
S 0x7d760 vwl_en_us/ar
S 0x7d8a4 vwl_en_us/a
S 0x7d9a8 vwl_en_us/ee
S 0x7daac vwl_en_us/aar
S 0x7dc30 vwl_en_us/3_us2
S 0x7dd74 vwl_en_us/oor
S 0x7def8 vdiph2/uw_6
S 0x7e03c vdiph/aoo
S 0x7e180 vwl_en_us/ai
S 0x7e304 vwl_en_us/er
S 0x7e488 vwl_en_us/ir
S 0x7e60c vwl_en_us/ur
S 0x7e750 vwl_en_us/ai@
S 0x7e8d4 vwl_en_us/ai3
S 0x7ead8 vwl_en_us/aU@
S 0x7ec9c klatt/x_tap
S 0x7ed60 klatt/tap2
S 0x7ee24 vwl_en_us_nyc/a_raised
S 0x7ef28 vwl_en_us_nyc/a
S 0x7f02c vwl_en_us_nyc/0_3
S 0x7f130 vwl_en_us_nyc/aa_8
S 0x7f234 vwl_en_us_nyc/@i
S 0x7f3f8 vowel/@_fnt
S 0x7f4fc vdiph2/ei_3
S 0x7f640 vdiph/Vu_2
S 0x7f7c4 vdiph2/i@_2
S 0x7f948 vwl_en/ooi@
S 0x7fb0c vwl_af/I
S 0x7fbd0 l/L_eL_af
S 0x7fc94 vowel/y_3
S 0x7fd98 vdiph2/iu_3
S 0x7ff5c vdiph/Vu
S 0x800e0 vdiph/ai_4
S 0x80264 vdiph/oi_2
S 0x80428 vdiph/ui_2
S 0x805ac vdiph2/y#@
S 0x806f0 vnasal/aa_n3
S 0x80834 vnasal/o_n2
S 0x80978 vdiph/aau_6
S 0x80afc vwl_de/y#
S 0x80c00 l/l_3
S 0x80c84 j/_j_short
S 0x80d08 vdiph2/i@_3
S 0x80e8c vwl_de/uu_@
S 0x80fd0 vdiph2/ii@_2
S 0x81154 vowel/ii_8
S 0x81258 vowel/y#_4
S 0x8135c vowel/o_6
S 0x81460 vowel/a#_4
S 0x81564 vdiph/y#y_3
S 0x81668 vdiph/ou_4
S 0x817ac voc/Q_less
S 0x81870 vnasal/&_n
W 0x81974 ustop/ki_ejc
S 0x81d80 vdiph/Vi
S 0x81f04 vowel/u_6
S 0x82008 vowel/u#_3
S 0x8210c vdiph/ai_8
S 0x82290 voc/murmur1
S 0x823d4 vdiph/@i_4
S 0x82558 vnasal/ai_n
S 0x8269c vdiph/a#u
S 0x82820 vnasal/au_n
S 0x82964 d/dr2
S 0x82a28 vowel/&_2
W 0x82b2c ustop/tsh_unasp2
W 0x82f74 r3/rz_cs
S 0x83a20 voc/zh_2
W 0x83ae4 ustop/tsh2
S 0x841f0 dzh/dzh2
W 0x842b4 ustop/t_sr
S 0x845ec d/d_dnt
W 0x846b0 ufric/ch_sr
W 0x85290 ufric/x_sr
W 0x85b10 ustop/ts_sr
S 0x862cc vowel/&_3
S 0x863d0 vwl_fr/@R
S 0x864d4 vietnam/a
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Alex
================================================
language variant
name Alex
voicing 70
pitch 105 115
flutter 0
formant 1 110 115 100
formant 2 100 110 100
formant 3 100 80 75
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Alicia
================================================
language variant
name Alicia
gender female
pitch 180 275
echo 40 50
formant 0 115 115 110
formant 1 130 160 120
formant 2 150 110 150
formant 3 135 150 100
formant 4 120 120 120
formant 5 120 120 120
formant 6 100 110 105
formant 7 100 110 160
formant 8 200 120 100
intonation 2
voicing 38
consonants 100 20
roughness 1
stressAdd 1 64 64 50 50 100 100 200
stressAmp 12 12 20 20 12 12 20 20
breathw 150 150 200 200 400 400 600 600
breath 0 4 5 2 3 13 3 2
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Andrea
================================================
language variant
name Andrea
gender female
pitch 200 265
roughness 0
formant 0 100 100 100
formant 1 110 100 80
formant 2 110 80 80
formant 3 115 110 80
formant 4 115 80 100
formant 5 95 50 100
formant 6 0 0 0
formant 7 120 100 100
formant 8 110 100 100
intonation 3
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
voicing 150
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Andy
================================================
language variant
name Andy
gender Male
pitch 85 110
flutter 0
formant 0 80 80 80 80
formant 1 100 100 100 120
formant 2 100 88 100
formant 3 0 0 0
formant 4 80 80 80
formant 5 80 80 80
formant 6 0 0 0
formant 7 0 0 0
formant 8 0 0 0
stressAdd 0 0 0 0 0 0 0 200
stressAmp 35 35 35 35 35 35 35 35 35
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Annie
================================================
language variant
name Annie
gender female
pitch 120 280
formant 0 105 125 120
formant 1 120 140 120
formant 2 120 150 140
formant 3 130 150 130
formant 4 120 120 110
formant 5 120 120 110
formant 6 120 140 130
formant 7 120 140 130
formant 8 120 140 130
intonation 1
voicing 30
consonants 110 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/AnxiousAndy
================================================
language variant
name anxiousAndy
gender Male
pitch 115 110
flutter 0
formant 0 80 80 80 80
formant 1 100 100 100 120
formant 2 100 100 100
formant 3 0 0 0
formant 4 0 0 0
formant 5 100 100 100
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
stressAdd 100 100 100 100 100 100 100 300
stressAmp 35 35 35 35 35 35 35 35 35
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Demonic
================================================
##Ten en cuenta que los 2 signos de número en este archivo tienen explicaciones de las comfiguraciones que puede aplicar y cómo comfigurarlas
## Language Establece el idioma de la voz. Esta opción es necesaria para cualquier comfiguración que realices
##La siguiente línea es una configuración que puede cambiar. Sin embargo, si no conoce los códigos de idioma, puede ser mejor dejar la configuración tal y como está.
language variant
## La configuración de nombre es el nombre que aparecerá en la configuración de voz en el cuadro combinado de variante.
##La siguiente línea es una opción que puede cambiar
name Demonic
##La siguiente línea establece el género de la voz. Male or Female (hombre o mujer)
##La siguiente línea es una opción que puede cambiar
gender male
flutter 5
stressAmp 20 18 20 20 20 22 22 22
##Las opciones de formantes
## Formant 0 es usado para dar una baja frecuencia a los sonnidos
## Los tres números son frecuencia, fuerza y ancho, en orden. Ten en cuenta que los números están separados por espacios
##La siguiente línea es una opción que puede cambiar
formant 0 100 100 100
# Formant 1, 2, y 3 son las 3 formantes estándar para definir las vocales.
##Las siguientes 3 líneas son opciones que puedes cambiar
formant 1 70 100 100
formant 2 80 100 90
formant 3 80 160 90
# Formants 4 y 5 afectan a f3. Esto afectará la calidad de la voz.
##Las siguientes 2 líneas son comfiguraciones que puede cambiar.
formant 4 80 85
formant 5 100 100 80
## Formantes 6, 7 y 8 son opciones que te ofrecen un sonido más claro de las vocales
##Las siguientes 3 líneas son opciones que puedes cambiar
formant 6 80 80 100
formant 7 130 130 110
formant 8 120 120 150
##Intonation afecta el ascenso y la caída de la voz
## Las opciones son: 1 predeterminado, 2 entonación media, 3 entonación media y no afecta a las comas, 4 al final de la oración o punto aumenta el tono de la voz.
##La siguiente línea es una opción que puedes cambiar.
intonation 10
# Establecer el rango de tono. El primer número le da un tono base a la voz (valor en hz). El segundo número controla el rango de tonos usado por la voz. Poniéndolo igual
# si los 2 números son iguales, la voz será monótona. Por defecto los ajustes son 82 y 118
pitch 43 120
## La configuración del tono. El primer número en la línea de configuración, 600, es la configuración de frecuencia para la cantidad de graves en la voz.
## El segundo número en la línea de tono es el volumen de la frecuencia de graves. Puede configurarlo de 0 a 255, siendo 0 la menor cantidad, 255 la mayor.
##El tercer número en la línea de tono, 1200, es la frecuencia de rango medio. El cuarto número en la línea es la configuración para cambiar el volumen de la frecuencia de rango medio.
##0 es la menor cantidad y 255 es la mayor.
## El quinto número en la línea de tono, 2000, es la frecuencia de agudos. El sexto número es el volumen de la frecuencia de agudos. 0 es el mínimo y 255 es el máximo.
## Notará que las 3 frecuencias están configuradas en 255.
###La siguiente línea es una opción que puedes cambiar.
tone 100 255 1200 255 1500 255
echo 8 10000
roughness 3
breath 20 5 2 10 5 0 27 100
breathw 255 255 60 180 160 255 255 255
consonants 194 255
voicing 65
stressLength 0 1 2 3 4 5 6 7
stressAdd 250 350 700 500 450 290 100 225
stressAmp 16 16 24 24 16 16 20 24
##Este archivo no incluye todas las configuraciones que se pueden usar para modificar una voz E Speak. Su objetivo es familiarizarlo con lo que hace la configuración.
##Sin envargo puedes visitar la página http://espeak.sourceforge.net/voices.html y consultar más información acerca de cómo agregar o cambiar otras configuraciones.
## Espero que te haya servido esta ayuda, y que te hayas divertido.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Denis
================================================
language variant
name Denis
gender male 35
pitch 80 115
flutter 0
roughness 0
formant 0 100 160 160
formant 1 95 95 95
formant 2 100 100 100
formant 3 90 90 90
formant 4 40 40 40
formant 5 80 80 80
formant 6 10 10 10
formant 7 10 10 10
formant 8 10 10 10
voicing 40
consonants 80 80
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Diogo
================================================
language variant
name Diogo
gender male 25
pitch 82 122
echo 0 0
flutter 0
roughness 0
stressAmp 20 18 20 20 20 22 22 22
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 30 30 30 -100
formant 5 90 90 90
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
voicing 35
consonants 60 40
tone 60 250 140 100 1000 50 3500 35
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Gene
================================================
language variant
name Gene
pitch 80 110
formant 0 120 120 120
formant 1 90 100 110
formant 2 100 100 95
formant 3 90 100 100
formant 4 90 100 110
formant 5 90 110 110
formant 6 100 70 100
formant 7 100 70 100
formant 8 100 80 100
voicing 120
consonants 50 110
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Gene2
================================================
language variant
name Gene2
pitch 100 130
formant 0 120 120 120
formant 1 90 100 110
formant 2 100 100 95
formant 3 90 100 100
formant 4 90 100 110
formant 5 90 110 110
formant 6 100 70 100
formant 7 100 70 100
formant 8 100 80 100
voicing 120
consonants 50 110
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Henrique
================================================
language variant
name Henrique
gender male 25
pitch 70 130
echo 0 0
flutter 0
roughness 0
stressAmp 20 18 20 20 20 22 22 22
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 30 30 30 -100
formant 5 90 90 90
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
voicing 35
consonants 60 40
tone 70 250 230 80 1100 30 3500 40
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Hugo
================================================
language variant
name Hugo
gender male 25
pitch 70 130
echo 0 0
flutter 0
roughness 0
stressAmp 20 18 20 20 20 22 22 22
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 30 30 30 -100
formant 5 90 90 90
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
voicing 35
consonants 60 40
tone 400 160 1100 90 3500 90 150 35
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Jacky
================================================
language variant
name Jacky
pitch 85 130
formant 0 150 155 100
formant 1 90 155 70
formant 2 95 70 64
formant 3 15 20 30
formant 4 20 30 40
formant 5 65 20 65
formant 6 70 80 100
formant 7 20 80 100
formant 8 100 95 80
voicing 135
consonants 110
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Lee
================================================
language variant
name Lee
gender Male
#echo 230 30
pitch 85 110
flutter 0
formant 0 80 80 80 80
formant 1 80 80 100 100
formant 2 80 80 80
formant 3 9 9 9
formant 4 290 290
formant 5 130 0 0
formant 6 90 90 90
formant 7 90 90 90
formant 8 90 90 90
stressAdd 0 0 0 200 0 0 0 100
stressAmp 30 30 30 30 30 30 30 30 30
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Marco
================================================
language variant
name Marco
gender male 30
intonation 1
pitch 100 152
echo 50 80
flutter 2
roughness 0
stressAmp 25 25 24 20 38 31 39 27
stressAdd 250 125 250 250 225 145 50 256
formant 0 100 120 130
formant 1 75 180 170
formant 2 92 120 110
formant 3 140 120 110
formant 4 10 20 20 -50
formant 5 110 70 20
formant 6 140 100 98
formant 7 130 120 115
formant 8 105 120 108
voicing 38
consonants 90 140
tone 420 150 1200 135 3000 70 4700 40
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Mario
================================================
language variant
name Mario
pitch 75 125
formant 0 100 111 95
formant 1 100 111 60
formant 2 95 90 55
formant 3 100 50 65
formant 4 69 65 65
formant 5 79 60 75
formant 6 89 60 75
formant 7 99 0 100
formant 8 109 0 100
voicing 135
consonants 115 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Michael
================================================
language variant
name Michael
pitch 75 125
formant 0 105 111 95
formant 1 85 111 60
formant 2 95 90 55
formant 3 59 50 65
formant 4 69 65 65
formant 5 79 60 75
formant 6 89 60 75
formant 7 99 0 100
formant 8 109 0 100
voicing 135
consonants 115 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Mike
================================================
language variant
name Mike
voicing 70
formant 1 96 97 100
formant 2 96 97 100
formant 5 95 103 100
pitch 67 107
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Mr serious
================================================
##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.
## Language sets the language of your voice. This setting is required for every voice that you make.
##The next line is a setting you can change. However if you don't know the language codes it may be best to leave the setting as it is.
language variant
## The name setting is the name that will show up in the voice settings in the variant combo box.
##The next line is a setting you can change
name Mr_Serious
##The formant settings
## Formant 0 is used to give a low frequency component to the sounds.
## The three numbers are frequency, strength, and Width, in that order. Please note, the numbers are seperated by a space.
##The next line is a setting you can change
formant 0 100 100 100
# Formants 1,2, and 3 are the standard three formants which define vowels.
##The next 3 lines are settings you can change
formant 1 100 100 100
formant 2 100 100 100
formant 3 87 100 100
# Formants 4,5 are higher than F3. They affect the quality of the voice.
##The next 2 lines are settings that you can change.
formant 4 100 100 100
formant 5 100 100 100
## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound.
##The next 3 lines are settings that you can change.
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
##Intonation affects the rise and fall of the voice
## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.
##The next line is a setting you can change.
intonation 1
# Setting the pitch range. The first number gives a base pitch to the voice (value in Hertz). The second number controls the range of pitches used by the voice. Setting it equal
# to the first number will give a monotone sounding voice. The default values are 82 and 118.
pitch 82 118
## The tone setting. The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.
## The second number on the tone line is the volume of the bass frequency. You can set it from 0 to 255, 0 being the least amount, 255 being the most.
##The third number on the tone line, 1200, is the mid range frequency. The fourth number on the line is the setting to change the volume of the mid range frequency.
##0 being the least amount and 255 being the maximum.
## The fifth number on the tone line, 2000, is the treble frequency. The sixth number is the volume of the treble frequency. 0 is the minimum and 255 is the maximum.
## You will notice that all 3 frequencies are set to 255.
##The next line is a setting that you can change.
tone 600 255 1200 255 2000 255
##This file does not include all of the settings that can be used to modify an E Speak voice. It is intended to get you familiar with what the settings do.
##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed. I hope this helps, and Have fun.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Nguyen
================================================
language variant
name Nguyen
pitch 95 175
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 75 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
tone 100 200 600 150 800 100 2400 80 3600 95 5400 100
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Reed
================================================
language variant
name Reed
klatt 6
consonants 85 85
voicing 130
breath 45
pitch 85 135
formant 1 72 100 90 90
formant 2 83 100 75 180
formant 3 98 100 100 90
formant 4 98 100 90
formant 5 100 100 90
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/RicishayMax
================================================
language variant
name RicishayMax
echo 100 10000
formant 0 90 120 100
formant 1 100 100 75
formant 2 100 100 75
formant 3 100 80 75
formant 4 100 80 75
formant 5 100 80 75
formant 6 100 0 75
formant 7 100 0 75
formant 8 100 0 75
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/RicishayMax2
================================================
language variant
name RicishayMax2
echo 150 500
formant 0 90 120 100
formant 1 100 100 75
formant 2 100 100 75
formant 3 100 80 75
formant 4 100 80 75
formant 5 100 80 75
formant 6 100 0 75
formant 7 100 0 75
formant 8 100 0 75
roughness 5
intonation 10
voicing 150
consonants 110 120
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/RicishayMax3
================================================
language variant
name RicishayMax3
echo 200 500
formant 0 90 120 100
formant 1 100 100 75
formant 2 100 100 75
formant 3 100 80 75
formant 4 100 80 75
formant 5 100 80 75
formant 6 100 0 75
formant 7 100 0 75
formant 8 100 0 75
roughness 5
intonation 10
voicing 150
consonants 110 120
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Storm
================================================
language variant
language en-us
name Storm
gender male
formant 0 100 100 100
formant 1 95 95 95
formant 2 95 95 95
formant 3 95 95 95
formant 4 70 70 70
formant 5 70 70 70
formant 6 25 25 25
formant 7 25 25 25
formant 8 25 25 25
breath 0 0 0 0 0 0 0 0
consonants 100
echo 0 0
flutter 0
intonation 3
pitch 60 100
roughness 0
stressAdd 5 5 3 3 0 0 -15 -15
tone 500 255 1500 255 2500 255
voicing 100
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/Tweaky
================================================
##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.
## Language sets the language of your voice. This setting is required for every voice that you make.
##The next line is a setting you can change. However if you don't know the language codes it may be best to leave the setting as it is.
language variant
## The name setting is the name that will show up in the voice settings in the variant combo box.
##The next line is a setting you can change
name Tweaky
##The formant settings
## Formant 0 is used to give a low frequency component to the sounds.
## The three numbers are frequency, strength, and Width, in that order. Please note, the numbers are seperated by a space.
##The next line is a setting you can change
formant 0 100 100 100
# Formants 1,2, and 3 are the standard three formants which define vowels.
##The next 3 lines are settings you can change
formant 1 100 100 100
formant 2 100 100 100
formant 3 200 100 100
# Formants 4,5 are higher than F3. They affect the quality of the voice.
##The next 2 lines are settings that you can change.
formant 4 100 100 100
formant 5 100 100 100
## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound.
##The next 3 lines are settings that you can change.
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
##Intonation affects the rise and fall of the voice
## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.
##The next line is a setting you can change.
intonation 1
# Setting the pitch range. The first number gives a base pitch to the voice (value in Hertz). The second number controls the range of pitches used by the voice. Setting it equal
# to the first number will give a monotone sounding voice. The default values are 82 and 118.
pitch 82 118
## The tone setting. The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.
## The second number on the tone line is the volume of the bass frequency. You can set it from 0 to 255, 0 being the least amount, 255 being the most.
##The third number on the tone line, 1200, is the mid range frequency. The fourth number on the line is the setting to change the volume of the mid range frequency.
##0 being the least amount and 255 being the maximum.
## The fifth number on the tone line, 2000, is the treble frequency. The sixth number is the volume of the treble frequency. 0 is the minimum and 255 is the maximum.
## You will notice that all 3 frequencies are set to 255.
##The next line is a setting that you can change.
tone 600 255 1200 255 2000 255
##This file does not include all of the settings that can be used to modify an E Speak voice. It is intended to get you familiar with what the settings do.
##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed. I hope this helps, and Have fun.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/UniRobot
================================================
language variant
name UniversalRobot
gender male
klatt 4
pitch 100 160
echo 10 10000
formant 1 75 120 135
formant 2 90 50 140
formant 3 70 85 95
formant 4 150 60 80
formant 5 100 85 80
formant 6 112 100 80
formant 7 110 95 100
formant 8 105 110 100
consonants 125 100
tone 530 250 770 100 215 225
stressLength 0 1 2 3 4 5 6 7
stressAdd 120 130 130 90 0 0 120 120
stressAmp 16 16 24 24 16 16 20 24
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/adam
================================================
language variant
name Adam
klatt 6
consonants 85 85
formant 1 100 100 130
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/anika
================================================
language variant
name anika
gender female
pitch 200 300
flutter 6
stressAmp 20 18 20 20 20 22 22 22
roughness 0
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 120 120 110
formant 5 120 120 110
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
intonation 10
voicing 30
consonants 60 40
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/anikaRobot
================================================
language variant
name anikaRobot
gender female
pitch 200 300
flutter 1
stressAmp 20 18 20 20 20 22 22 22
echo 10 10000
roughness 0
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 120 120 110
formant 5 120 120 110
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
intonation 10
voicing 30
consonants 60 40
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/announcer
================================================
name Half-LifeAnnouncementSystem
language variant
pitch 37 83
klatt 4
formant 1 88 100 100 0
formant 2 96 100 100 0
formant 3 98 100 100 0
formant 4 96 100 100 0
formant 5 100 100 100 0
formant 6 100 100 100 0
formant 7 100 100 100 0
formant 8 100 100 100 0
voicing 70
consonants 70 70
echo 154 26
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/antonio
================================================
language variant
name Antonio
gender male
pitch 82 128
roughness 0
formant 0 100 150 90
formant 1 90 130 90
formant 2 95 120 80
formant 3 100 50 80
formant 4 100 40 80
formant 5 90 70 80
formant 6 0 0 0
formant 7 100 100 100
formant 8 100 100 100
voicing 150
tone 600 255 1200 255 2000 80
intonation 3
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/aunty
================================================
language variant
name Auntie
gender female
pitch 204 176
flutter 12
formant 0 88 85 154
formant 1 115 80 160 -20
formant 2 130 75 150 -200
formant 3 123 75 150
formant 4 125 80 150
formant 5 125 80 150
formant 6 110 80 150
formant 7 110 75 150
formant 8 110 75 150
stressAdd -20 -20 -20 -20 0 0 20 120
stressAmp 18 16 20 20 20 20 20 20
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/belinda
================================================
language variant
name Belinda
gender female
pitch 200 247
flutter 3
formant 0 88 85 154
formant 1 135 58 169 -30
formant 2 120 70 150 -260
formant 3 120 39 150
formant 4 125 57 80
formant 5 125 80 150
formant 6 110 80 150
formant 7 110 75 150
formant 8 110 75 150
stressAdd -20 -20 -20 -20 0 3 20 12
stressAmp 18 16 20 20 10 20 27 20
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/benjamin
================================================
language variant
name Benjamin
klatt 6
consonants 70 70
formant 1 101 100 130
formant 2 102 100 100
formant 3 100 100 100
formant 4 100 100 100 470
formant 5 100 100 100 350
formant 6 100 100 100 100
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/boris
================================================
language variant
name Boris
formant 0 47 120 100
formant 1 100 90 75
formant 2 104 100 75
formant 3 57 80 75
formant 4 104 80 75
formant 5 107 80 75
formant 6 68 0 75
formant 7 105 0 75
formant 8 105 0 75
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/caleb
================================================
language variant
name Caleb
klatt 6
breath 100
voicing 0
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/croak
================================================
language variant
name croak
gender male 70
pitch 85 117
flutter 20
formant 0 100 80 110
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/david
================================================
language variant
name David
klatt 6
pitch 62 89
formant 1 75 100 100
formant 2 85 100 100
formant 3 85 100 100
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/ed
================================================
language variant
name Ed
pitch 90 145
formant 0 110 120 200 5
formant 1 102 100 80
formant 2 101 120 100
formant 3 100 80 75
formant 4 150 30 80
formant 5 95 95 155
formant 6 167 100 75
formant 7 100 200 75
formant 8 60 200 95
consonants 55 80
voicing 100
tone 650 250 1000 130 240 255
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/edward
================================================
language variant
name Edward
klatt 5
voicing 100
consonants 70 80
formant 1 92 100 130
formant 2 103 100 80
formant 3 103 100 70
formant 4 114 100 60
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/edward2
================================================
language variant
name Edward2
klatt 6
voicing 100
consonants 70 80
formant 1 92 100 130
formant 2 103 100 80
formant 3 103 100 70
formant 4 114 100 60
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/f1
================================================
language variant
name female1
gender female 70
pitch 140 200
flutter 8
roughness 4
formant 0 115 80 150
formant 1 120 80 180
formant 2 100 70 150 150
formant 3 115 70 150
formant 4 110 80 150
formant 5 110 90 150
formant 6 105 80 150
formant 7 110 70 150
formant 8 110 70 150
stressAdd -10 -10 -20 -20 0 0 40 60
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/f2
================================================
language variant
name female2
gender female
pitch 142 220
roughness 3
formant 0 105 80 150
formant 1 110 80 160
formant 2 110 70 150
formant 3 110 70 150
formant 4 115 80 150
formant 5 115 80 150
formant 6 110 70 150
formant 7 110 70 150
formant 8 110 70 150
stressAdd 0 0 -10 -10 0 0 10 40
breath 0 2 3 3 3 3 3 2
echo 140 10
consonants 125 125
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/f3
================================================
language variant
name female3
gender female
pitch 140 240
formant 0 105 80 150
formant 1 120 75 150 -50
formant 2 135 70 150 -250
formant 3 125 80 150
formant 4 125 80 150
formant 5 125 80 150
formant 6 120 70 150
formant 7 110 70 150
formant 8 110 70 150
stressAmp 18 18 20 20 20 20 20 20
//breath 0 2 4 4 4 4 4 4
breath 0 2 3 3 3 3 3 2
echo 120 10
roughness 4
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/f4
================================================
language variant
name female4
gender female
echo 130 15
pitch 142 200
formant 0 120 80 150
formant 1 115 80 160 -20
formant 2 130 75 150 -200
formant 3 123 75 150
formant 4 125 80 150
formant 5 125 80 150
formant 6 110 80 150
formant 7 110 75 150
formant 8 110 75 150
stressAdd -20 -20 -20 -20 0 0 20 120
stressAmp 18 16 20 20 20 20 20 20
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/f5
================================================
language variant
name female5
gender female
pitch 160 228
roughness 0
formant 0 105 80 150
formant 1 110 80 160
formant 2 110 70 150
formant 3 110 70 150
formant 4 115 80 200
formant 5 115 80 100
formant 6 110 70 150
formant 7 110 70 100
formant 8 110 70 150
stressAdd 0 0 -10 -10 0 0 10 40
breath 0 4 6 6 6 6 0 10
echo 140 10
voicing 75
consonants 150 150
breathw 150 150 200 200 400 400 600 600
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/fast
================================================
language variant
name fast_test
// Try decreasing these values to make eSpeak's fastest speed faster.
// This is currently unstable.
fast_test2 15
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/grandma
================================================
language variant
name grandma
gender female 90
pitch 120 230
flutter 20
formant 0 105 150 150
formant 1 100 80 100
formant 2 105 105 105
formant 3 80 80 80
formant 4 60 60 60
formant 5 90 90 90
formant 6 10 10 10
formant 7 10 10 10
formant 8 20 20 20
voicing 50
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/grandpa
================================================
language variant
name grandpa
pitch 80 120
flutter 20
formant 0 100 100 100
formant 1 100 100 100
formant 2 100 100 100
formant 3 100 100 100
formant 4 100 100 100
formant 5 100 100 100
formant 6 10 10 10
formant 7 10 10 10
formant 8 10 10 10
intonation 1
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/gustave
================================================
language variant
name Gustave
pitch 80 123
formant 0 85 141 135
formant 1 77 131 45
formant 2 92 70 55
formant 3 59 50 65
formant 4 69 65 65
formant 5 79 60 75
formant 6 89 60 75
formant 7 99 0 100
formant 8 109 0 100
voicing 135
consonants 115 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/ian
================================================
##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.
## Language sets the language of your voice. This setting is required for every voice that you make.
##The next line is a setting you can change. However if you don't know the language codes it may be best to leave the setting as it is.
language variant
## The name setting is the name that will show up in the voice settings in the variant combo box.
##The next line is a setting you can change
name Ian
##The formant settings
## Formant 0 is used to give a low frequency component to the sounds.
## The three numbers are frequency, strength, and Width, in that order. Please note, the numbers are seperated by a space.
##The next line is a setting you can change
formant 0 20 120 50
# Formants 1,2, and 3 are the standard three formants which define vowels.
##The next 3 lines are settings you can change
formant 1 80 80 80
formant 2 80 80 80
formant 3 80 80 80
# Formants 4,5 are higher than F3. They affect the quality of the voice.
##The next 2 lines are settings that you can change.
formant 4 50 50 50
formant 5 50 50 50
## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound.
##The next 3 lines are settings that you can change.
formant 6 100 100 100
formant 7 200 50 200
formant 8 200 50 200
##Intonation affects the rise and fall of the voice
## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.
##The next line is a setting you can change.
intonation 2
# Setting the pitch range. The first number gives a base pitch to the voice (value in Hertz). The second number controls the range of pitches used by the voice.
# Setting it equal to the first number will give a monotone sounding voice. The default values are 82 and 118.
pitch 69 96
## The tone setting. The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.
##The second number on the tone line is the volume of the bass frequency. You can set it from 0 to 255, 0 being the least amount, 255 being the most.
##The third number on the tone line, 1200, is the mid range frequency. The fourth number on the line is the setting to change the volume of the mid range frequency.
##0 being the least amount and 255 being the maximum.
## The fifth number on the tone line, 2000, is the treble frequency. The sixth number is the volume of the treble frequency. 0 is the minimum and 255 is the maximum.
## You will notice that all 3 frequencies are set to 255.
##The next line is a setting that you can change.
tone 1000 127 1200 127 2000 127
##This file does not include all of the settings that can be used to modify an E Speak voice. It is intended to get you familiar with what the settings do.
##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed. I hope this helps, and Have fun.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/iven
================================================
language variant
name Iven
pitch 74 118
formant 0 52 133 88
formant 1 87 82 76
formant 2 94 56 42
formant 3 93 52 130
formant 4 110 76 65
formant 5 102 45 20
formant 6 40 50 50
formant 7 60 50 60
formant 8 100 50 40
voicing 530
tone 600 255 1200 255 2000 160
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/iven2
================================================
language variant
name Iven2
pitch 74 118
formant 0 52 133 88
formant 1 87 82 76
formant 2 94 56 42
formant 3 93 52 130
formant 4 110 76 65
formant 5 102 45 20
formant 6 40 50 50
formant 7 60 50 60
formant 8 100 50 40
voicing 220
consonants 28 42
tone 600 255 1200 255 2000 150
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/iven3
================================================
language variant
name Iven3
pitch 74 118
formant 0 52 133 88
formant 1 87 82 76
formant 2 94 56 42
formant 3 93 52 130
formant 4 110 76 65
formant 5 102 45 20
formant 6 40 50 50
formant 7 60 50 60
formant 8 100 50 40
voicing 165
tone 600 255 1200 255 2000 160
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/iven4
================================================
language variant
name Iven4
pitch 74 118
formant 0 52 133 88
formant 1 87 82 76
formant 2 94 56 42
formant 3 93 52 130
formant 4 110 76 65
formant 5 102 45 20
formant 6 40 50 50
formant 7 60 50 60
formant 8 100 50 40
voicing 165
tone 600 170 1200 100 2000 40
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/john
================================================
##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.
## Language sets the language of your voice. This setting is required for every voice that you make.
##The next line is a setting you can change. However if you don't know the language codes it may be best to leave the setting as it is.
language variant
## The name setting is the name that will show up in the voice settings in the variant combo box.
##The next line is a setting you can change
name John
##The formant settings
## Formant 0 is used to give a low frequency component to the sounds.
## The three numbers are frequency, strength, and Width, in that order. Please note, the numbers are seperated by a space.
##The next line is a setting you can change
formant 0 100 100 100
# Formants 1,2, and 3 are the standard three formants which define vowels.
##The next 3 lines are settings you can change
formant 1 100 100 100
formant 2 100 100 100
formant 3 100 100 100
# Formants 4,5 are higher than F3. They affect the quality of the voice.
##The next 2 lines are settings that you can change.
formant 4 100 100 100
formant 5 100 100 100
## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound.
##The next 3 lines are settings that you can change.
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
##Intonation affects the rise and fall of the voice
## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.
##The next line is a setting you can change.
intonation 1
# Setting the pitch range. The first number gives a base pitch to the voice (value in Hertz). The second number controls the range of pitches used by the voice.
# Setting it equal to the first number will give a monotone sounding voice. The default values are 82 and 118.
pitch 82 118
## The tone setting. The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.
##The second number on the tone line is the volume of the bass frequency. You can set it from 0 to 255, 0 being the least amount, 255 being the most.
##The third number on the tone line, 1200, is the mid range frequency. The fourth number on the line is the setting to change the volume of the mid range frequency.
##0 being the least amount and 255 being the maximum.
## The fifth number on the tone line, 2000, is the treble frequency. The sixth number is the volume of the treble frequency. 0 is the minimum and 255 is the maximum.
## You will notice that all 3 frequencies are set to 255.
##The next line is a setting that you can change.
tone 600 255 1200 255 2000 255
##This file does not include all of the settings that can be used to modify an E Speak voice. It is intended to get you familiar with what the settings do.
##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed. I hope this helps, and Have fun.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/kaukovalta
================================================
language variant
name Kaukovalta
formant 0 80 80 100
formant 1 40 80 100
formant 2 70 100 130
formant 3 80 100 60
formant 4 70 90 100
formant 5 70 90 100
formant 6 70 100 90
formant 7 100 90 110
formant 8 100 95 100
pitch 70 120
tone 100 130 800 130 2000 130
consonants 70 70
roughness 4
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/klatt
================================================
language variant
name klatt
klatt 1
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/klatt2
================================================
language variant
name klatt2
klatt 2
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/klatt3
================================================
language variant
name klatt3
klatt 3
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/klatt4
================================================
language variant
name klatt4
klatt 4
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/klatt5
================================================
language variant
name klatt5
klatt 5
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/klatt6
================================================
language variant
name klatt6
klatt 6
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/linda
================================================
language variant
name Linda
gender female
#echo 130 15
pitch 200 247
flutter 3
formant 0 88 85 154
formant 1 135 58 169 -30
formant 2 131 75 152 -260
formant 3 123 75 150
formant 4 125 80 150
formant 5 125 80 150
formant 6 110 80 150
formant 7 110 75 150
formant 8 110 75 150
stressAdd -20 -20 -20 -20 0 3 20 120
stressAmp 18 16 20 20 20 20 27 20
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m1
================================================
language variant
name male1
gender male 70
pitch 75 109
flutter 5
roughness 4
consonants 80 100
formant 0 98 100 100
formant 1 97 100 100
formant 2 97 95 100
formant 3 97 95 100
formant 4 97 85 100
formant 5 105 80 100
formant 6 95 80 100
formant 7 100 100 100
formant 8 100 100 100
//stressAdd -10 -10 -20 -20 0 0 40 70
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m2
================================================
language variant
name male2
gender male
pitch 88 115
echo 130 15
formant 0 100 80 120
formant 1 90 85 120
formant 2 110 85 120
formant 3 105 90 120
formant 4 100 90 120
formant 5 100 90 120
formant 6 100 90 120
formant 7 100 90 120
formant 8 100 90 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m3
================================================
language variant
name male3
gender male
pitch 80 122
formant 0 100 100 100
formant 1 96 97 100
formant 2 96 97 100
formant 3 96 103 100
formant 4 95 103 100
formant 5 95 103 100
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
consonants 100
stressAdd 10 10 0 0 0 0 -30 -30
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m4
================================================
language variant
name male4
gender male
pitch 70 110
formant 0 103 100 100
formant 1 103 100 100
formant 2 103 100 100
formant 3 103 100 100
formant 4 106 100 100
formant 5 106 100 100
formant 6 106 100 100
formant 7 103 100 100
formant 8 103 100 100
stressAdd -10 -10 -30 -30 0 0 60 90
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m5
================================================
language variant
name male5
gender male
formant 0 100 85 130
formant 1 90 85 130 40
formant 2 80 85 130 310
formant 3 105 85 130
formant 4 105 85 130
formant 5 105 85 130
formant 6 105 85 150
formant 7 105 85 150
formant 8 105 85 150
intonation 2
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m6
================================================
language variant
name male6
gender male
pitch 82 117
formant 0 100 90 120
formant 1 100 90 140
formant 2 100 70 140
formant 3 100 75 140
formant 4 100 80 140
formant 5 100 80 140
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m7
================================================
language variant
name male7
gender male
pitch 75 125
formant 0 100 125 100
formant 1 100 90 80
formant 2 100 70 90
formant 3 100 60 90
formant 4 100 60 90
formant 5 75 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
voicing 155
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/m8
================================================
language variant
name male8
gender male 50
pitch 65 102
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/marcelo
================================================
language variant
name Marcelo
pitch 65 115
formant 0 65 161 35
formant 1 75 131 65
formant 2 90 60 40
formant 3 59 50 55
formant 4 69 65 35
formant 5 69 60 25
formant 6 59 60 35
formant 7 149 0 10
formant 8 199 0 90
voicing 135
consonants 115 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/max
================================================
language variant
name Max
formant 0 90 120 100
formant 1 100 100 75
formant 2 100 100 75
formant 3 100 80 75
formant 4 100 80 75
formant 5 100 80 75
formant 6 100 0 75
formant 7 100 0 75
formant 8 100 0 75
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/michel
================================================
language variant
name Michel
gender male 25
pitch 82 122
echo 0 0
flutter 0
roughness 0
stressAmp 20 18 20 20 20 22 22 22
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 30 30 30 -100
formant 5 90 90 90
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
voicing 35
consonants 60 40
tone 400 160 1500 100 3000 70 4500 40
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/miguel
================================================
language variant
name Miguel
gender male 25
pitch 80 130
echo 0 0
flutter 0
roughness 0
stressAmp 20 18 20 20 20 22 22 22
formant 0 105 200 140
formant 1 95 150 120
formant 2 100 120 140
formant 3 95 95 140
formant 4 30 30 30 -100
formant 5 90 90 90
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
voicing 35
consonants 60 40
tone 300 240 400 160 1500 100 3000 70
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/mike2
================================================
language variant
name Mike2
klatt 6
voicing 170
pitch 67 107
formant 1 95 100 100
formant 2 95 100 100
formant 3 105 100 100
formant 4 115 100 100
formant 5 115 100 100
consonants 70 150
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/norbert
================================================
##Please note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.
## Language sets the language of your voice. This setting is required for every voice that you make.
##The next line is a setting you can change. However if you don't know the language codes it may be best to leave the setting as it is.
language variant
## The name setting is the name that will show up in the voice settings in the variant combo box.
##The next line is a setting you can change
name norbert
##The formant settings
## Formant 0 is used to give a low frequency component to the sounds.
## The three numbers are frequency, strength, and Width, in that order. Please note, the numbers are seperated by a space.
##The next line is a setting you can change
formant 0 100 100 100
# Formants 1,2, and 3 are the standard three formants which define vowels.
##The next 3 lines are settings you can change
formant 1 100 100 100
formant 2 75 50 100
formant 3 100 100 100
# Formants 4,5 are higher than F3. They affect the quality of the voice.
##The next 2 lines are settings that you can change.
formant 4 100 100 100
formant 5 100 100 100
## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound.
##The next 3 lines are settings that you can change.
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
##Intonation affects the rise and fall of the voice
## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.
##The next line is a setting you can change.
intonation 1
# Setting the pitch range. The first number gives a base pitch to the voice (value in Hertz). The second number controls the range of pitches used by the voice. Setting it equal
# to the first number will give a monotone sounding voice. The default values are 82 and 118.
pitch 82 118
## The tone setting. The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.
## The second number on the tone line is the volume of the bass frequency. You can set it from 0 to 255, 0 being the least amount, 255 being the most.
##The third number on the tone line, 1200, is the mid range frequency. The fourth number on the line is the setting to change the volume of the mid range frequency.
##0 being the least amount and 255 being the maximum.
## The fifth number on the tone line, 2000, is the treble frequency. The sixth number is the volume of the treble frequency. 0 is the minimum and 255 is the maximum.
## You will notice that all 3 frequencies are set to 255.
##The next line is a setting that you can change.
tone 600 255 1000 100 5000 255
##This file does not include all of the settings that can be used to modify an E Speak voice. It is intended to get you familiar with what the settings do.
##However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed. I hope this helps, and Have fun.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/pablo
================================================
##Pleas note the 2 number signs, or pound signs in this file are for comments to help you to understand what the settings are and how to set them.
## Language sets the language of your voice. This setting is required for every voice that you make.
##The next line is a setting you can change. However if you don't know the language codes it may be best to leave the setting as it is.
language variant
## The name setting is the name that will show up in the voice settings in the variant combo box.
##The next line is a setting you can change
name Pablo
##The formant settings
## Formant 0 is used to give a low frequency component to the sounds.
## The three numbers are frequency, strength, and Width, in that order. Please note, the numbers are seperated by a space.
##The next line is a setting you can change
formant 0 90 100 90
# Formants 1,2, and 3 are the standard three formants which define vowels.
##The next 3 lines are settings you can change
formant 1 95 100 80
formant 2 97 100 80
formant 3 98 90 80
# Formants 4,5 are higher than F3. They affect the quality of the voice.
##The next 2 lines are settings that you can change.
formant 4 110 100 100
formant 5 110 100 100
## Formants 6, 7, and 8 are weak, high frequency, additions to vowels to give a clearer sound.
##The next 3 lines are settings that you can change.
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
##Intonation affects the rise and fall of the voice
## The settings are 1 default, 2 less intonation, 3 less intonation and commas do not raise the pitch, 4 the pitch rises at the end of a sentence rather than falling.
##The next line is a setting you can change.
intonation 3
echo 30 30
# Setting the pitch range. The first number gives a base pitch to the voice (value in Hertz). The second number controls the range of pitches used by the voice. Setting it equal
# to the first number will give a monotone sounding voice. The default values are 82 and 118.
pitch 82 130
## The tone setting. The first number on the setting line, 600, is the frequency setting for the amount of bass in the voice.
## The second number on the tone line is the volume of the bass frequency. You can set it from 0 to 255, 0 being the least amount, 255 being the most.
##The third number on the tone line, 1200, is the mid range frequency. The fourth number on the line is the setting to change the volume of the mid range frequency.
## 0 being the least amount and 255 being the maximum.
## The fifth number on the tone line, 2000, is the treble frequency. The sixth number is the volume of the treble frequency. 0 is the minimum and 255 is the maximum.
## You will notice that all 3 frequencies are set to 255.
##The next line is a setting that you can change.
tone 600 255 1200 200 2000 255
##This file does not include all of the settings that can be used to modify an E Speak voice. It is intended to get you familiar with what the settings do.
#However, you can go to http://espeak.sourceforge.net/voices.html and read further information about other settings that can be added and changed. I hope this helps, and Have fun.
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/paul
================================================
language variant
name Paul
pitch 70 100
formant 0 90 120 100
formant 1 103 100 75
formant 2 98 100 75
formant 3 100 80 75
formant 4 102 30 100
formant 5 100 80 100
formant 6 100 80 75
formant 7 100 0 75
formant 8 100 60 75
consonants 90 60
voicing 230
tone 420 255 1300 130 4000 100
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/pedro
================================================
language variant
name Pedro
formant 0 100 150 100
formant 1 95 100 80
formant 2 95 100 80
formant 3 100 100 90
formant 4 100 100 100
formant 5 100 100 100
formant 6 100 100 100
formant 7 100 100 100
formant 8 100 100 100
intonation 3
pitch 82 118
tone 600 255 1200 255 2000 255
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/quincy
================================================
language variant
name Quincy
pitch 67 100
formant 0 85 108 106 3
formant 1 97 110 56
formant 2 96 80 60
formant 3 101 50 50
formant 4 110 33 55
formant 5 110 22 65
formant 6 77 60 60 65
formant 7 66 0 100
formant 8 100 0 100
voicing 99
consonants 66 90
roughness 0
tone 600 170 1200 100 2000 70
stressAmp 16 16 24 20 20 16 28 24
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/rob
================================================
language variant
name Rob
pitch 50 130
formant 0 100 100 100
formant 1 95 100 60
formant 2 97 90 50
formant 3 101 70 50
formant 4 110 65 55
formant 5 110 70 65
formant 6 110 70 65
formant 7 0 0 0
formant 8 0 0 0
voicing 115
consonants 110 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robert
================================================
language variant
name Robert
pitch 65 115
formant 0 85 108 100
formant 1 95 110 60
formant 2 97 90 50
formant 3 101 50 50
formant 4 110 65 55
formant 5 110 60 65
formant 6 110 60 65
formant 7 100 0 100
formant 8 100 0 100
voicing 115
consonants 110 120
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft
================================================
language variant
name Robosoft
echo 30 1000
klatt 5
pitch 60 90
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
roughness 50
intonation 0
voicing 80
consonants 110 120
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft2
================================================
language variant
name Robosoft2
echo 10 600
klatt 4
pitch 70 100
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
roughness 75
intonation -25
voicing 80
consonants 110 120
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft3
================================================
language variant
name Robosoft3
echo 10 10000
klatt 4
pitch 75 115
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
roughness 5
intonation 10
voicing 150
consonants 110 120
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft4
================================================
language variant
name Robosoft4
echo 10 10000
pitch 75 115
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
roughness 5
intonation 10
voicing 150
consonants 110 120
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft5
================================================
language variant
name Robosoft5
echo 10 10000
pitch 75 115
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
roughness 0
intonation 10
voicing 150
consonants 60 40
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
stressAmp 16 16 24 24 16 16 20 24
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft6
================================================
language variant
name Robosoft6
echo 40 10000
pitch 150 150
formant 0 100 125 100
formant 1 96 90 80
formant 2 97 70 90
formant 3 97 60 90
formant 4 97 60 90
formant 5 100 50 90
formant 6 90 50 100
formant 7 100 50 100
formant 8 100 50 100
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft7
================================================
language variant
name Robosoft7
echo 10 10000
pitch 75 115
formant 0 90 120 100
formant 1 100 100 75
formant 2 100 100 75
formant 3 100 80 75
formant 4 100 80 75
formant 5 100 80 75
formant 6 100 0 75
formant 7 100 0 75
formant 8 100 0 75
roughness 0
intonation 10
voicing 150
consonants 60 40
stressLength 0 1 2 3 4 5 6 7
stressAdd 130 140 140 100 0 0 130 160
tone 100 255 600 70 1200 22 2000 66 3000 12
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/robosoft8
================================================
language variant
name Robosoft8
echo 40 10000
pitch 150 150
formant 0 90 120 100
formant 1 100 100 75
formant 2 100 100 75
formant 3 100 80 75
formant 4 100 80 75
formant 5 100 80 75
formant 6 100 0 75
formant 7 100 0 75
formant 8 100 0 75
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/sandro
================================================
// This file is UTF-8 encoded
// Variant sandro (ver.25-3) for eSpeak-ng Copyright (C)2019 by Lolo vmanolo301@gmail.com
language variant
name sandro
gender male
formant 0 95 146 100
formant 1 98 90 100
formant 2 103 98 100
formant 3 100 90 100
formant 4 100 101 100
formant 5 110 120 100 2123
formant 6 100 100 100 1200
formant 7 32 125 80 600
formant 8 34 95 30 49
voicing 165
consonants 194 255
pitch 78 115
roughness 3
breath 20 5 2 10 5 0 27 100
breathw 255 255 60 180 160 255 255 255
tone 500 210 470 70 160 155 2985 32
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/shelby
================================================
language variant
name shelby
flutter 0
roughness 0
formant 0 100 160 190
formant 1 90 90 90
formant 2 140 140 140
formant 3 130 150 130
formant 4 110 110 110
formant 5 120 120 110
formant 6 10 10 10
formant 7 10 10 10
formant 8 10 10 10
pitch 100 210
voicing 40
consonants 90 70
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/steph
================================================
language variant
name Steph
gender female
pitch 166 200
flutter 1
roughness 0
tone 100 255 600 70 1200 22 2000 66 3000 12
formant 0 99 80 150
formant 1 120 60 160
formant 2 99 70 110 150
formant 3 116 77 150
formant 4 9 59 110
formant 5 100 50 2
formant 6 104 80 150
formant 7 110 70 150
formant 8 110 70 150
stressAmp 16 16 24 24 16 16 20 24
consonants 55 90
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/steph2
================================================
language variant
name Steph2
gender female
pitch 166 200
flutter 1
roughness 0
tone 100 255 600 70 1200 22 2000 66 3000 12
formant 0 99 100 150
formant 1 120 80 160
formant 2 99 90 110 150
formant 3 116 97 150
formant 4 9 73 116
formant 5 100 70 2
formant 6 104 100 150
formant 7 110 90 150
formant 8 110 90 150
stressAmp 16 16 24 24 16 16 20 24
consonants 55 90
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/steph3
================================================
language variant
name Steph3
gender female
pitch 166 200
flutter 1
roughness 0
voicing 200
tone 100 255 600 70 1200 22 2000 66 3000 12
formant 0 99 80 150
formant 1 120 60 160
formant 2 99 70 110 150
formant 3 116 77 150
formant 4 9 59 110
formant 5 100 50 2
formant 6 104 80 150
formant 7 110 70 150
formant 8 110 70 150
stressAmp 16 16 24 24 16 16 20 24
consonants 70 90
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/travis
================================================
language variant
name travis
gender male 30
pitch 75 120
formant 0 90 90 90 90
formant 1 50 100 80 95
formant 2 90 60 90 100
formant 3 80 80 90 100
formant 4 50 90 100 100
formant 5 100 95 100 55
formant 6 80 50 100 85
formant 7 60 60 60 120
formant 8 80 80 140 100
tone 600 100 1000 200 1500 50
flutter 1
roughness 3
voicing 200
consonants 120 190
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/victor
================================================
language variant
name victor
gender male 25
formant 0 100 100 100
formant 1 95 95 95
formant 2 90 90 90
formant 3 90 90 90
formant 4 40 40 40
formant 5 80 80 80
formant 6 20 20 20
formant 7 20 20 20
formant 8 20 20 20
pitch 80 110
voicing 60
breath 2 4
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/whisper
================================================
language variant
name whisper
gender male
pitch 82 117
flutter 20
formant 0 100 0 100
formant 1 100 80 100
voicing 17
breath 75 75 50 40 15 10
breathw 150 150 200 200 400 400
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/whisperf
================================================
language variant
name female_whisper
gender female
pitch 160 220
roughness 3
formant 0 105 0 150
formant 1 110 40 160
formant 2 110 70 150
formant 3 110 70 150
formant 4 115 80 150
formant 5 115 80 150
formant 6 110 70 150
formant 7 110 70 150
formant 8 110 70 150
stressAdd 0 0 -10 -10 0 0 10 40
// whisper
voicing 20
breath 75 75 50 40 15 10
breathw 150 150 200 200 400 400
================================================
FILE: app/src/main/assets/espeak-ng-data/voices/!v/zac
================================================
language variant
name Zac
flutter 5
pitch 240 390
formant 0 145 100 145
formant 1 145 100 145
formant 2 145 100 145
formant 3 145 100 145
formant 4 145 100 145
formant 5 145 120 145
formant 6 145 120 145
formant 7 145 120 145
formant 8 145 120 145
voicing 80
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/CheckVoiceData.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.speech.tts.TextToSpeech
import androidx.appcompat.app.AppCompatActivity
class CheckVoiceData : AppCompatActivity() {
lateinit var mContext: Context
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mContext = this
val intent = Intent().apply {
putStringArrayListExtra(
TextToSpeech.Engine.EXTRA_AVAILABLE_VOICES,
TtsEngine.getAvailableLanguages(mContext)
)
putStringArrayListExtra(TextToSpeech.Engine.EXTRA_UNAVAILABLE_VOICES, arrayListOf())
}
setResult(TextToSpeech.Engine.CHECK_VOICE_DATA_PASS, intent)
finish()
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/Downloader.java
================================================
package com.k2fsa.sherpa.onnx.tts.engine;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import com.k2fsa.sherpa.onnx.tts.engine.databinding.ActivityManageLanguagesBinding;
@SuppressWarnings("ResultOfMethodCallIgnored")
public class Downloader {
static final String onnxModel = "model.onnx";
static final String tokens = "tokens.txt";
static long onnxModelDownloadSize = 0L;
static long tokensDownloadSize = 0L;
static boolean onnxModelFinished = false;
static boolean tokensFinished = false;
static int onnxModelSize = 0;
static int tokensSize = 0;
public static void downloadModels(final Activity activity, ActivityManageLanguagesBinding binding, String model, String lang, String country, String type) {
String modelName="";
if (type.equals("vits-piper")) modelName = model + ".onnx";
else if (type.equals("vits-coqui")) modelName = "model.onnx";
String onnxModelUrl = "https://huggingface.co/csukuangfj/"+ type + "-" + model + "/resolve/main/" + modelName;
String tokensUrl = "https://huggingface.co/csukuangfj/" + type + "-" + model + "/resolve/main/tokens.txt";
File directory = new File(activity.getExternalFilesDir(null)+ "/" + lang + country + "/");
if (!directory.exists() && !directory.mkdirs()) {
Log.e("TTS Engine", "Failed to make directory: " + directory);
return;
}
activity.runOnUiThread(() -> binding.downloadSize.setVisibility(View.VISIBLE));
File onnxModelFile = new File(activity.getExternalFilesDir(null)+ "/" + lang + country + "/" + onnxModel);
if (onnxModelFile.exists()) onnxModelFile.delete();
if (!onnxModelFile.exists()) {
onnxModelFinished = false;
Log.d("TTS Engine", "onnx model file does not exist");
Thread thread = new Thread(() -> {
try {
URL url;
url = new URL(onnxModelUrl);
Log.d("TTS Engine", "Download model");
URLConnection ucon = url.openConnection();
ucon.setReadTimeout(5000);
ucon.setConnectTimeout(10000);
onnxModelSize = ucon.getContentLength();
InputStream is = ucon.getInputStream();
BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
File tempOnnxFile = new File(activity.getExternalFilesDir(null)+ "/" + lang + country + "/" + "model.tmp");
if (tempOnnxFile.exists()) tempOnnxFile.delete();
FileOutputStream outStream = new FileOutputStream(tempOnnxFile);
byte[] buff = new byte[5 * 1024];
int len;
while ((len = inStream.read(buff)) != -1) {
outStream.write(buff, 0, len);
if (tempOnnxFile.exists()) onnxModelDownloadSize = tempOnnxFile.length();
activity.runOnUiThread(() -> {
binding.downloadSize.setText((tokensDownloadSize + onnxModelDownloadSize)/1024/1024 + " MB / " + (onnxModelSize + tokensSize)/1024/1024 + " MB");
});
}
outStream.flush();
outStream.close();
inStream.close();
if (!tempOnnxFile.exists()) {
throw new IOException();
}
tempOnnxFile.renameTo(onnxModelFile);
onnxModelFinished = true;
activity.runOnUiThread(() -> {
if (tokensFinished && onnxModelFinished && binding.buttonStart.getVisibility()==View.GONE){
binding.buttonStart.setVisibility(View.VISIBLE);
PreferenceHelper preferenceHelper = new PreferenceHelper(activity);
preferenceHelper.setCurrentLanguage(lang);
LangDB langDB = LangDB.getInstance(activity);
langDB.addLanguage(model, lang, country, 0, 1.0f, 1.0f, type);
}
});
} catch (IOException i) {
activity.runOnUiThread(() -> Toast.makeText(activity, activity.getResources().getString(R.string.error_download), Toast.LENGTH_SHORT).show());
onnxModelFile.delete();
Log.w("TTS Engine", activity.getResources().getString(R.string.error_download), i);
}
});
thread.start();
}
File tokensFile = new File(activity.getExternalFilesDir(null) + "/" + lang + country + "/" + tokens);
if (tokensFile.exists()) tokensFile.delete();
if (!tokensFile.exists()) {
tokensFinished = false;
Log.d("TTS Engine", "tokens file does not exist");
Thread thread = new Thread(() -> {
try {
URL url = new URL(tokensUrl);
Log.d("TTS Engine", "Download tokens file");
URLConnection ucon = url.openConnection();
ucon.setReadTimeout(5000);
ucon.setConnectTimeout(10000);
tokensSize = ucon.getContentLength();
InputStream is = ucon.getInputStream();
BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);
File tempTokensFile = new File(activity.getExternalFilesDir(null)+ "/" + lang + country + "/" + "tokens.tmp");
if (tempTokensFile.exists()) tempTokensFile.delete();
FileOutputStream outStream = new FileOutputStream(tempTokensFile);
byte[] buff = new byte[5 * 1024];
int len;
while ((len = inStream.read(buff)) != -1) {
outStream.write(buff, 0, len);
if (tempTokensFile.exists()) tokensDownloadSize = tempTokensFile.length();
activity.runOnUiThread(() -> {
binding.downloadSize.setText((tokensDownloadSize + onnxModelDownloadSize)/1024/1024 + " MB / " + (onnxModelSize + tokensSize)/1024/1024 + " MB");
});
}
outStream.flush();
outStream.close();
inStream.close();
if (!tempTokensFile.exists()) {
throw new IOException();
}
tempTokensFile.renameTo(tokensFile);
tokensFinished = true;
activity.runOnUiThread(() -> {
if (tokensFinished && onnxModelFinished && binding.buttonStart.getVisibility()==View.GONE){
binding.buttonStart.setVisibility(View.VISIBLE);
PreferenceHelper preferenceHelper = new PreferenceHelper(activity);
preferenceHelper.setCurrentLanguage(lang);
LangDB langDB = LangDB.getInstance(activity);
langDB.addLanguage(model, lang, country, 0, 1.0f, 1.0f, type);
}
});
} catch (IOException i) {
activity.runOnUiThread(() -> Toast.makeText(activity, activity.getResources().getString(R.string.error_download), Toast.LENGTH_SHORT).show());
tokensFile.delete();
Log.w("TTS Engine", activity.getResources().getString(R.string.error_download), i);
}
});
thread.start();
}
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GetSampleText.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.app.Activity
import android.content.Intent
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ó"
}
"cym" -> {
text = "Peiriant testun-i-lais yw hwn sy'n defnyddio Kaldi'r genhedlaeth nesaf"
}
"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 Sprachausgabe, 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"
}
"hin" -> {
text = "यह एक अगली पीढ़ी के काल्डी एप्लिकेशन है, जो लिखित शब्दों और वाक्यांशों को बोली मे परिवर्तित करता है"
}
"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
val text: String = getSampleText(TtsEngine.lang ?: "")
if (text.isEmpty()) {
result = TextToSpeech.LANG_NOT_SUPPORTED
}
val intent = Intent().apply {
if (result == TextToSpeech.LANG_AVAILABLE) {
putExtra(TextToSpeech.Engine.EXTRA_SAMPLE_TEXT, text)
} else {
putExtra("sampleText", text)
}
}
setResult(result, intent)
finish()
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/GithubStar.java
================================================
package com.k2fsa.sherpa.onnx.tts.engine;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import androidx.preference.PreferenceManager;
public class GithubStar {
public static void setAskForStar(boolean askForStar, Context context) {
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefManager.edit();
editor.putBoolean("askForStar", askForStar);
editor.apply();
}
public static boolean shouldShowStarDialog(Context context) {
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);
int versionCode = prefManager.getInt("versionCode", 0);
boolean askForStar = prefManager.getBoolean("askForStar", true);
if (prefManager.contains("versionCode") && BuildConfig.VERSION_CODE > versionCode && askForStar) { //not at first start, only after upgrade and only if use has not yet given a star or has declined
SharedPreferences.Editor editor = prefManager.edit();
editor.putInt("versionCode", BuildConfig.VERSION_CODE);
editor.apply();
return true;
} else {
SharedPreferences.Editor editor = prefManager.edit();
editor.putInt("versionCode", BuildConfig.VERSION_CODE);
editor.apply();
return false;
}
}
public static void starDialog(Context context, String url) {
SharedPreferences prefManager = PreferenceManager.getDefaultSharedPreferences(context);
if (prefManager.getBoolean("askForStar", true)) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
alertDialogBuilder.setMessage(R.string.dialog_StarOnGitHub);
alertDialogBuilder.setPositiveButton(context.getString(android.R.string.ok), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
setAskForStar(false, context);
}
});
alertDialogBuilder.setNegativeButton(context.getString(android.R.string.no), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setAskForStar(false, context);
}
});
alertDialogBuilder.setNeutralButton(context.getString(R.string.dialog_Later_button), null);
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
}
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/InstallVoiceData.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.app.Activity
import android.os.Bundle
import android.view.Window
class InstallVoiceData : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
requestWindowFeature(Window.FEATURE_NO_TITLE)
super.onCreate(savedInstanceState)
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/LangDB.java
================================================
package com.k2fsa.sherpa.onnx.tts.engine;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
public class LangDB extends SQLiteOpenHelper {
// Database name and table columns
private static final String DB_NAME = "Languages.db";
private static final int DATABASE_VERSION = 2;
public static final String TABLE_NAME = "Languages";
private static final String COLUMN_ID = "ID";
private static final String COLUMN_NAME = "ModelName";
private static final String COLUMN_LANG = "Language";
private static final String COLUMN_COUNTRY = "Country";
private static final String COLUMN_SID = "SpeakerID";
private static final String COLUMN_SPEED = "Speed";
private static final String COLUMN_TYPE = "ModelType";
private static final String COLUMN_VOLUME = "Volume";
private static LangDB instance = null;
private final Context mContext;
public LangDB(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
mContext = context.getApplicationContext(); //mContext = context creates memory leak
}
@Override
public void onCreate(SQLiteDatabase db) {
// Create the table for bird observations with all columns and their data types.
String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS "+TABLE_NAME+" (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
COLUMN_NAME + " TEXT," +
COLUMN_LANG + " TEXT," +
COLUMN_COUNTRY + " TEXT," +
COLUMN_SID + " INTEGER," +
COLUMN_SPEED + " FLOAT," +
COLUMN_TYPE + " TEXT," +
COLUMN_VOLUME + " FLOAT);";
db.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
PreferenceHelper preferenceHelper = new PreferenceHelper(mContext);
switch(oldVersion) {
case 1:
db.execSQL("ALTER TABLE "+TABLE_NAME+" ADD COLUMN "+ COLUMN_VOLUME +" REAL DEFAULT " + preferenceHelper.getVolume());
// we want both updates, so no break statement here...
}
}
public synchronized void addLanguage(String name, String lang, String country, int sid, float speed, float volume, String type) {
// Insert a new row into the table with all columns and their values from parameters.
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_NAME, name);
cv.put(COLUMN_LANG, lang);
cv.put(COLUMN_COUNTRY, country);
cv.put(COLUMN_SID, sid);
cv.put(COLUMN_SPEED, speed);
cv.put(COLUMN_TYPE, type);
cv.put(COLUMN_VOLUME, volume);
db.insert(TABLE_NAME, null, cv); // Insert the row into the table with all columns and their values from parameters.
}
public synchronized void clearAllEntries() {
SQLiteDatabase db = getWritableDatabase();
String CLEAR_TABLE = "DELETE FROM "+ TABLE_NAME;
db.execSQL(CLEAR_TABLE); // Delete all rows in the table, effectively clearing it out.
}
public synchronized List getAllInstalledLanguages() {
SQLiteDatabase db = this.getReadableDatabase();
String SELECT_ALL = "SELECT * FROM "+ TABLE_NAME;
Cursor cursor = db.rawQuery(SELECT_ALL, null); // Execute the query to select all rows from the table and store them in a cursor object for further processing.
List languages = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
Language language = new Language();
language.setId(cursor.getInt(0));
language.setName(cursor.getString(1));
language.setLang(cursor.getString(2));
language.setCountry(cursor.getString(3));
language.setSid(cursor.getInt(4));
language.setSpeed(cursor.getFloat(5));
language.setType(cursor.getString(6));
language.setVolume(cursor.getFloat(7));
languages.add(language);
} while (cursor.moveToNext());
}
cursor.close();
return languages;
}
public synchronized void updateLang(String lang, int sid, float speed, float volume) {
SQLiteDatabase database = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_SID, sid);
values.put(COLUMN_SPEED, speed);
values.put(COLUMN_VOLUME, volume);
database.update(TABLE_NAME, values, COLUMN_LANG + " = ?", new String[]{lang});
database.close();
}
public static LangDB getInstance(Context context) {
if (instance == null && context != null) {
instance = new LangDB(context.getApplicationContext());
}
return instance;
}
public void removeLang(String language) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_NAME, COLUMN_LANG + " = ?",
new String[]{language});
db.close();
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/Language.java
================================================
package com.k2fsa.sherpa.onnx.tts.engine;
public class Language {
private int id;
private String name;
private String lang;
private String country;
private int sid;
private float speed;
private float volume;
private String type;
public Language() {}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setLang(String lang) {this.lang = lang;}
public String getLang() {return lang;}
public void setCountry(String country) {this.country = country;}
public String getCountry() {return country;}
public void setSid(int sid) {this.sid = sid;}
public int getSid() {return sid;}
public void setSpeed(float speed) {this.speed = speed;}
public float getSpeed() {return speed;}
public void setType(String type) {this.type = type;}
public String getType() {return type;}
public void setVolume(float volume) {this.volume = volume;}
public float getVolume() {return this.volume;}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/MainActivity.kt
================================================
@file:OptIn(ExperimentalMaterial3Api::class)
package com.k2fsa.sherpa.onnx.tts.engine
import android.content.Intent
import android.media.AudioAttributes
import android.media.AudioFormat
import android.media.AudioManager
import android.media.AudioTrack
import android.net.Uri
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.Checkbox
import androidx.compose.material3.CheckboxDefaults
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.ExposedDropdownMenuBox
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Slider
import androidx.compose.material3.SliderDefaults
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.onFocusChanged
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.colorResource
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.launch
import org.woheller69.freeDroidWarn.FreeDroidWarn
import java.io.File
const val TAG = "sherpa-onnx-tts-engine"
class MainActivity : ComponentActivity() {
private lateinit var track: AudioTrack
private var stopped: Boolean = false
private var samplesChannel = Channel()
private lateinit var preferenceHelper: PreferenceHelper
private lateinit var langDB: LangDB
override fun onPause() {
super.onPause()
samplesChannel.close()
}
override fun onResume() {
//Reset speed in case it has been changed by TtsService
val db = LangDB.getInstance(this)
val allLanguages = db.allInstalledLanguages
val currentLanguage = allLanguages.first { it.lang == TtsEngine.lang }
TtsEngine.speed.value = currentLanguage.speed
super.onResume()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
preferenceHelper = PreferenceHelper(this)
langDB = LangDB.getInstance(this)
Migrate.renameModelFolder(this) //Rename model folder if "old" structure
if (!preferenceHelper.getCurrentLanguage().equals("")) {
TtsEngine.createTts(this, preferenceHelper.getCurrentLanguage()!!)
initAudioTrack()
setupDisplay(langDB, preferenceHelper)
ThemeUtil.setStatusBarAppearance(this)
FreeDroidWarn.showWarningOnUpgrade(this, BuildConfig.VERSION_CODE)
if (GithubStar.shouldShowStarDialog(this)) GithubStar.starDialog(
this,
"https://github.com/woheller69/ttsengine"
)
} else {
val intent = Intent(this, ManageLanguagesActivity::class.java)
startActivity(intent)
finish()
}
}
private fun restart() {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
startActivity(intent)
finish()
}
@OptIn(ExperimentalMaterial3Api::class, ExperimentalComposeUiApi::class)
private fun setupDisplay(
langDB: LangDB,
preferenceHelper: PreferenceHelper
) {
setContent {
Surface(
modifier = Modifier.fillMaxSize(),
) {
Scaffold(
topBar = {
TopAppBar(title = { Text("SherpaTTS") },
actions = {
IconButton(
onClick = {
startActivity(
Intent(
Intent.ACTION_VIEW,
Uri.parse("https://github.com/woheller69/ttsengine")
)
)
},
colors = IconButtonDefaults.iconButtonColors(
contentColor = colorResource(
R.color.primaryDark
)
)
) {
Icon(Icons.Filled.Info, contentDescription = "Info")
}
}
)
},
floatingActionButton = {
FloatingActionButton(
onClick = {
intent = Intent()
intent.setAction("com.android.settings.TTS_SETTINGS")
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
this.startActivity(intent)
finish()
}
) {
Icon(Icons.Filled.Settings, contentDescription = "TTS Settings")
}
}) {
Box(modifier = Modifier.padding(it)) {
var sampleText by remember { mutableStateOf(getSampleText(TtsEngine.lang ?: "")) }
val numLanguages = langDB.allInstalledLanguages.size
val allLanguages = langDB.allInstalledLanguages
var currentLanguage = allLanguages.indexOfFirst { it.lang == preferenceHelper.getCurrentLanguage()!! }
val numSpeakers = TtsEngine.tts!!.numSpeakers()
LazyColumn( // ✅ LazyColumn replaces Column
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
item {
Text(
getString(R.string.speed) + " " + String.format(
"%.1f",
TtsEngine.speed.value
)
)
}
item {
Slider(
value = TtsEngine.speed.value,
onValueChange = {
TtsEngine.speed.value = it
},
onValueChangeFinished = {
langDB.updateLang(
TtsEngine.lang,
TtsEngine.speakerId.value,
TtsEngine.speed.value,
TtsEngine.volume.value
)
},
valueRange = 0.2F..3.0F,
modifier = Modifier.fillMaxWidth(),
colors = SliderDefaults.colors(
thumbColor = colorResource(R.color.primaryDark),
activeTrackColor = colorResource(R.color.primaryDark)
)
)
}
item {
Row(
verticalAlignment = Alignment.CenterVertically,
) {
var applySystemSpeed by remember {
mutableStateOf(
preferenceHelper.applySystemSpeed()
)
}
Checkbox(
checked = applySystemSpeed,
onCheckedChange = { isChecked ->
preferenceHelper.setApplySystemSpeed(isChecked)
applySystemSpeed = isChecked
},
colors = CheckboxDefaults.colors(
checkedColor = colorResource(R.color.primaryDark)
)
)
Text(
getString(R.string.apply_system_speed)
)
}
}
item { Spacer(modifier = Modifier.height(10.dp)) }
item {
Row(
verticalAlignment = Alignment.CenterVertically,
) {
var stripSSML by remember {
mutableStateOf(
preferenceHelper.getStripSSML()
)
}
Checkbox(
checked = stripSSML,
onCheckedChange = { isChecked ->
preferenceHelper.setStripSSML(isChecked)
stripSSML = isChecked
},
colors = CheckboxDefaults.colors(
checkedColor = colorResource(R.color.primaryDark)
)
)
Text(
getString(R.string.strip_ssml)
)
}
}
item { Spacer(modifier = Modifier.height(10.dp)) }
item {
Box(modifier = Modifier.fillMaxWidth()) {
var expanded by remember { mutableStateOf(false) }
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = it }
) {
val keyboardController =
LocalSoftwareKeyboardController.current
var displayText = allLanguages[currentLanguage].lang
if (allLanguages[currentLanguage].name.isNotEmpty()) displayText =
"$displayText (${allLanguages[currentLanguage].name})"
OutlinedTextField(
value = displayText,
onValueChange = {},
readOnly = true,
label = { Text(getString(R.string.language_id)) },
modifier = Modifier
.fillMaxWidth()
.menuAnchor()
.onFocusChanged { focusState ->
if (focusState.isFocused) {
expanded = true
keyboardController?.hide()
}
},
trailingIcon = {
Icon(
Icons.Default.ArrowDropDown,
contentDescription = "Dropdown"
)
}
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
val langList = (0 until numLanguages).toList()
langList.forEach { langId ->
var dropdownText = allLanguages[langId].lang
if (allLanguages[langId].name.isNotEmpty()) dropdownText =
"$dropdownText (${allLanguages[langId].name})"
DropdownMenuItem(
text = { Text(dropdownText) },
onClick = {
currentLanguage = langId
preferenceHelper.setCurrentLanguage(
allLanguages[langId].lang
)
expanded = false
restart()
}
)
}
}
}
}
}
if (numSpeakers > 1) {
item {
Box(modifier = Modifier.fillMaxWidth()) {
var expanded by remember { mutableStateOf(false) }
val speakerList = (0 until numSpeakers).toList()
var selectedSpeaker by remember { mutableStateOf(TtsEngine.speakerId) }
val keyboardController =
LocalSoftwareKeyboardController.current
ExposedDropdownMenuBox(
expanded = expanded,
onExpandedChange = { expanded = it }
) {
OutlinedTextField(
value = selectedSpeaker.toString(),
onValueChange = {},
readOnly = true,
label = { Text(getString(R.string.speaker_id) + " " + "(0-${numSpeakers - 1})") },
modifier = Modifier
.fillMaxWidth()
.menuAnchor()
.onFocusChanged { focusState ->
if (focusState.isFocused) {
expanded = true
keyboardController?.hide()
}
},
trailingIcon = {
Icon(
Icons.Default.ArrowDropDown,
contentDescription = "Dropdown"
)
}
)
ExposedDropdownMenu(
expanded = expanded,
onDismissRequest = { expanded = false }
) {
speakerList.forEach { speakerId ->
DropdownMenuItem(
text = { Text(speakerId.toString()) },
onClick = {
selectedSpeaker.value = speakerId
TtsEngine.speakerId.value = speakerId
langDB.updateLang(
TtsEngine.lang,
TtsEngine.speakerId.value,
TtsEngine.speed.value,
TtsEngine.volume.value
)
expanded = false
stopped = true
}
)
}
}
}
}
}
}
item {
Row {
Button(
modifier = Modifier.padding(5.dp),
colors = ButtonDefaults.buttonColors(
containerColor = colorResource(R.color.primaryDark),
contentColor = colorResource(R.color.white)
),
onClick = {
val intent = Intent(
applicationContext,
ManageLanguagesActivity::class.java
)
startActivity(intent)
}) {
Image(
painter = painterResource(id = R.drawable.ic_add_24dp),
contentDescription = stringResource(id = R.string.add_language)
)
}
Button(
modifier = Modifier.padding(5.dp),
colors = ButtonDefaults.buttonColors(
containerColor = colorResource(R.color.primaryDark),
contentColor = colorResource(R.color.white)
),
onClick = {
deleteLang(preferenceHelper.getCurrentLanguage())
}) {
Image(
painter = painterResource(id = R.drawable.ic_delete_24dp),
contentDescription = stringResource(id = R.string.delete_language)
)
}
}
}
item {
OutlinedTextField(
value = sampleText,
onValueChange = { sampleText = it },
label = { Text(getString(R.string.input)) },
maxLines = 10,
modifier = Modifier
.fillMaxWidth()
.padding(bottom = 16.dp)
.wrapContentHeight(),
singleLine = false
)
}
item {
Text(
getString(R.string.volume) + " " + String.format(
"%.1f",
TtsEngine.volume.value
)
)
}
item {
Slider(
value = TtsEngine.volume.value,
onValueChange = {
TtsEngine.volume.value = it
},
onValueChangeFinished = {
langDB.updateLang(
TtsEngine.lang,
TtsEngine.speakerId.value,
TtsEngine.speed.value,
TtsEngine.volume.value
)
},
valueRange = 0.2F..5.0F,
modifier = Modifier.fillMaxWidth(),
colors = SliderDefaults.colors(
thumbColor = colorResource(R.color.primaryDark),
activeTrackColor = colorResource(R.color.primaryDark)
)
)
}
item {
Row {
Button(
enabled = true,
modifier = Modifier.padding(5.dp),
colors = ButtonDefaults.buttonColors(
containerColor = colorResource(R.color.primaryDark),
contentColor = colorResource(R.color.white)
),
onClick = {
if (sampleText.isBlank() || sampleText.isEmpty()) {
Toast.makeText(
applicationContext,
getString(R.string.input),
Toast.LENGTH_SHORT
).show()
} else {
stopped = false
track.pause()
track.flush()
track.play()
samplesChannel = Channel()
CoroutineScope(Dispatchers.IO).launch {
for (samples in samplesChannel) {
for (i in samples.indices) {
samples[i] *= TtsEngine.volume.value
}
track.write(
samples,
0,
samples.size,
AudioTrack.WRITE_BLOCKING
)
}
}
if (preferenceHelper.getStripSSML()) sampleText = TtsEngine.stripSsmlTags(sampleText)
CoroutineScope(Dispatchers.Default).launch {
TtsEngine.tts!!.generateWithCallback(
text = sampleText,
sid = TtsEngine.speakerId.value,
speed = TtsEngine.speed.value,
callback = ::callback,
)
}.start()
}
}) {
Image(
painter = painterResource(id = R.drawable.ic_play_24dp),
contentDescription = stringResource(id = R.string.play)
)
}
Button(
modifier = Modifier.padding(5.dp),
colors = ButtonDefaults.buttonColors(
containerColor = colorResource(R.color.primaryDark),
contentColor = colorResource(R.color.white)
),
onClick = {
stopped = true
track.pause()
track.flush()
}) {
Image(
painter = painterResource(id = R.drawable.ic_stop_24dp),
contentDescription = stringResource(id = R.string.stop)
)
}
}
}
}
}
}
}
}
}
private fun deleteLang(currentLanguage: String?) {
// Clear current TTS instance
TtsEngine.tts = null
// Remove from internal cache
TtsEngine.removeLanguageFromCache(currentLanguage!!)
val country: String
val allLanguages = langDB.allInstalledLanguages
country = allLanguages.first { it.lang == currentLanguage }.country
val subdirectoryName = currentLanguage + country
val subdirectory = File(getExternalFilesDir(null), subdirectoryName)
if (subdirectory.exists() && subdirectory.isDirectory) {
val files = subdirectory.listFiles()
files?.forEach { file ->
if (file.isFile) {
file.delete()
}
}
subdirectory.delete()
langDB.removeLang(currentLanguage)
if (langDB.allInstalledLanguages.isEmpty()) preferenceHelper.setCurrentLanguage("")
else preferenceHelper.setCurrentLanguage(langDB.allInstalledLanguages[0].lang)
}
restart()
}
override fun onDestroy() {
if (this::track.isInitialized) track.release()
super.onDestroy()
}
// this function is called from C++
@OptIn(ExperimentalCoroutinesApi::class)
private fun callback(samples: FloatArray): Int {
if (!stopped) {
val samplesCopy = samples.copyOf()
CoroutineScope(Dispatchers.IO).launch {
if (!samplesChannel.isClosedForSend) samplesChannel.send(samplesCopy)
}
return 1
} else {
track.stop()
Log.i(TAG, " return 0")
return 0
}
}
private fun initAudioTrack() {
val sampleRate = TtsEngine.tts!!.sampleRate()
val bufLength = AudioTrack.getMinBufferSize(
sampleRate,
AudioFormat.CHANNEL_OUT_MONO,
AudioFormat.ENCODING_PCM_FLOAT
)
Log.i(TAG, "sampleRate: $sampleRate, buffLength: $bufLength")
val attr = AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
.setUsage(AudioAttributes.USAGE_MEDIA)
.build()
val format = AudioFormat.Builder()
.setEncoding(AudioFormat.ENCODING_PCM_FLOAT)
.setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
.setSampleRate(sampleRate)
.build()
track = AudioTrack(
attr, format, bufLength, AudioTrack.MODE_STREAM,
AudioManager.AUDIO_SESSION_ID_GENERATE
)
track.play()
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/ManageLanguagesActivity.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.widget.ArrayAdapter
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.k2fsa.sherpa.onnx.tts.engine.databinding.ActivityManageLanguagesBinding
import java.io.File
import java.io.FileOutputStream
import java.util.Locale
class ManageLanguagesActivity : AppCompatActivity() {
private var binding: ActivityManageLanguagesBinding? = null
// URIs for selected files
private var modelFileUri: Uri? = null
private var tokensFileUri: Uri? = null
// Store lang_code for later use
private var langCodeForInstallation: String = ""
private var langCode: String = ""
private var modelName: String = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityManageLanguagesBinding.inflate(layoutInflater)
setContentView(binding!!.root)
ThemeUtil.setStatusBarAppearance(this)
val allPiperModels: Array = resources.getStringArray(R.array.piper_models)
val allCoquiModels: Array = resources.getStringArray(R.array.coqui_models)
val db = LangDB.getInstance(this)
val installedLanguages = db.allInstalledLanguages
val installedLangCodes = installedLanguages.map { it.lang }
val showPiperModels = mutableListOf()
for(model in allPiperModels){
val twoLetterCode: String = model.split("_").get(0)
val lang = Locale(twoLetterCode).isO3Language
if (!installedLangCodes.contains(lang)) showPiperModels.add(model)
}
val showCoquiModels = mutableListOf()
for(model in allCoquiModels){
val twoLetterCode: String = model.split("_").get(0)
val lang = Locale(twoLetterCode).isO3Language
if (!installedLangCodes.contains(lang)) showCoquiModels.add(model)
}
val piperAdapter = ArrayAdapter(this, R.layout.list_item, R.id.text_view, showPiperModels)
val coquiAdapter = ArrayAdapter(this, R.layout.list_item, R.id.text_view, showCoquiModels)
binding!!.piperModelList.adapter = piperAdapter
binding!!.piperModelList.setOnItemClickListener { parent, view, position, id ->
val model = showPiperModels.get(position)
val twoLetterCode = model.substring(0, 2)
val country = model.substring(3, 5)
val lang = Locale(twoLetterCode).isO3Language
val type = "vits-piper"
binding!!.piperModelList.visibility = View.GONE
binding!!.coquiModelList.visibility = View.GONE
binding!!.buttonTestVoices.visibility = View.GONE
binding!!.piperHeader.visibility = View.GONE
binding!!.coquiHeader.visibility = View.GONE
binding!!.downloadSize.setText("")
Downloader.downloadModels(this, binding, model, lang, country, type)
}
binding!!.coquiModelList.adapter = coquiAdapter
binding!!.coquiModelList.setOnItemClickListener { parent, view, position, id ->
val model = showCoquiModels.get(position)
val twoLetterCode = model.substring(0, 2)
val country = ""
val lang = Locale(twoLetterCode).isO3Language
val type = "vits-coqui"
binding!!.piperModelList.visibility = View.GONE
binding!!.coquiModelList.visibility = View.GONE
binding!!.buttonTestVoices.visibility = View.GONE
binding!!.piperHeader.visibility = View.GONE
binding!!.coquiHeader.visibility = View.GONE
binding!!.downloadSize.setText("")
Downloader.downloadModels(this, binding, model, lang, country, type)
}
}
fun startMain(view: View) {
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
finishAffinity()
}
fun testVoices(view: View) {startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://huggingface.co/spaces/k2-fsa/text-to-speech/")))}
fun installFromSD(view: View) {
sdInstall()
}
fun sdInstall() {
val dialogView = layoutInflater.inflate(R.layout.dialog_install_custom_model, null)
val langInput = dialogView.findViewById(R.id.editTextLangCode)
val modelInput = dialogView.findViewById(R.id.editTextModelName)
val selectModelBtn = dialogView.findViewById(R.id.buttonSelectModel)
val selectTokensBtn = dialogView.findViewById(R.id.buttonSelectTokens)
val installBtn = dialogView.findViewById(R.id.buttonInstall)
// Initialize button text/visibility
selectModelBtn.setOnClickListener {
modelPickerLauncher.launch(arrayOf("application/octet-stream"))
}
selectTokensBtn.setOnClickListener {
tokensPickerLauncher.launch(arrayOf("text/plain"))
}
installBtn.setOnClickListener {
langCode = langInput.text.toString().trim()
modelName = modelInput.text.toString().trim()
// Validate
if (langCode.length != 3) {
Toast.makeText(this, R.string.language_code_error, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (modelName.isEmpty()) {
Toast.makeText(this, getString(R.string.enter_model_name), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (modelFileUri == null) {
Toast.makeText(this, getString(R.string.select_model_file), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
if (tokensFileUri == null) {
Toast.makeText(this, getString(R.string.select_tokens_file), Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
// Check duplicates
val db = LangDB.getInstance(this)
if (db.allInstalledLanguages.any { it.lang == langCode }) {
Toast.makeText(this, R.string.language_already_installed, Toast.LENGTH_SHORT).show()
return@setOnClickListener
}
// Proceed with install
installCustomModel(langCode, modelFileUri!!, tokensFileUri!!)
}
val dialog = AlertDialog.Builder(this)
.setTitle(getString(R.string.install_from_sd))
.setView(dialogView)
.setNegativeButton(getString(android.R.string.cancel)) { dialogInterface, _ -> dialogInterface.dismiss() }
.create()
dialog.show()
}
private fun installCustomModel(langCode: String, modelUri: Uri, tokensUri: Uri) {
// Create directory for the language (country code is empty as requested)
val directory = File(this.getExternalFilesDir(null), "/$langCode/")
if (!directory.exists() && !directory.mkdirs()) {
Toast.makeText(this, R.string.error_copying_files, Toast.LENGTH_SHORT).show()
return
}
// Copy model.onnx file
val modelDest = File(directory, Downloader.onnxModel)
try {
copyFile(modelUri, modelDest)
} catch (e: Exception) {
Toast.makeText(this, R.string.error_copying_files, Toast.LENGTH_SHORT).show()
return
}
// Copy tokens.txt file
val tokensDest = File(directory, Downloader.tokens)
try {
copyFile(tokensUri, tokensDest)
} catch (e: Exception) {
Toast.makeText(this, R.string.error_copying_files, Toast.LENGTH_SHORT).show()
return
}
// Add to database as vits-piper model with empty country code
val db = LangDB.getInstance(this)
db.addLanguage(modelName, langCode, "", 0, 1.0f, 1.0f, "vits-piper")
// Show success message
Toast.makeText(this, "+ \"$langCode\" = \"$modelName\" ", Toast.LENGTH_SHORT).show()
val preferenceHelper = PreferenceHelper(this)
preferenceHelper.setCurrentLanguage(langCode)
// Reset file URIs and lang code for next use
modelFileUri = null
tokensFileUri = null
langCodeForInstallation = ""
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
finishAffinity()
}
private fun copyFile(sourceUri: Uri, destFile: File) {
this.contentResolver.openInputStream(sourceUri)?.use { input ->
FileOutputStream(destFile).use { output ->
input.copyTo(output)
}
}
}
// Register for file pickers
private val modelPickerLauncher = registerForActivityResult(
ActivityResultContracts.OpenDocument()
) { uri ->
if (uri != null) {
modelFileUri = uri
}
}
private val tokensPickerLauncher = registerForActivityResult(
ActivityResultContracts.OpenDocument()
) { uri ->
if (uri != null) {
tokensFileUri = uri
}
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/Migrate.java
================================================
package com.k2fsa.sherpa.onnx.tts.engine;
import android.content.Context;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
//This class can be removed in future if migration from old structure is no longer needed, e.g. in 2026
public class Migrate {
//Move model from old modelDir to new language based folder structure
public static void renameModelFolder(Context context){
File sdcardDataFolder = context.getExternalFilesDir(null);
File lang = new File(sdcardDataFolder.getAbsolutePath(), "modelDir/lang");
if (lang.exists()) { //move to new directory structure
String[] model = readLanguageFromFile(context);
File modelDirFolder = new File(sdcardDataFolder.getAbsolutePath(),"modelDir");
File langFolder = new File(sdcardDataFolder.getAbsolutePath(),model[0]);
modelDirFolder.renameTo(langFolder);
PreferenceHelper preferenceHelper = new PreferenceHelper(context);
preferenceHelper.setCurrentLanguage(model[0]);
LangDB langDB = LangDB.getInstance(context);
langDB.addLanguage(model[1], model[0], "", 0, 1.0f, 1.0f, "vits-piper");
}
}
public static String[] readLanguageFromFile(Context context) {
File sdcardDataFolder = context.getExternalFilesDir(null);
File langFile = new File(sdcardDataFolder.getAbsolutePath(), "modelDir/lang");
// Default fallback values
String languageCode = "eng";
String languageName = "???";
try (BufferedReader br = new BufferedReader(new FileReader(langFile))) {
String line1 = br.readLine(); // language code
String line2 = br.readLine(); // language name
if (line1 != null) {
languageCode = line1.trim();
}
if (line2 != null) {
languageName = line2.trim();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return new String[]{languageCode, languageName};
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/PreferenceHelper.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.content.Context
import android.content.SharedPreferences
class PreferenceHelper(context: Context) {
private val PREFS_NAME = "com.k2fsa.sherpa.onnx.tts.engine"
private val SPEED_KEY = "speed"
private val SID_KEY = "speaker_id"
private val INIT_KEY = "init_espeak"
private val USE_SYSTEM_SPEED = "apply_system_speed"
private val STRIP_SSML = "strip_ssml"
private val CURRENT_LANGUAGE = "current_language"
private val VOLUME = "volume"
private val sharedPreferences: SharedPreferences =
context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
fun setInitFinished() {
val editor = sharedPreferences.edit()
editor.putBoolean(INIT_KEY, true)
editor.apply()
}
fun isInitFinished(): Boolean {
return sharedPreferences.getBoolean(INIT_KEY, false)
}
fun setCurrentLanguage(language: String){
val editor = sharedPreferences.edit()
editor.putString(CURRENT_LANGUAGE, language)
editor.apply()
}
fun getCurrentLanguage(): String? {
return sharedPreferences.getString(CURRENT_LANGUAGE, "")
}
fun setApplySystemSpeed(useSystem: Boolean){
val editor = sharedPreferences.edit()
editor.putBoolean(USE_SYSTEM_SPEED, useSystem)
editor.apply()
}
fun applySystemSpeed(): Boolean {
return sharedPreferences.getBoolean(USE_SYSTEM_SPEED, false)
}
fun setStripSSML(stripSSML: Boolean){
val editor = sharedPreferences.edit()
editor.putBoolean(STRIP_SSML, stripSSML)
editor.apply()
}
fun getStripSSML(): Boolean {
return sharedPreferences.getBoolean(STRIP_SSML, false)
}
fun getVolume(): Float{
return sharedPreferences.getFloat(VOLUME,1.0f)
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/ThemeUtil.java
================================================
package com.k2fsa.sherpa.onnx.tts.engine;
import android.app.Activity;
import android.os.Build;
import android.view.WindowInsetsController;
public class ThemeUtil {
public static void setStatusBarAppearance(Activity activity){
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
WindowInsetsController insetsController = activity.getWindow().getInsetsController();
if (insetsController != null) {
insetsController.setSystemBarsAppearance(
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS,
WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS
);
}
}
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsEngine.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.content.Context
import android.content.res.AssetManager
import android.util.Log
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.mutableIntStateOf
import com.k2fsa.sherpa.onnx.OfflineTts
import com.k2fsa.sherpa.onnx.getOfflineTtsConfig
import org.jsoup.Jsoup
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
object TtsEngine {
private val ttsCache = mutableMapOf()
var tts: OfflineTts? = null
// https://en.wikipedia.org/wiki/ISO_639-3
var lang: String? = ""
var country: String? = ""
var volume: MutableState = mutableFloatStateOf(1.0F)
var speed: MutableState = mutableFloatStateOf(1.0F)
var speakerId: MutableState = mutableIntStateOf(0)
private var modelName: String = "model.onnx"
private var acousticModelName: String? = null // for matcha tts
private var vocoder: String? = null // for matcha tts
private var voices: String? = null // for kokoro
private var ruleFsts: String? = null
private var ruleFars: String? = null
private var lexicon: String? = null
private var dataDir: String = "espeak-ng-data"
private var dictDir: String? = null
fun getAvailableLanguages(context: Context): ArrayList {
val langCodes = java.util.ArrayList()
val db = LangDB.getInstance(context)
val allLanguages = db.allInstalledLanguages
for (language in allLanguages) {
langCodes.add(language.lang)
}
return langCodes
}
fun stripSsmlTags(text: String): String {
return Jsoup.parse(text).text().trim()
}
fun createTts(context: Context, language: String) {
if (tts == null || lang != language) {
if (ttsCache.containsKey(language)) {
Log.i(TAG, "From TTS cache: " + language)
tts = ttsCache[language]
loadLanguageSettings(context, language)
} else {
initTts(context, language)
}
}
}
private fun loadLanguageSettings(context: Context, language: String) {
val db = LangDB.getInstance(context)
val currentLanguage = db.allInstalledLanguages.first { it.lang == language }
this.lang = language
this.country = currentLanguage.country
this.speed.value = currentLanguage.speed
this.speakerId.value = currentLanguage.sid
this.volume.value = currentLanguage.volume
PreferenceHelper(context).setCurrentLanguage(language)
}
fun removeLanguageFromCache(language: String) {
ttsCache.remove(language)
Log.i(TAG, "Removed TTS cache for: $language")
Log.i(TAG, "TTS cache size:"+ ttsCache.size)
}
private fun initTts(context: Context, lang: String) {
Log.i(TAG, "Add to TTS cache: " + lang)
loadLanguageSettings(context, lang)
val externalFilesDir = context.getExternalFilesDir(null)!!.absolutePath
val modelDir = "$externalFilesDir/$lang$country"
var newDataDir = ""
if (dataDir != null) {
newDataDir = copyDataDir(context, dataDir!!)
}
if (dictDir != null) {
val newDir = copyDataDir(context, dictDir!!)
dictDir = "$newDir/$dictDir"
ruleFsts = "$modelDir/phone.fst,$modelDir/date.fst,$modelDir/number.fst"
}
val config = getOfflineTtsConfig(
modelDir = modelDir!!,
modelName = modelName ?: "",
acousticModelName = acousticModelName ?: "",
vocoder = vocoder ?: "",
voices = voices ?: "",
lexicon = lexicon ?: "",
dataDir = newDataDir ?: "",
dictDir = dictDir ?: "",
ruleFsts = ruleFsts ?: "",
ruleFars = ruleFars ?: ""
)
val configDebugOff = config.copy( // create a new instance with debug switched off
model = config.model.copy(debug = false)
)
tts = OfflineTts(assetManager = null, config = configDebugOff)
ttsCache[lang] = tts!!
Log.i(TAG, "TTS cache size:"+ ttsCache.size)
}
private fun copyDataDir(context: Context, dataDir: String): String {
Log.i(TAG, "data dir is $dataDir")
if (!PreferenceHelper(context).isInitFinished()){ //only copy at first startup
copyAssets(context, dataDir)
PreferenceHelper(context).setInitFinished()
}
val newDataDir = context.getExternalFilesDir(null)!!.absolutePath + "/" + dataDir
Log.i(TAG, "newDataDir: $newDataDir")
return newDataDir
}
private fun copyAssets(context: Context, path: String) {
val assets: Array?
try {
assets = context.assets.list(path)
if (assets!!.isEmpty()) {
copyFile(context, path)
} else {
val fullPath = "${context.getExternalFilesDir(null)}/$path"
val dir = File(fullPath)
dir.mkdirs()
for (asset in assets.iterator()) {
val p: String = if (path == "") "" else "$path/"
copyAssets(context, p + asset)
}
}
} catch (ex: IOException) {
Log.e(TAG, "Failed to copy $path. $ex")
}
}
private fun copyFile(context: Context, filename: String) {
try {
val istream = context.assets.open(filename)
val newFilename = context.getExternalFilesDir(null)!!.absolutePath + "/" + filename
val file = File(newFilename)
if (!file.exists()) {
val ostream = FileOutputStream(newFilename)
val buffer = ByteArray(1024)
var read = 0
while (read != -1) {
ostream.write(buffer, 0, read)
read = istream.read(buffer)
}
istream.close()
ostream.flush()
ostream.close()
}
} catch (ex: Exception) {
Log.e(TAG, "Failed to copy $filename, $ex")
}
}
}
================================================
FILE: app/src/main/java/com/k2fsa/sherpa/onnx/tts/engine/TtsService.kt
================================================
package com.k2fsa.sherpa.onnx.tts.engine
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_NEW_TASK
import android.media.AudioFormat
import android.speech.tts.SynthesisCallback
import android.speech.tts.SynthesisRequest
import android.speech.tts.TextToSpeech
import android.speech.tts.TextToSpeechService
import android.util.Log
class TtsService : TextToSpeechService() {
override fun onCreate() {
Log.i(TAG, "onCreate tts service")
super.onCreate()
// see https://github.com/Miserlou/Android-SDK-Samples/blob/master/TtsEngine/src/com/example/android/ttsengine/RobotSpeakTtsService.java#L68
onLoadLanguage(TtsEngine.lang, "", "")
}
override fun onDestroy() {
Log.i(TAG, "onDestroy tts service")
super.onDestroy()
}
// https://developer.android.com/reference/kotlin/android/speech/tts/TextToSpeechService#onislanguageavailable
override fun onIsLanguageAvailable(_lang: String?, _country: String?, _variant: String?): Int {
val lang = _lang ?: ""
if (TtsEngine.getAvailableLanguages(this).contains(lang)) {
return TextToSpeech.LANG_AVAILABLE
}
return TextToSpeech.LANG_NOT_SUPPORTED
}
override fun onGetLanguage(): Array { //returns language currently being used
return arrayOf(TtsEngine.lang!!, "", "")
}
// https://developer.android.com/reference/kotlin/android/speech/tts/TextToSpeechService#onLoadLanguage(kotlin.String,%20kotlin.String,%20kotlin.String)
override fun onLoadLanguage(_lang: String?, _country: String?, _variant: String?): Int {
Log.i(TAG, "onLoadLanguage: $_lang, $_country")
val lang = _lang ?: ""
Migrate.renameModelFolder(this) //Rename model folder if "old" structure
val preferenceHelper = PreferenceHelper(this)
return if (preferenceHelper.getCurrentLanguage().equals("")){ //Download model first if no model is installed
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
TextToSpeech.LANG_MISSING_DATA
} else {
if (TtsEngine.getAvailableLanguages(this).contains(lang)) {
Log.i(TAG, "creating tts, lang :$lang")
TtsEngine.createTts(application, lang)
TextToSpeech.LANG_AVAILABLE
} else {
Log.i(TAG, "lang $lang not supported, tts engine lang: ${TtsEngine.lang}")
TextToSpeech.LANG_NOT_SUPPORTED
}
}
}
override fun onStop() {}
override fun onSynthesizeText(request: SynthesisRequest?, callback: SynthesisCallback?) {
if (TtsEngine.tts == null || request == null || callback == null) {
return
}
val language = request.language
val country = request.country
val variant = request.variant
var pitch = 100f
val preferenceHelper = PreferenceHelper(this)
if (preferenceHelper.applySystemSpeed()){
pitch = request.pitch * 1.0f
TtsEngine.speed.value = request.speechRate / pitch //divide by pitch to compensate for pitch adjustment performed in ttsCallback
} // request.speechRate: System does not memorize different speeds for different languages
var text = request.charSequenceText.toString()
if (preferenceHelper.getStripSSML()) text = TtsEngine.stripSsmlTags(text)
val ret = onIsLanguageAvailable(language, country, variant)
if (ret == TextToSpeech.LANG_NOT_SUPPORTED) {
callback.error()
return
}
val tts = TtsEngine.tts!!
callback.start(tts.sampleRate(), AudioFormat.ENCODING_PCM_16BIT, 1)
if (text.isBlank() || text.isEmpty()) {
callback.done()
return
}
val ttsCallback: (FloatArray) -> Int = fun(floatSamples): Int {
val samples: ByteArray
if (pitch != 100f){ //if not default pitch, play samples faster or slower. Speed has already been compensated before generation, see above
val speedFactor = pitch / 100f
val newSampleCount = (floatSamples.size / speedFactor).toInt()
val newSamples = FloatArray(newSampleCount)
for (i in 0 until newSampleCount) {
newSamples[i] = floatSamples[(i * speedFactor).toInt()] * TtsEngine.volume.value
}
// Convert the modified FloatArray to ByteArray
samples = floatArrayToByteArray(newSamples)
} else {
// Convert FloatArray to ByteArray
for (i in floatSamples.indices) {
floatSamples[i] *= TtsEngine.volume.value
}
samples = floatArrayToByteArray(floatSamples)
}
val maxBufferSize: Int = callback.maxBufferSize
var offset = 0
while (offset < samples.size) {
val bytesToWrite = Math.min(maxBufferSize, samples.size - offset)
callback.audioAvailable(samples, offset, bytesToWrite)
offset += bytesToWrite
}
// 1 means to continue
// 0 means to stop
return 1
}
//Log.i(TAG, "text: $text")
tts.generateWithCallback(
text = text,
sid = TtsEngine.speakerId.value,
speed = TtsEngine.speed.value,
callback = ttsCallback,
)
callback.done()
}
private fun floatArrayToByteArray(audio: FloatArray): ByteArray {
// byteArray is actually a ShortArray
val byteArray = ByteArray(audio.size * 2)
for (i in audio.indices) {
val sample = (audio[i] * 32767).toInt()
byteArray[2 * i] = sample.toByte()
byteArray[2 * i + 1] = (sample shr 8).toByte()
}
return byteArray
}
}
================================================
FILE: app/src/main/res/drawable/ic_add_24dp.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_delete_24dp.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_launcher_foreground.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_launcher_foreground_monochrome.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_play_24dp.xml
================================================
================================================
FILE: app/src/main/res/drawable/ic_stop_24dp.xml
================================================
================================================
FILE: app/src/main/res/drawable/rounded_frame_thin.xml
================================================
================================================
FILE: app/src/main/res/drawable/rounded_solid.xml
================================================
================================================
FILE: app/src/main/res/layout/activity_manage_languages.xml
================================================
================================================
FILE: app/src/main/res/layout/dialog_install_custom_model.xml
================================================
================================================
FILE: app/src/main/res/layout/list_item.xml
================================================
================================================
FILE: app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
================================================
================================================
FILE: app/src/main/res/values/arrays.xml
================================================
- ar_JO-kareem-low
- ar_JO-kareem-medium
- ar_JO-SA_dii-high
- ar_JO-SA_miro-high
- ar_JO-SA_miro_V2-high
- ca_ES-upc_ona-medium
- ca_ES-upc_ona-x_low
- ca_ES-upc_pau-x_low
- ca_ES-upc_pau-x_low
- cs_CZ-jirka-low
- cs_CZ-jirka-medium
- cy_GB-bu_tts-medium
- cy_GB-gwryw_gogleddol-medium
- da_DK-talesyntese-medium
- de_DE-dii-high
- de_DE-eva_k-x_low
- de_DE-glados-low
- de_DE-glados-medium
- de_DE-glados-high
- de_DE-glados_turret-low
- de_DE-glados_turret-medium
- de_DE-glados_turret-high
- de_DE-karlsson-low
- de_DE-kerstin-low
- de_DE-miro-high
- de_DE-pavoque-low
- de_DE-ramona-low
- de_DE-thorsten-high
- de_DE-thorsten-low
- de_DE-thorsten-medium
- de_DE-thorsten_emotional-medium
- el_GR-rapunzelina-low
- en_GB-alan-low
- en_GB-alan-medium
- en_GB-alba-medium
- en_GB-aru-medium
- en_GB-cori-high
- en_GB-cori-medium
- en_GB-dii-high
- en_GB-jenny_dioco-medium
- en_GB-miro-high
- en_GB-northern_english_male-medium
- en_GB-semaine-medium
- en_GB-southern_english_female-low
- en_GB-southern_english_female-medium
- en_GB-southern_english_male-medium
- en_GB-sweetbbak-amy
- en_GB-vctk-medium
- en_US-amy-low
- en_US-amy-medium
- en_US-arctic-medium
- en_US-bryce-medium
- en_US-danny-low
- en_US-glados
- en_US-glados-high
- en_US-hfc_female-medium
- en_US-hfc_male-medium
- en_US-joe-medium
- en_US-john-medium
- en_US-kathleen-low
- en_US-kristin-medium
- en_US-kusal-medium
- en_US-l2arctic-medium
- en_US-lessac-high
- en_US-lessac-low
- en_US-lessac-medium
- en_US-libritts-high
- en_US-libritts_r-medium
- en_US-ljspeech-high
- en_US-ljspeech-medium
- en_US-miro-high
- en_US-norman-medium
- en_US-ryan-high
- en_US-ryan-low
- en_US-ryan-medium
- es_AR-daniela-high
- es_ES-carlfm-x_low
- es_ES-davefx-medium
- es_ES-glados-medium
- es_ES-miro-high
- es_ES-sharvard-medium
- es_MX-ald-medium
- es_MX-claude-high
- fa_IR-amir-medium
- fa_IR-ganji-medium
- fa_IR-ganji_adabi-medium
- fa_IR-gyro-medium
- fa_IR-reza_ibrahim-medium
- fa_en-rezahedayatfar-ibrahimwalk-medium
- fi_FI-harri-low
- fi_FI-harri-medium
- fr_FR-gilles-low
- fr_FR-miro-high
- fr_FR-siwis-low
- fr_FR-siwis-medium
- fr_FR-tjiho-model1
- fr_FR-tjiho-model2
- fr_FR-tjiho-model3
- fr_FR-tom-medium
- fr_FR-upmc-medium
- hi_IN-pratham-medium
- hi_IN-priyamvada-medium
- hi_IN-rohan-medium
- hu_HU-anna-medium
- hu_HU-berta-medium
- hu_HU-imre-medium
- id_ID-news_tts-medium
- is_IS-bui-medium
- is_IS-salka-medium
- is_IS-steinn-medium
- is_IS-ugla-medium
- it_IT-dii-high
- it_IT-miro-high
- it_IT-paola-medium
- it_IT-riccardo-x_low
- ka_GE-natia-medium
- kk_KZ-iseke-x_low
- kk_KZ-issai-high
- kk_KZ-raya-x_low
- lv_LV-aivars-medium
- lb_LU-marylux-medium
- ne_NP-chitwan-medium
- ne_NP-google-medium
- ne_NP-google-x_low
- nl_BE-nathalie-medium
- nl_BE-nathalie-x_low
- nl_BE-rdh-medium
- nl_BE-rdh-x_low
- nl_NL-dii-high
- nl_NL-miro-high
- no_NO-talesyntese-medium
- pl_PL-darkman-medium
- pl_PL-gosia-medium
- pl_PL-jarvis_wg_glos-medium
- pl_PL-justyna_wg_glos-medium
- pl_PL-mc_speech-medium
- pl_PL-meski_wg_glos-medium
- pl_PL-zenski_wg_glos-medium
- pt_BR-cadu-medium
- pt_BR-edresson-low
- pt_BR-dii-high
- pt_BR-faber-medium
- pt_BR-jeff-medium
- pt_BR-miro-high
- pt_PT-dii-high
- pt_PT-miro-high
- pt_PT-tugao-medium
- ro_RO-mihai-medium
- ru_RU-denis-medium
- ru_RU-dmitri-medium
- ru_RU-irina-medium
- ru_RU-ruslan-medium
- sk_SK-lili-medium
- sl_SI-artur-medium
- sr_RS-serbski_institut-medium
- sv_SE-lisa-medium
- sv_SE-nst-medium
- sw_CD-lanfrica-medium
- tr_TR-dfki-medium
- tr_TR-fahrettin-medium
- tr_TR-fettah-medium
- uk_UA-lada-x_low
- uk_UA-ukrainian_tts-medium
- vi_VN-25hours_single-low
- vi_VN-vais1000-medium
- vi_VN-vivos-x_low
- zh_CN-huayan-medium
- bg-cv
- bn-custom_female
- cs-cv
- da-cv
- de-css10
- en-ljspeech
- en-ljspeech-neon
- en-vctk
- es-css10
- et-cv
- fi-css10
- fr-css10
- ga-cv
- hr-cv
- lt-cv
- lv-cv
- mt-cv
- nl-css10
- pl-mai_female
- pt-cv
- ro-cv
- sk-cv
- sl-cv
- sv-cv
- uk-mai
================================================
FILE: app/src/main/res/values/colors.xml
================================================
#0b62c2
#FFFFFFFF
#888888
================================================
FILE: app/src/main/res/values/ic_launcher_background.xml
================================================
@color/primaryDark
================================================
FILE: app/src/main/res/values/strings.xml
================================================
SherpaTTS
START
Download error
Do you like this app? Please give a star on GitHub or buy the developer a coffee via PayPal.
Maybe later
Play
Stop
Speed
Speaker ID:
Language\u2009
Text to generate
Download language
Try models
Add language
Delete language
Piper models
Coqui models
Apply system settings (speed / pitch) for use as system-wide TTS engine
Volume
Only 1 model per language!
Strip SSML tags (beta)
Install Piper Model from SD
3-letter ISO 639-2 code
Enter model name
Select model.onnx file
Select tokens.txt file
Cancel
Invalid language code. Please enter a 3-letter code.
Language already installed
Error copying files
================================================
FILE: app/src/main/res/values/themes.xml
================================================
================================================
FILE: app/src/main/res/values-cs/strings.xml
================================================
Líbí se vám tato aplikace? Přidejte si ji do oblíbených na GitHubu nebo kupte vývojáři kafe pomocí PayPalu.
Stáhnout jazyk
SPUSTIT
Chyba při stahování
Možná později
Přehrát
Zastavit
Rychlost
ID mluvčího:
Jazyk
Text k vytvoření
Vyzkoušet modely
Přidat jazyk
Odstranit jazyk
Modely Piper
Modely Coqui
Použít systémová nastavení (rychlost / výška) pro použití jako systémový modul TTS
================================================
FILE: app/src/main/res/values-de/strings.xml
================================================
LOS GEHT\'S
Fehler beim Herunterladen
Mögen Sie diese App? Bitte vergeben Sie einen Stern auf GitHub oder spendieren Sie dem Entwickler einen Kaffee über PayPal.
Vielleicht später
Abspielen
Anhalten
Geschwindigkeit
Sprecher ID:
Sprache\u2009
Text für die Sprachausgabe
Sprache herunterladen
Modelle testen
Sprache hinzufügen
Sprache löschen
Piper Modelle
Coqui Modelle
Einstellungen des Systems (Geschwindigkeit / Tonlage) bei Verwendung als systemweite Sprachausgabe anwenden
Lautstärke
Nur 1 Modell je Sprache!
================================================
FILE: app/src/main/res/values-hu/strings.xml
================================================
INDÍTÁS
Letöltési hiba
Tetszik ez az alkalmazás? Adjon egy csillagot a GitHub-on, vagy vegyen a fejlesztőnek egy kávét a PayPal-on keresztül.
Talán később
Lejátszás
Leállítás
Sebesség
Nyelv
Létrehozandó szöveg
Nyelv letöltése
Próbáljon ki modelleket
Nyelv hozzáadása
Nyelv törlése
Piper modellek
Coqui modellek
Rendszerbeállítások (sebesség / hangmagasság) alkalmazása a rendszer egészére kiterjedő TTS-motorként való használathoz
Hangszóró azonosító:
================================================
FILE: app/src/main/res/values-it/strings.xml
================================================
AVVIA
Errore durante lo scaricamento
Ti piace questa app? Perfavore dai una stella su GitHub o offri un caffè allo sviluppatore tramite PayPal.
Forse dopo
Play
Stop
Velocità
Speaker ID:
Lingua\u2009
Testo per generare
Scarica lingua
Prova i modelli
Aggiungi lingua
Elimina lingua
Modelli Piper
Modelli Coqui
Applicare le impostazioni di sistema (velocità/tono) per l\'utilizzo come motore TTS a livello di sistema
================================================
FILE: app/src/main/res/values-pt-rBR/strings.xml
================================================
INICIAR
Erro ao baixar
Você gosta desse app? Então por favor dê uma estrela no GitHub ou compre um café para o desenvolvedor pelo PayPal.
Talvez depois
Reproduzir
Parar
Velocidade
ID de falante:
Idioma
Texto para gerar
Baixar idioma
Testar modelos
Adicionar idioma
Excluir idioma
Modelos Piper
Modelos Coqui
Aplicar configurações do sistema (velocidade / timbre) para uso do motor de TTS no sistema inteiro
================================================
FILE: app/src/main/res/values-ro/strings.xml
================================================
PORNEȘTE
Eroare la descărcare
Îți place această aplicație? Pune o stea pe Github sau cumpără dezvoltatorului o cafea prin PayPal.
Poate mai târziu
Redă
Oprește
Ritmul vorbirii
ID vorbitor:
Limbă
Text pentru a genera
Descarcă limba
Încearcă modele
Adaugă limba
Șterge limba
Modele ”Piper”
Modele ”Coqui”
Sintetizator vorbire SherpaTTS
Aplică setările sistemului (ritmul vorbirii/înălțime) pentru utilizarea ca motor TTS la nivel de sistem
================================================
FILE: app/src/main/res/values-ru/strings.xml
================================================
Вам нравится это приложение? Пожалуйста, поставьте звездочку на GitHub или купите кофе разработчику через PayPal.
Скачать язык
ID говорящего:
Может быть попозже
Воспроизвести
Остановить
Скорость
Язык
Текст для генерации
Попробуйте модели
Удалить язык
Модели Piper
Модели Coqui
НАЧАТЬ
Добавить язык
Ошибка при скачивании
================================================
FILE: app/src/main/res/values-tr/strings.xml
================================================
İndirme hatası
Belki daha sonra
Oynat
Durdur
Konuşma hızı
Konuşmacı Kimliği:
Dil
Oluşturulacak metin
Dil İndir
Model örneklerine göz atın
Dil ekle
Dili sil
Piper modelleri
Coqui modelleri
BAŞLAT
Bu uygulamayı beğendiniz mi? Lütfen GitHub\'da bir yıldız verin veya geliştiriciye PayPal aracılığıyla bir kahve ısmarlayın.
Sistem genelinde sentezleyici motoru olarak kullanmak için sistem ayarlarını (hız / perde) uygula
================================================
FILE: app/src/main/res/xml/data_extraction_rules.xml
================================================
================================================
FILE: app/src/main/res/xml/tts_engine.xml
================================================
================================================
FILE: build.gradle.kts
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id("com.android.application") version "8.2.2" apply false
id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}
================================================
FILE: fastlane/metadata/android/cs-CZ/full_description.txt
================================================
SherpaTTS je převodník textu na řeč pro systém Android založený na hlasech nové generace Kaldi používajících hlasy Piper a Coqui.
Po prvním spuštění aplikace si budete moci stáhnout váš upřednostňovaný jazyk ze služby Hugging Face.
Toto je jediná chvíle, kde je vyžadováno připojení k internetu.
Jakmile bude model stažen, bude převod textu na řeč fungovat kompletně offline, čímž bude zajištěno vaše soukromí a pohodlí.
================================================
FILE: fastlane/metadata/android/cs-CZ/short_description.txt
================================================
Převodník textu na řeč založený na Kaldi nové generace
================================================
FILE: fastlane/metadata/android/cs-CZ/title.txt
================================================
SherpaTTS
================================================
FILE: fastlane/metadata/android/en-US/changelogs/12.txt
================================================
Initial version for F-Droid
================================================
FILE: fastlane/metadata/android/en-US/changelogs/13.txt
================================================
Support for multiple languages
Bugfixes
================================================
FILE: fastlane/metadata/android/en-US/changelogs/14.txt
================================================
Delete languages
================================================
FILE: fastlane/metadata/android/en-US/changelogs/15.txt
================================================
Add Coqui models
Translation for Russian, Czech, Portuguese (Brazil), Romanian, Turkish
================================================
FILE: fastlane/metadata/android/en-US/changelogs/16.txt
================================================
Option speed/pitch from system settings
Translations
================================================
FILE: fastlane/metadata/android/en-US/changelogs/17.txt
================================================
Add option to adjust volume
Bugfixes
================================================
FILE: fastlane/metadata/android/en-US/changelogs/18.txt
================================================
Translations
Code improvement
================================================
FILE: fastlane/metadata/android/en-US/changelogs/19.txt
================================================
Remove from system backup
================================================
FILE: fastlane/metadata/android/en-US/changelogs/20.txt
================================================
Hint in download activity
================================================
FILE: fastlane/metadata/android/en-US/changelogs/21.txt
================================================
New Piper models added
================================================
FILE: fastlane/metadata/android/en-US/changelogs/22.txt
================================================
New Piper models added
================================================
FILE: fastlane/metadata/android/en-US/changelogs/23.txt
================================================
Update for Android 15 (SDK 35)
Additional Piper models
================================================
FILE: fastlane/metadata/android/en-US/changelogs/24.txt
================================================
More Piper models
================================================
FILE: fastlane/metadata/android/en-US/changelogs/25.txt
================================================
Adjust volume for each language
Bugfix
================================================
FILE: fastlane/metadata/android/en-US/changelogs/26.txt
================================================
More Piper models
Deprecation warning
Code clean up
================================================
FILE: fastlane/metadata/android/en-US/changelogs/27.txt
================================================
TTS Engine caching
Additional German model
================================================
FILE: fastlane/metadata/android/en-US/changelogs/28.txt
================================================
More Arabic Piper models
================================================
FILE: fastlane/metadata/android/en-US/changelogs/29.txt
================================================
Improved sideloading of other models
================================================
FILE: fastlane/metadata/android/en-US/changelogs/30.txt
================================================
Add option to filter SSML
================================================
FILE: fastlane/metadata/android/en-US/changelogs/31.txt
================================================
Improved sideloading
================================================
FILE: fastlane/metadata/android/en-US/full_description.txt
================================================
SherpaTTS is an Android Text-to-Speech engine based on Next-gen Kaldi using Piper or Coqui voices.
Upon launching the app for the first time, it will download your preferred voice model from Hugging Face.
Please note that this is the only instance where internet permission is required.
Once the model is downloaded, text-to-speech works entirely offline, ensuring your privacy and convenience.
================================================
FILE: fastlane/metadata/android/en-US/short_description.txt
================================================
Text-to-Speech engine based on Next-gen Kaldi
================================================
FILE: fastlane/metadata/android/en-US/title.txt
================================================
SherpaTTS
================================================
FILE: fastlane/metadata/android/hu-HU/full_description.txt
================================================
A SherpaTTS egy Androidos szövegfelolvasó motor, amely az újgenerációs Kaldin alapul, valamint a Piper vagy Coqui hangokat használja.
Az alkalmazás első indításakor a program letölti a kívánt hangmodellt az Hugging Face-ről.
Felhívjuk figyelmét, hogy ez az egyetlen eset, amikor internet-hozzáférésre van szükség.
A modell letöltése után a szövegfelolvasó funkció teljesen offline működik, így biztosítva az Ön magánéletét és kényelmét.
================================================
FILE: fastlane/metadata/android/hu-HU/short_description.txt
================================================
Újgenerációs Kaldi alapú szövegfelolvasó
================================================
FILE: fastlane/metadata/android/hu-HU/title.txt
================================================
SherpaTTS
================================================
FILE: fastlane/metadata/android/it-IT/full_description.txt
================================================
SherpaTTS è un motore Text-to-Speech Android basato su Kaldi di nuova generazione che utilizza le voci Piper o Coqui.
Al primo avvio dell'app, verrà scaricato il modello vocale preferito da Hugging Face.
Si prega di notare che questa è l'unico momento in cui è richiesta l'autorizzazione Internet.
Una volta scaricato il modello, il text-to-speech funziona completamente offline, garantendo la privacy e la comodità.
================================================
FILE: fastlane/metadata/android/it-IT/short_description.txt
================================================
Motore di sintesi vocale basato su Kaldi di nuova generazione
================================================
FILE: fastlane/metadata/android/it-IT/title.txt
================================================
SherpaTTS
================================================
FILE: fastlane/metadata/android/pt-BR/full_description.txt
================================================
O SherpaTTS é um motor de texto-para-fala para Android baseado no Kaldi de próxima geração, usando vozes Piper ou Coqui.
Ao abrir o app pela primeira vez, ele baixará seu modelo de voz preferido do Hugging Face.
Note que essa é o único uso da permissão de internet.
Quando o modelo for baixado, o texto-para-fala funcionará completamente off-line, garantindo sua privacidade e conveniência.
================================================
FILE: fastlane/metadata/android/pt-BR/short_description.txt
================================================
Motor de texto-para-fala baseado no Kaldi de próxima geração
================================================
FILE: fastlane/metadata/android/ro/full_description.txt
================================================
SherpaTTS este un motor Android text-în-vorbire bazat pe Kaldi de ultimă generație folosind vocile Piper sau Coqui.
La lansarea aplicației pentru prima dată, acesta va descărca modelul vocii preferate de la Hugging Face.
Reține că aceasta este singura instanță în care este necesară permisiunea de internet.
Odată ce modelul este descărcat, text-în-vorbire funcționează complet offline, asigurându-ți confidențialitatea și comoditatea.
================================================
FILE: fastlane/metadata/android/ro/short_description.txt
================================================
Motorul Text-to-Speech bazat pe Next-gen Kaldi
================================================
FILE: fastlane/metadata/android/ro/title.txt
================================================
SherpaTTS
================================================
FILE: fastlane/metadata/android/ru-RU/full_description.txt
================================================
SherpaTTS — это преобразователь Текста в Речь (Text-to-Speech, TTS) основанный на Next-gen Kaldi, использующий голоса Piper или Coqui.
При первом запуске приложения оно загрузит выбранную вами голосовую модель из Hugging Face.
Обратите внимание, что это единственный раз когда потребуется разрешение на пользование интернетом.
После загрузки модели текстовые речи работают полностью автономно, обеспечивая конфиденциальность и удобство.
================================================
FILE: fastlane/metadata/android/ru-RU/short_description.txt
================================================
Преобразование текста в речь используя Next-gen Kaldi
================================================
FILE: fastlane/metadata/android/ru-RU/title.txt
================================================
SherpaTTS Синтез Речи
================================================
FILE: fastlane/metadata/android/tr-TR/full_description.txt
================================================
SherpaTTS, Piper veya Coqui seslerini kullanan Yeni Nesil Kaldi tabanlı bir Android Metinden Konuşmaya motorudur.
Uygulamayı ilk kez başlattığınızda, Hugging Face'ten tercih ettiğiniz ses modelini indirecektir.
Lütfen bunun internet izninin gerekli olduğu tek durum olduğunu unutmayın.
Model indirildikten sonra, metinden konuşmaya tamamen çevrimdışı çalışır ve gizliliğinizi ve rahatlığınızı garanti eder.
================================================
FILE: fastlane/metadata/android/tr-TR/short_description.txt
================================================
Yeni nesil Kaldi tabanlı Metinden Konuşmaya motoru
================================================
FILE: fastlane/metadata/android/tr-TR/title.txt
================================================
SherpaTTS
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c
zipStoreBase=GRADLE_USER_HOME
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
================================================
FILE: gradlew
================================================
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
================================================
FILE: gradlew.bat
================================================
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
================================================
FILE: language.txt
================================================
def get_piper_models() -> List[TtsModel]:
models = [
# TtsModel(model_dir="vits-piper-es_ES-mls_10246-low"),
# TtsModel(model_dir="vits-piper-es_ES-mls_9972-low"),
# TtsModel(model_dir="vits-piper-pl_PL-mls_6892-low"),
TtsModel(model_dir="vits-piper-ar_JO-kareem-low"),
TtsModel(model_dir="vits-piper-ar_JO-kareem-medium"),
TtsModel(model_dir="vits-piper-ca_ES-upc_ona-medium"),
TtsModel(model_dir="vits-piper-ca_ES-upc_ona-x_low"),
TtsModel(model_dir="vits-piper-ca_ES-upc_pau-x_low"),
TtsModel(model_dir="vits-piper-ca_ES-upc_pau-x_low"),
TtsModel(model_dir="vits-piper-cs_CZ-jirka-medium"),
TtsModel(model_dir="vits-piper-cy_GB-gwryw_gogleddol-medium"),
TtsModel(model_dir="vits-piper-da_DK-talesyntese-medium"),
TtsModel(model_dir="vits-piper-de_DE-eva_k-x_low"),
TtsModel(model_dir="vits-piper-de_DE-karlsson-low"),
TtsModel(model_dir="vits-piper-de_DE-kerstin-low"),
# TtsModel(model_dir="vits-piper-de_DE-mls-medium"),
TtsModel(model_dir="vits-piper-de_DE-pavoque-low"),
TtsModel(model_dir="vits-piper-de_DE-ramona-low"),
TtsModel(model_dir="vits-piper-de_DE-thorsten-high"),
TtsModel(model_dir="vits-piper-de_DE-thorsten-low"),
TtsModel(model_dir="vits-piper-de_DE-thorsten-medium"),
TtsModel(model_dir="vits-piper-de_DE-thorsten_emotional-medium"),
TtsModel(model_dir="vits-piper-el_GR-rapunzelina-low"),
TtsModel(model_dir="vits-piper-en_GB-alan-low"),
TtsModel(model_dir="vits-piper-en_GB-alan-medium"),
TtsModel(model_dir="vits-piper-en_GB-alba-medium"),
TtsModel(model_dir="vits-piper-en_GB-aru-medium"),
TtsModel(model_dir="vits-piper-en_GB-cori-high"),
TtsModel(model_dir="vits-piper-en_GB-cori-medium"),
TtsModel(model_dir="vits-piper-en_GB-jenny_dioco-medium"),
TtsModel(model_dir="vits-piper-en_GB-northern_english_male-medium"),
TtsModel(model_dir="vits-piper-en_GB-semaine-medium"),
TtsModel(model_dir="vits-piper-en_GB-southern_english_female-low"),
TtsModel(model_dir="vits-piper-en_GB-southern_english_female-medium"),
TtsModel(model_dir="vits-piper-en_GB-southern_english_male-medium"),
TtsModel(model_dir="vits-piper-en_GB-sweetbbak-amy"),
TtsModel(model_dir="vits-piper-en_GB-vctk-medium"),
TtsModel(model_dir="vits-piper-en_US-amy-low"),
TtsModel(model_dir="vits-piper-en_US-amy-medium"),
TtsModel(model_dir="vits-piper-en_US-arctic-medium"),
TtsModel(model_dir="vits-piper-en_US-bryce-medium"),
TtsModel(model_dir="vits-piper-en_US-danny-low"),
TtsModel(model_dir="vits-piper-en_US-glados"),
TtsModel(model_dir="vits-piper-en_US-hfc_female-medium"),
TtsModel(model_dir="vits-piper-en_US-hfc_male-medium"),
TtsModel(model_dir="vits-piper-en_US-joe-medium"),
TtsModel(model_dir="vits-piper-en_US-john-medium"),
TtsModel(model_dir="vits-piper-en_US-kathleen-low"),
TtsModel(model_dir="vits-piper-en_US-kristin-medium"),
TtsModel(model_dir="vits-piper-en_US-kusal-medium"),
TtsModel(model_dir="vits-piper-en_US-l2arctic-medium"),
TtsModel(model_dir="vits-piper-en_US-lessac-high"),
TtsModel(model_dir="vits-piper-en_US-lessac-low"),
TtsModel(model_dir="vits-piper-en_US-lessac-medium"),
TtsModel(model_dir="vits-piper-en_US-libritts-high"),
TtsModel(model_dir="vits-piper-en_US-libritts_r-medium"),
TtsModel(model_dir="vits-piper-en_US-ljspeech-high"),
TtsModel(model_dir="vits-piper-en_US-ljspeech-medium"),
TtsModel(model_dir="vits-piper-en_US-norman-medium"),
TtsModel(model_dir="vits-piper-en_US-ryan-high"),
TtsModel(model_dir="vits-piper-en_US-ryan-low"),
TtsModel(model_dir="vits-piper-en_US-ryan-medium"),
TtsModel(model_dir="vits-piper-es-glados-medium"),
TtsModel(model_dir="vits-piper-es_ES-carlfm-x_low"),
TtsModel(model_dir="vits-piper-es_ES-davefx-medium"),
TtsModel(model_dir="vits-piper-es_ES-sharvard-medium"),
TtsModel(model_dir="vits-piper-es_MX-ald-medium"),
TtsModel(model_dir="vits-piper-es_MX-claude-high"),
TtsModel(model_dir="vits-piper-fa_IR-amir-medium"),
TtsModel(model_dir="vits-piper-fa_IR-gyro-medium"),
TtsModel(model_dir="vits-piper-fa_en-rezahedayatfar-ibrahimwalk-medium"),
TtsModel(model_dir="vits-piper-fi_FI-harri-low"),
TtsModel(model_dir="vits-piper-fi_FI-harri-medium"),
# TtsModel(model_dir="vits-piper-fr_FR-mls-medium"),
TtsModel(model_dir="vits-piper-fr_FR-siwis-low"),
TtsModel(model_dir="vits-piper-fr_FR-siwis-medium"),
TtsModel(model_dir="vits-piper-fr_FR-tom-medium"),
TtsModel(model_dir="vits-piper-fr_FR-upmc-medium"),
TtsModel(model_dir="vits-piper-hu_HU-anna-medium"),
TtsModel(model_dir="vits-piper-hu_HU-berta-medium"),
TtsModel(model_dir="vits-piper-hu_HU-imre-medium"),
TtsModel(model_dir="vits-piper-is_IS-bui-medium"),
TtsModel(model_dir="vits-piper-is_IS-salka-medium"),
TtsModel(model_dir="vits-piper-is_IS-steinn-medium"),
TtsModel(model_dir="vits-piper-is_IS-ugla-medium"),
TtsModel(model_dir="vits-piper-it_IT-paola-medium"),
TtsModel(model_dir="vits-piper-it_IT-riccardo-x_low"),
TtsModel(model_dir="vits-piper-ka_GE-natia-medium"),
TtsModel(model_dir="vits-piper-kk_KZ-iseke-x_low"),
TtsModel(model_dir="vits-piper-kk_KZ-issai-high"),
TtsModel(model_dir="vits-piper-kk_KZ-raya-x_low"),
TtsModel(model_dir="vits-piper-lv_LV-aivars-medium"),
TtsModel(model_dir="vits-piper-lb_LU-marylux-medium"),
TtsModel(model_dir="vits-piper-ne_NP-google-medium"),
TtsModel(model_dir="vits-piper-ne_NP-google-x_low"),
TtsModel(model_dir="vits-piper-nl_BE-nathalie-medium"),
TtsModel(model_dir="vits-piper-nl_BE-nathalie-x_low"),
TtsModel(model_dir="vits-piper-nl_BE-rdh-medium"),
TtsModel(model_dir="vits-piper-nl_BE-rdh-x_low"),
# TtsModel(model_dir="vits-piper-nl_NL-mls-medium"),
# TtsModel(model_dir="vits-piper-nl_NL-mls_5809-low"),
# TtsModel(model_dir="vits-piper-nl_NL-mls_7432-low"),
TtsModel(model_dir="vits-piper-no_NO-talesyntese-medium"),
TtsModel(model_dir="vits-piper-pl_PL-darkman-medium"),
TtsModel(model_dir="vits-piper-pl_PL-gosia-medium"),
TtsModel(model_dir="vits-piper-pl_PL-mc_speech-medium"),
TtsModel(model_dir="vits-piper-pt_BR-edresson-low"),
TtsModel(model_dir="vits-piper-pt_BR-faber-medium"),
TtsModel(model_dir="vits-piper-pt_PT-tugao-medium"),
TtsModel(model_dir="vits-piper-ro_RO-mihai-medium"),
TtsModel(model_dir="vits-piper-ru_RU-denis-medium"),
TtsModel(model_dir="vits-piper-ru_RU-dmitri-medium"),
TtsModel(model_dir="vits-piper-ru_RU-irina-medium"),
TtsModel(model_dir="vits-piper-ru_RU-ruslan-medium"),
TtsModel(model_dir="vits-piper-sk_SK-lili-medium"),
TtsModel(model_dir="vits-piper-sl_SI-artur-medium"),
TtsModel(model_dir="vits-piper-sr_RS-serbski_institut-medium"),
TtsModel(model_dir="vits-piper-sv_SE-nst-medium"),
TtsModel(model_dir="vits-piper-sw_CD-lanfrica-medium"),
TtsModel(model_dir="vits-piper-tr_TR-dfki-medium"),
TtsModel(model_dir="vits-piper-tr_TR-fahrettin-medium"),
TtsModel(model_dir="vits-piper-tr_TR-fettah-medium"),
TtsModel(model_dir="vits-piper-uk_UA-lada-x_low"),
TtsModel(model_dir="vits-piper-uk_UA-ukrainian_tts-medium"),
TtsModel(model_dir="vits-piper-vi_VN-25hours_single-low"),
TtsModel(model_dir="vits-piper-vi_VN-vais1000-medium"),
TtsModel(model_dir="vits-piper-vi_VN-vivos-x_low"),
TtsModel(model_dir="vits-piper-zh_CN-huayan-medium"),
def get_coqui_models() -> List[TtsModel]:
# English (coqui-ai/TTS)
models = [
TtsModel(model_dir="vits-coqui-en-ljspeech"),
TtsModel(model_dir="vits-coqui-en-ljspeech-neon"),
TtsModel(model_dir="vits-coqui-en-vctk"),
# TtsModel(model_dir="vits-coqui-en-jenny"),
]
for m in models:
m.data_dir = m.model_dir + "/" + "espeak-ng-data"
m.model_name = "model.onnx"
m.lang = "en"
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
================================================
FILE: settings.gradle.kts
================================================
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven {
setUrl("https://jitpack.io")
}
}
}
rootProject.name = "SherpaOnnxTtsEngine"
include(":app")