File size: 15,867 Bytes
8710b1a
 
 
 
 
 
 
 
acd78f0
 
 
8710b1a
 
 
acd78f0
 
8710b1a
 
 
 
 
acd78f0
8710b1a
 
 
 
acd78f0
8710b1a
3027686
e3832bb
8710b1a
 
 
f333db3
 
 
 
 
acd78f0
00a3e53
 
acd78f0
8710b1a
 
 
f333db3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8710b1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f333db3
 
8710b1a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
acd78f0
 
 
 
 
 
 
 
 
 
 
 
 
 
f333db3
 
 
acd78f0
f333db3
acd78f0
 
 
 
 
 
f333db3
acd78f0
 
 
 
 
 
 
 
f333db3
 
 
acd78f0
 
 
 
 
 
 
00a3e53
 
 
 
 
 
 
 
 
 
 
 
f333db3
 
 
00a3e53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8710b1a
 
f333db3
acd78f0
f333db3
 
 
 
8710b1a
 
 
 
 
 
acd78f0
 
 
 
8710b1a
 
 
 
 
 
 
 
acd78f0
 
 
8710b1a
 
 
 
 
 
 
 
 
e3832bb
8710b1a
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
---
language:
- lt
license: other
license_name: newgenltu-openrail-d
license_link: https://huggingface.co/RobertasTa/android-lt/blob/main/LICENSE-VOICE
library_name: sherpa-onnx
pipeline_tag: text-to-speech
base_model:
- RobertasTa/lt_LT-ingute-medium
- kristijonas/kmynas-parakeet-lt-v4
tags:
- text-to-speech
- tts
- automatic-speech-recognition
- speech-recognition
- lithuanian
- android
- sherpa-onnx
- piper
- espeak-ng
- parakeet
- offline
- accessibility
---

# Android LT: a Lithuanian voice and ears for Android phones

![A robotic hand holds a gift box labelled "android-lt" under a glowing globe; next to it: "Android LT, Ingutė speaks, your phone listens" (illustration created with AI)](docs/banner.png)

Ingutė, a Lithuanian synthetic voice, on your Android phone, offline. The phone uses it wherever
it can read aloud: the text-to-speech settings, the screen reader, book and article readers.

