Lexiverse
Lexiverse - AI contextual reading engine for English learners. Your next article is your next review.
翻訳待ち
Pacer and RSVP epub reader for language learners (GTK4)
翻訳待ち
Loading the full README. The saved excerpt is shown below.
Pacer and RSVP reader for epub/txt, built for language learners. GTK4 / libadwaita, one Python file.Read the full README ↗Pacer and RSVP reader for epub/txt, built for language learners. GTK4 / libadwaita with a shared web reader for mobile and browsers.
unknown.txtP reads the current sentence aloud (piper TTS, offline, voice downloaded on first use); the popup has a pronounce buttonA read-along: piper reads sentence by sentence and the highlight follows the voice. WPM sets the speech speed~/.config/speedready/vocab.tsv with its sentence, importable into Anki as-isB toggles one, Shift+B opens the list)L): every book you have opened, newest first, with how far through it you are. Add several at once from the file picker, or drag epub and txt files straight onto the window. Titles come from the epub's own metadata, so the list reads like a shelf and not like a download folder./install.sh # venv with simplemma + piper-tts, launcher + icon
./run.sh book.epub # or open "Speedready" from your app launcher
| key | action |
|---|---|
| space | play / pause |
| ← → | ±10 words |
| PageUp / PageDown | ±one page |
| ↑ ↓ | speed ±5 (shift: ±25) |
| [ ] | words per step |
| M | pacer / rsvp |
| R | replay sentence |
| D | define current word |
| click / double-click / right-click | continue from there / dictionary popup / mark unknown |
| P | speak from here to the end of the sentence, again to stop |
| A | read-along |
| B / Shift+B | toggle bookmark / open bookmarks |
| C | chapters |
| L | library |
| F11, S, O | fullscreen, settings, open |
Beginner mode glosses each word from an offline pack, gloss-<src>-<tgt>.sqlite, which the app
downloads once per language pair on first use. The packs are built from English Wiktionary and each
language's own Wiktionary edition (kaikki.org) and hermitdave/FrequencyWords.
See DATA-LICENSES.md for upstream licence and attribution details.
python tools/fetch_sources.py # ~2 GB of extracts -> ~/.cache/speedready/build
python tools/release_packs.py --jobs 6 # build every pair, measure, keep the good ones
python tools/release_packs.py --upload # gh release upload to the "packs" release
A pack is only published if it glosses at least half of the 2000 commonest words in its source
language (--min-coverage). Pairs below the floor are dropped rather than shipped, because a pack
that exists but glosses nothing would have the app report the dictionary ready over a page of blank
glosses. An unpublished pair is reported as such in the app.
MUSE-free pack build, 2026-09-25: all 90 language pairs passed the 50% threshold. Median coverage
was 92.1%; best was sv->en at 96.7%, worst ru->nl at 54.8%. Total size was 4.66 GB. These
figures come from tools/release_packs.py measured against each pair's top 2,000 source words.
Content words are reliable across every pair. The commonest grammar words often are not: Wiktionary
picks the wrong homograph for them (sv->de gives är as "Gut, Ware", nl->pt gives is as
"seu"). core/ fixes these for every pair: each source language's ~300 commonest words are checked
once in English and pivoted through English into every target (coreglosses.py), so de->es wollen
is "querer", sv->de är is "ist; sind" and nl->pt is is "é". GLOSS_OVERRIDES in speedready.py
keeps the hand-curated de->pt glosses, which are more idiomatic than the pivot.
In German books every noun is colored by gender: blue for der, red for die, green for das (Settings → Deutsch).
gender.py holds the logic, with no GTK code so a browser extension can port it line for line. It takes the
gender from the article in front (die stille See is the sea, der See the lake), splits unknown compounds
(Hahnenfeder → Feder), colors plurals by their singular, and leaves pronouns, names, plural-only nouns and
ambiguous sentence-initial words alone. web/gender.js is the same logic for the web reader, and web/textclean.js is the book cleanup; tests/test_web_parity.py
fails if the Python and JavaScript versions ever disagree (PYTHONPATH=. python tests/test_web_parity.py *.epub checks real books). The data, web/genders-de.json.gz (0.6 MB, noun form → genders), comes from
the kaikki.org English Wiktionary extract:
python tools/build_genders.py ~/.cache/speedready/build/en-German.jsonl.gz
python gender.py # self-check
This is the beginning of the README. Read the rest at the original. Read the full README ↗