An offline Android reader that extracts text from PDF and EPUB documents and narrates it entirely on the device. Narrator uses the Supertonic 3 speech model through sherpa-onnx and falls back to on-device Google ML Kit OCR when a PDF page does not contain usable embedded text.
The app does not request Internet access. Selected documents, extracted or recognized text, saved reading positions, and generated audio remain on the device.
- Opens PDF and EPUB files through Android's system document picker; no broad storage permission is required.
- Extracts embedded PDF text and automatically applies OCR to scanned or image-only pages.
- Reads EPUB content in spine order and uses the book metadata title when available.
- Generates Turkish or English speech locally with the installed Supertonic 3 INT8 model.
- Provides play, pause, previous, next, and restart controls in the app, plus playback controls in a media notification.
- Starts narration from a tapped paragraph and follows the active paragraph while reading.
- Saves the last reading position for each document and lets users remove saved positions from Settings.
- Offers a speech-quality control from 1 to 20 generation steps (the default is 6).
- Includes Turkish and English interface resources and exposes privacy and license documents inside the app.
| Item | Support |
|---|---|
| Android | Android 7.0 (API 24) or newer |
| Documents | PDF and EPUB |
| Narration languages | Turkish and English |
| OCR | On-device Latin-script text recognition for PDF fallback |
Large documents and OCR-heavy PDFs can take longer to prepare. Speech generation speed and memory use also depend on the device; lowering the quality step count improves generation speed at the cost of naturalness.
- Android Studio with Android SDK 37 installed
The repository configures its Gradle daemon toolchain automatically and includes the Gradle wrapper.
The sherpa-onnx Android archive and Supertonic 3 model are intentionally not stored in this repository. Download both before building the application:
| Dependency | Download | Destination in the repository |
|---|---|---|
| sherpa-onnx 1.13.8 Android library | sherpa-onnx-1.13.8.aar |
Save the file as app/libs/sherpa-onnx-1.13.8.aar. |
| Supertonic 3 INT8 model | sherpa-onnx-supertonic-3-tts-int8-2026-05-11.tar.bz2 |
Extract the archive, then copy the model files from its top-level sherpa-onnx-supertonic-3-tts-int8-2026-05-11 directory into app/src/main/assets/tts/supertonic3/. Do not copy the archive's LICENSE file. |
| Supertonic 3 model license | Official Open RAIL-M license | Save the file as app/src/main/assets/tts/supertonic3/LICENSE. |
The model archive is the INT8 conversion distributed by sherpa-onnx and is derived from Supertonic 3 by Supertone. This project does not further modify those converted files. See the official sherpa-onnx Supertonic documentation for the package source, supported languages, and usage examples. Additional information about the Android library is available in the sherpa-onnx AAR documentation.
The sherpa-onnx model archive contains the MIT license used by Supertonic's sample-code repository,
but the model weights are licensed separately under the BigScience Open RAIL-M License. Keep the
official model license downloaded from the Supertonic 3 model repository at the path shown above;
do not replace it with the archive's MIT LICENSE file.
The installation is complete when the following required files exist:
app/libs/sherpa-onnx-1.13.8.aar
app/src/main/assets/tts/supertonic3/duration_predictor.int8.onnx
app/src/main/assets/tts/supertonic3/text_encoder.int8.onnx
app/src/main/assets/tts/supertonic3/vector_estimator.int8.onnx
app/src/main/assets/tts/supertonic3/vocoder.int8.onnx
app/src/main/assets/tts/supertonic3/tts.json
app/src/main/assets/tts/supertonic3/unicode_indexer.bin
app/src/main/assets/tts/supertonic3/voice.bin
app/src/main/assets/tts/supertonic3/LICENSE
These paths are ignored by Git and must be installed separately in every clone. Gradle packages the locally installed model into the APK, so the built application remains fully offline at runtime.
You can run the app after installing the text-to-speech dependencies.
LocalDocumentRepositoryreceives a URI from Android's document picker and dispatches it to the PDF or EPUB reader.- PDFBox extracts PDF text. Pages without meaningful text are rendered and passed to ML Kit OCR. EPUB files are parsed from their package manifest and spine.
- Extracted paragraphs are split into locale-aware speech chunks.
- sherpa-onnx runs the locally installed Supertonic 3 model on CPU. The next chunk is prefetched
while the current chunk is played through
AudioTrack. - A foreground media service keeps playback controls available, while local preferences retain narration settings and per-document reading positions.
The code is organized as a single Android application module with feature-oriented presentation,
domain, and data layers under
app/src/main/java/com/mutkuensert/narrator/feature/reader/.
- Kotlin, coroutines, and
StateFlow - Jetpack Compose and Material 3
- Dagger Hilt
- PDFBox-Android
- Google ML Kit Text Recognition
- sherpa-onnx and ONNX Runtime
- Supertonic 3 INT8 model assets
Dependency versions are centralized in gradle/libs.versions.toml.
The app intentionally removes INTERNET and ACCESS_NETWORK_STATE from its merged manifest. It has
no account system, advertising SDK, analytics, or developer backend. Android backup is disabled for
app-managed local data.
See the bilingual Privacy Policy for details, including ML Kit's own technical data disclosures. The same policy is bundled in the app under Settings > Legal information > Privacy. Before publishing to Google Play, host that policy at a stable public URL and add the URL in Play Console.
The source code written for this repository is licensed under the Apache License 2.0. Third-party software and model assets retain their own licenses and terms:
- The locally installed Supertonic 3 files under
app/src/main/assets/tts/supertonic3/are governed by the BigScience Open RAIL-M License, which contains use-based restrictions and redistribution conditions. They are not Apache-2.0- or MIT-licensed. Review the upstream Supertonic 3 model page and its official model license before using or redistributing the model. - sherpa-onnx and most Android/JVM components are distributed under Apache-2.0.
- ONNX Runtime is distributed under the MIT License.
- PDFBox-Android is distributed under Apache-2.0.
- Bouncy Castle components use the Bouncy Castle License.
- Google ML Kit is subject to the Google APIs and ML Kit terms.
The complete notices shipped with the application are in
THIRD_PARTY_NOTICES.txt and are available from
Settings > Legal information > Notices. Anyone redistributing the application must preserve the
applicable notices and comply with the Supertonic 3 model license in particular.