There are **ears** too: speak Lithuanian to the phone and the text appears in any text field:
SMS, notes, the ChatGPT, Claude or Gemini app. Also offline (see [Ears](#ears-lithuanian-dictation-parakeetype)).

**Since 1.2.0 there are two ready-made apps:** download, install, done. No F-Droid, no cable, no
computer → [Installing](#installing-about-5-minutes)

**Installed it but not sure what next?** → [Everyday use](#everyday-use)

*Page: https://robertasta.github.io/android-lt/en/ · Lietuviškai ir kodas: [github.com/RobertasTa/android-lt](https://github.com/RobertasTa/android-lt)*

## What is here

- **`Ingute-1.0.apk`** (151 MB): the app "Ingutė", a Lithuanian voice for the phone. The voice, the
  "s" fix and the stress dictionary are already inside; once installed it becomes the phone's voice
  by itself. It is [SherpaTTS](https://github.com/woheller69/ttsEngine) 3.4 (woheller69) with our
  Lithuanian additions ([source](https://github.com/RobertasTa/ttsEngine/tree/ingute)).
- **`Parakeetype-LT-0.5.0-lt2.apk`** (59 MB): the voice keyboard "Parakeetype LT" for Lithuanian
  dictation. It is [Parakeetype](https://github.com/theScrabi/Parakeetype) (theScrabi) with the
  Lithuanian model first and as the default ([source](https://github.com/RobertasTa/Parakeetype/tree/lt-build)).
  It has no internet permission.
- **Ears** (`parakeet-lt-kmynas-int8.zip`, 955 MB): the Lithuanian speech recognition model for that
  keyboard; the app shows where to download it.
- For advanced users, separately: **Ingutė** in sherpa-onnx format (`lt_LT-ingute-medium.onnx`,
  63 MB), a **`tokens.txt`** with an "s" fix (eSpeak NG writes Lithuanian /s/ as `ʂ` in many
  positions, a symbol the voice hardly learned, so "pasiimk skėtį" comes out as "paimk kėtį"), and
  **`lt_dict`**, the eSpeak NG dictionary with the stressed syllable for 189,000 word forms (without
  it the stress is wrong in about half of the multi-syllable words).

Both apps are signed with our key, certificate SHA-256
`8679aa5fbfd9f9f96d53ba761e72c9b0f7a361ffdc8493e33bb905e077afaf7f`; file hashes are in `SHA256SUMS.txt`
in the release.

## Installing (about 5 minutes)

Android 10 or newer (Android 12 for the ears). Both files are in the
[release](https://github.com/RobertasTa/android-lt/releases/latest).

### Voice: "Ingutė"

1. **Download** `Ingute-1.0.apk` to the phone and tap it (in the browser or a file manager, in the
   Download folder). The phone asks whether to allow installing apps from this source: **allow** it.
2. **Install.** No need to open the app: Ingutė installs herself.
3. **Phone settings** → "Text-to-speech output" → engine **Ingutė**, language **Lithuanian** →
   "Listen to an example". Ingutė speaks, with the stress already right.

### Ears: "Parakeetype LT"

1. **Download and install** `Parakeetype-LT-0.5.0-lt2.apk`. If Google Play Protect offers to scan
   the app, tap **Scan**, then **Install** (for us it answered that the app looks safe).
2. **Open** it, allow the microphone, and next to "Model not installed" tap **Install**.
3. On the **"Parakeet Lithuanian (Default)"** card: **Download in browser** (955 MB, Wi-Fi is better).
   When it has downloaded: **Import model file** → `parakeet-lt-kmynas-int8.zip`. A minute later the
   card says **Active model**; you can delete the archive.
4. On the start screen, next to "Keyboard not enabled" → **Open settings** → turn Parakeetype on.
   Android warns that the keyboard "may collect everything you type": it says this for every
   keyboard, and this one has no internet permission, so the text never leaves the phone → **OK**.
5. **Dictate**: in any text field long-press 🌐 in Gboard → **Parakeetype Voice Input**, hold the big
   microphone button and speak.

| | | | |
|---|---|---|---|
| ![Settings: engine Ingutė, language Lithuanian](docs/apk_ingute_nustatymai.jpg) | ![Parakeet Lithuanian first and default](docs/apk_modelis.jpg) | ![After the import: Active model](docs/apk_aktyvus.jpg) | ![Dictated: "Labas, tai yra lietuviškos ausys Android telefonui"](docs/apk_padiktuota.jpg) |

The app screenshots are in Lithuanian, the system dialogs in Russian (the phone's language).

<details>
<summary><b>Advanced: the voice through SherpaTTS from F-Droid</b> (without our app, about 10 minutes)</summary>

1. **Install SherpaTTS from F-Droid.** It is not on Google Play; searching there shows other,
   ad-supported apps.
   File: https://f-droid.org/repo/org.woheller69.ttsengine_34.apk (version 3.4, 91 MB).
   The right app is called **SherpaTTS**, package `org.woheller69.ttsengine`, no ads.
2. **Download to the phone** from the
   [release](https://huggingface.co/RobertasTa/android-lt/tree/main):
   `lt_LT-ingute-medium.onnx` and `tokens.txt`.
3. **SherpaTTS** → "INSTALL PIPER MODEL FROM SD": language code `lit`, name `Ingute`,
   model `lt_LT-ingute-medium.onnx`, tokens `tokens.txt` → OK.
4. **Phone settings** → "Text-to-speech output" → engine **SherpaTTS**, language
   **Lithuanian** → "Listen to an example".

Ingutė speaks now. Stress is still placed by eSpeak NG; step 5 fixes that.

### 5. Stress (needs a computer)

Recent Android versions (tested on 15) do not let file managers write into another app's
folder, so `lt_dict` goes in through `adb` from a computer
([Google platform-tools](https://developer.android.com/tools/releases/platform-tools)).

1. On the phone: Settings → About phone → tap the build number 7 times (developer mode; the
   phone asks for its unlock code) → in developer options turn on **USB debugging** → connect
   the cable and allow it on the phone.
2. On the computer, in the folder with the downloaded `lt_dict`:

```
adb shell md5sum /sdcard/Android/data/org.woheller69.ttsengine/files/espeak-ng-data/lt_dict
```

It must print `5426503daf0a29836d0f168d38b38581` (the dictionary of SherpaTTS 3.4). **If it is
different, stop**: your SherpaTTS version differs and this `lt_dict` was built for 3.4.

```
adb shell cp /sdcard/Android/data/org.woheller69.ttsengine/files/espeak-ng-data/lt_dict /sdcard/Android/data/org.woheller69.ttsengine/files/espeak-ng-data/lt_dict_orig
adb push lt_dict /sdcard/Android/data/org.woheller69.ttsengine/files/espeak-ng-data/lt_dict
adb shell am force-stop org.woheller69.ttsengine
```

Open SherpaTTS and listen to "Dabar labai gera diena, nes Lietuvos rinktinė laimėjo."
You can switch USB debugging off afterwards. To undo, rename `lt_dict_orig` back to `lt_dict`.
Reinstalling SherpaTTS or clearing its data undoes step 5.

</details>

## Measurements

A Lithuanian speech recognition model listened to 12 everyday sentences (no numbers):

| | word errors |
|---|---|
| Ingutė in SherpaTTS, no fixes | 7.7 % |
| + "s" fix (`tokens.txt`) | 4.4 % |
| + stress (`lt_dict`) | 1.1 % |

Stressed syllable compared with the stress dictionary on LIEPA texts (19,943 multi-syllable
words): eSpeak NG alone 53.4 %, with this dictionary 99.3 %. Tested on a Xiaomi 12T Pro,
Android 15, SherpaTTS 3.4.

## Limits

- Numbers and abbreviations are read by eSpeak NG itself ("15:25 val." may sound odd).
- Only the stressed syllable is set, not the Lithuanian pitch accent.
- About 9 % of words are not in the dictionary; eSpeak NG guesses those.
- `lt_dict` was built for SherpaTTS 3.4 (sherpa-onnx 1.13); check the md5 first on other versions.
- It is a synthetic voice: natural, but not a person.

## Ears: Lithuanian dictation (Parakeetype)

[Parakeetype](https://github.com/theScrabi/Parakeetype) is an open-source voice keyboard for
Android (F-Droid). It recognises speech on the phone and never goes online. Its default model
hears Lithuanian poorly; `parakeet-lt-kmynas-int8.zip` gives it Lithuanian ears.

| word error rate | FLEURS (986 utterances) | short commands (127) |
|---|---|---|
| Parakeetype's default model (Parakeet Ultra) | 27.1 % | 80.4 % |
| with these ears | 10.6 % | 17.0 % |

Measured on a PC with a script that follows Parakeetype's recognition path exactly; tested live on
Robertas's phone (Xiaomi 12T Pro, Android 15).

**Installing**: see ["Ears: Parakeetype LT"](#ears-parakeetype-lt) above, our ready-made app. Once
Parakeetype's author merges our proposal [theScrabi/Parakeetype#1](https://github.com/theScrabi/Parakeetype/pull/1),
the F-Droid Parakeetype will offer the Lithuanian model too.

### Build it yourself

You need a computer with Java 17 or newer and the Android SDK: [Android Studio](https://developer.android.com/studio)
or Google's command-line tools (`android sdk install "platforms;android-37.0" "build-tools;37.0.0"`).
The first build downloads about 1 GB.

```
git clone -b lt-build https://github.com/RobertasTa/Parakeetype.git
cd Parakeetype
./gradlew assembleDebug
```

On Windows: `gradlew assembleDebug`. Point to the Android SDK with `sdk.dir=...` in
`local.properties` or the `ANDROID_HOME` variable. Copy the resulting
`app/build/outputs/apk/debug/app-debug.apk` to the phone's Download folder and tap it in a file
manager (Xiaomi phones refuse `adb install` without a Mi account). If you already have
"Parakeetype LT" from our release, uninstall it first: apps signed with different keys cannot
update each other. The voice app's source is branch [`ingute`](https://github.com/RobertasTa/ttsEngine/tree/ingute);
it builds the same way.

### Limits of the ears

- Lithuanian only. For other languages pick the default model (one model is active at a time).
- About 910 MB on the phone; Parakeetype needs Android 12 or newer.
- On short commands it gets roughly one word in six wrong.

## Everyday use

Installing does not yet make the phone speak or listen. Here is what to set up once and how to use
it afterwards. Menu names differ a little between phones, so the easiest way to find them is the
**search box in the phone's settings**. The screenshots are from a Xiaomi phone set to Russian.

### Make the phone read with Ingutė's voice

**1. Make Ingutė the phone's voice** (once)

Search the settings for "text-to-speech".

- **Preferred engine** → **Ingutė** (or **SherpaTTS** if you took the advanced route). Android warns
  that the engine "may collect text"; it shows this for every voice that is not Google's. Ingutė
  processes the text on the phone → **OK**.
- **Language** → **Lithuanian**. If it stays at "system language" on a phone that is not in
  Lithuanian, the buttons are grey and nothing speaks.
- **Play** (listen to an example): Ingutė should speak. The speed slider is right there.

**2. Have any text on the screen read aloud: SMS, email, articles** (once)

Search the settings for "Select to Speak". It is a Google feature present on most phones with
Google Play.

- Turn the switch on. Android asks for permission to see the screen; without it the feature could
  not read the text → **Allow**.
- A small blue button appears at the edge of the screen. If you are asked how to set it up, leave
  it as it is and tap **OK**.

**Every day:** open the text → tap the blue button → **tap a paragraph** and Ingutė reads it (or ▶
to read the whole screen, ■ to stop). You can drag the button elsewhere if it is in the way.

| | | |
|---|---|---|
| ![Text-to-speech settings: engine SherpaTTS, language Lithuanian](docs/tts_settings.jpg) | ![Select to Speak with its on/off switch](docs/select_to_speak.jpg) | ![After switching it on, a blue button appears on the right edge](docs/select_to_speak_button.jpg) |

### Make the phone type what you say (ears)

Once Parakeetype with the Lithuanian model is installed (see "Ears" above):

1. Open the place where you type: SMS, notes, search.
2. **Switch the keyboard to Parakeetype.** In Gboard, long-press the 🌐 globe → "Parakeetype Voice
   Input". On other keyboards look for a small keyboard icon at the bottom of the screen.
3. **Hold the big microphone button and speak.** When you let go, the text appears; the app adds
   full stops, commas and capital letters itself.
4. **Back to your usual keyboard**: the small keyboard icon on the right, above the Enter key.

### Stuck? Just ask

Lost, or the phone shows something different from this page? Open any AI chat (ChatGPT, Claude,
Gemini) and paste:

`Read https://raw.githubusercontent.com/RobertasTa/android-lt/main/AI_CONSULTANT_BRIEF.md and help me with Android LT.`

Then say what does not work and attach a screenshot. That AI knows all these steps and the usual
mistakes, and it will answer in your language.

## Licences

The header above names the voice licence; the apps are GPL-3.0 and the ears archive is CC BY 4.0 (below).

- **Apps**: GPL-3.0, like their originals. "Ingutė" is SherpaTTS (woheller69) with our changes
  ([source](https://github.com/RobertasTa/ttsEngine/tree/ingute)); "Parakeetype LT" is Parakeetype
  (theScrabi) with our changes ([source](https://github.com/RobertasTa/Parakeetype/tree/lt-build)).
  The voice and dictionary inside "Ingutė" are under the licences below.
- **Voice** (`lt_LT-ingute-medium.onnx`, `tokens.txt`): NewGenLTU Open RAIL-D 1.0. Free of
  charge, commercial use is not prohibited, use restrictions apply; when passing it on, include
  [LICENSE-VOICE](LICENSE-VOICE) and state the origin. Ingutė was grown from the Reginutė model
  with the authors' own Python tools.
- **`lt_dict`** and its sources (`espeak-ng-lt/`): GPL-3.0 (eSpeak NG data). The stress
  positions come from two CC BY 4.0 works; see [THIRD_PARTY.md](THIRD_PARTY.md).
- **Ears** (`parakeet-lt-kmynas-int8.zip`): CC BY 4.0. NVIDIA Parakeet TDT 0.6B v3, fine-tuned for
  Lithuanian by Kristijonas Jakubsonas ("kmynas v4", LIEPA-3). Our changes are listed in the
  archive's `NOTICE.txt`. The Silero VAD inside the archive is MIT. Parakeetype is a separate
  app (GPL-3.0).
- Texts in this repository: GPL-3.0 ([LICENSE](https://github.com/RobertasTa/android-lt/blob/main/LICENSE)).

## Thanks

[SherpaTTS](https://github.com/woheller69/ttsengine) (woheller69),
[sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) (k2-fsa),
[eSpeak NG](https://github.com/espeak-ng/espeak-ng), [Piper](https://github.com/OHF-Voice/piper1-gpl)
and Michael Hansen; the creators of the **LIEPA** corpus (Vilnius University) and
**Arūnas Smaliukas** for `g2p-lt-lexicon`; [Parakeetype](https://github.com/theScrabi/Parakeetype)
(theScrabi), **Kristijonas Jakubsonas** for the Lithuanian Parakeet ("kmynas") and NVIDIA for
Parakeet.

## Stuck?

Paste into any AI chat: `Read https://raw.githubusercontent.com/RobertasTa/android-lt/main/AI_CONSULTANT_BRIEF.md and help me with Android LT.`
Questions and feedback: [Issues](https://github.com/RobertasTa/android-lt/issues).

---

Made with AI: Claude (Anthropic) prepared and measured the package together with Robertas;
tested on Robertas's phone; the banner was made with AI. Our other gifts: [Skaityklė](https://github.com/RobertasTa/skaitykle)
(text to MP3), [Diktuoklė](https://github.com/RobertasTa/diktuokle) (voice dictation),
[all of them](https://github.com/RobertasTa).