Suflyor (Суфлёр): free voice-following teleprompter app for Android. Scrolls as you speak, floats over Instagram, TikTok and the camera. Speech recognized on the phone in 13 languages, no internet permission. Телесуфлёр по голосу для Android.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Suflyor (Russian суфлёр, "prompter") is a free, open-source teleprompter app for Android that follows your voice. It floats over Instagram, TikTok or the camera app and scrolls the script as you speak, so you never chase the text: a voice-activated teleprompter for Reels, Shorts and TikToks. It works fully offline, and the app has no internet permission at all.
It is made for creators who hold the phone, read a couple of lines to the lens, look back at the text and carry on. If you stumble and start a sentence again, the text goes back with you. If you skip a paragraph, it catches up.
[!NOTE] Follows your voice in 13 languages. English, Russian and Turkish are built in; Portuguese, Spanish, German, French, Italian, Dutch, Swedish, Hebrew, Korean and Chinese are speech packs you download once. Suflyor picks the language from your script's text, or you set it in Settings. The interface is in English, Russian, Turkish and Brazilian Portuguese and follows your phone's language.
| Library | Script | Editor | Voice following |
|---|---|---|---|
| All your scripts, imported from almost any format | Preview, reading time and one tap to start over the camera | Plain text with **emphasis**, # headings and [notes] | Ten speech languages, picked from the script or set by hand |
Follows your voice
[Stage directions in brackets] stay visible but are never expected to be spoken.Floats over any camera app
Remotes and scrolling
Your scripts are yours
Imports almost anything
flowchart LR
Mic["Microphone"] --> ASR["sherpa-onnx<br/>streaming recognizer<br/>(on the phone)"]
ASR -->|"last recognized words"| Tracker["Script tracker<br/>fuzzy local alignment<br/>over the whole script"]
Tracker -->|"position"| View["Prompter window<br/>over the camera app"]
Script["Your script"] --> Tracker
The tracker aligns the last few recognized words against the entire script. It keeps only matches that end on one of the last two words you said (the newest counts more), and it weighs every word by how rare it is in your script. Small steps forward need a single good match. Going back to a nearby line needs about two words from its start. A far jump needs at least three words and a clear lead over every other place in the script; unless four or more rare words match, it also waits for the next update to agree.
Everything stays on your phone. The app does not have the INTERNET permission, so Android won't let it connect anywhere, and you can check this yourself.
The details are in PRIVACY.md.
Requirements: Android 10 or newer on a 64-bit ARM phone (almost every phone since 2017), about 135 MB of space: the speech models are inside the app. Tested on a Samsung Galaxy S24 FE with One UI 6.1.1 (Android 14), see tested phones.
Suflyor-<version>.apk from Releases and open it. Allow your browser or file manager to install apps when asked.
Suflyor-<version>-lite.apk (about 30 MB) has no speech models inside; you then download the pack of your language once, Russian, English and Turkish too (see Speech packs). It is published as a separate pre-release "Suflyor lite" next to each version, so Obtainium keeps installing the full APK. Both install over each other and keep your scripts.Language: the app follows your phone's language; on Android 13 and newer you can pick English, Russian, Turkish or Brazilian Portuguese just for Suflyor in Settings → About → App language. The speech language is separate: Auto picks it for each script from its letters; pick it for one script with the Speech button on the script screen, or change the default in Settings → Voice following.
Updates: new versions install over the old one. With Obtainium you get them automatically from this repository.
Google is rolling out developer verification. In 2026 it doesn't affect installs from GitHub or Obtainium. From 2027, phones with Google services install apps from developers who are not yet verified only after a one-time setting (the "advanced flow"):
Also works: installing from a computer with adb install Suflyor-<version>.apk, with no waiting. Phones without Google services (LineageOS without GApps, Huawei) are not affected.
In some countries (India, Brazil, Vietnam, Thailand, Singapore, the Philippines, Kenya, Nigeria, South Africa and others) Google Play Protect has enhanced fraud protection. It blocks any app that uses an accessibility service when you install it from a browser, a messenger or a file manager. The message says "This app can request access to sensitive data", then the installer shows "App not installed". The APK is fine: Suflyor needs the accessibility service so that Android keeps its microphone on while the camera records, and the check looks only at that.
Any of these works:
adb install Suflyor-<version>.apk.After the install, turn on the accessibility service as in step 3 above.
Russian, English and Turkish models are inside the full app (in the lite version they are packs too: Russian 23 MB, English 60 MB, Turkish 6 MB). Portuguese, Spanish, German, French, Italian, Dutch, Swedish, Hebrew, Korean and Chinese are separate downloads of 27 to 123 MB each, so the app stays small for everyone else.
suflyor-speech-<language>-1.zip from this repository's speech-packs releases.Suflyor itself still has no internet permission: the browser downloads the file, and the app only reads what you give it. A pack is installed only if its SHA-256 matches the list inside the signed APK, so a changed or broken file is refused. You can delete the zip after the install.
Would you rather have one-tap downloads and updates inside the app, at the cost of an internet permission? Vote in the poll.
Most packs are Kroko community models (CC BY-SA); Korean and Chinese are k2-fsa Zipformer models (Apache-2.0). Kroko recognizes speech in steps of 1.28 s, so with those packs the text follows about a second later than with the built-in languages; Korean and Chinese step every 0.32 s. Measured on audiobook clips from Multilingual LibriSpeech (Swedish: FLEURS): about 5% wrong words in Spanish, 8% in Portuguese and German, 10% in French, 11% in Swedish, 13% in Dutch, 19% in Italian and 32% in Hebrew (FLEURS, read Wikipedia sentences full of names). Chinese and Korean recognizers print no spaces, so Suflyor follows them character by character and matches characters that sound alike: 18% wrong characters in Chinese, 26% wrong syllables in Korean. On a Galaxy S24 FE a pack loads in about 2 s, and the tracker followed every test text to the end.
Release APKs are built by GitHub Actions from the tagged source. Each release carries a SHA256SUMS.txt file and a signed build-provenance attestation. All releases are signed with the same key; the SHA-256 fingerprint of its certificate is:
77:F3:94:32:F5:05:FB:B7:8B:85:E7:37:CD:00:21:0A:44:C0:7A:13:2C:AC:FF:81:FE:9D:9D:79:CD:E9:A9:06
# The certificate must match the SHA-256 above:
apksigner verify --print-certs Suflyor-*.apk
# Proves the APK was built by this repository's workflow:
gh attestation verify Suflyor-*.apk --owner olerast67
AppVerifier can check the certificate on the phone.
You need JDK 17 and the Android SDK (platform 36).
git clone https://github.com/olerast67/voice-teleprompter-android.git
cd suflyor
./gradlew assembleDebug testDebugUnitTest
fetchSpeechAssets task downloads them from pinned revisions and checks every file against a pinned SHA-256../gradlew assembleRelease) are signed only when a key is configured, through keystore.properties or the SUFLYOR_* environment variables. Without a key they come out unsigned. See RELEASING.md..\build.ps1 and .\install.ps1 read sdk.dir and jdk.dir from local.properties.| Path | What's there |
|---|---|
app/src/main/java/.../ui | Jetpack Compose screens: library, script, rehearsal, editor, settings, journal |
.../overlay | Floating window, accessibility service, prompter view, Quick Settings tile |
.../track/ScriptTracker.kt | Voice-following: word alignment against the script |
.../speech | Microphone capture and sherpa-onnx recognizer |
.../session | Session engine and foreground service |
.../doc | Importers: TXT, Markdown, DOCX, ODT, RTF, HTML, PDF |
.../script | Word normalization and phrase layout |
app/src/test | Unit tests for the tracker (with a random stress test) and importers |
Whether the voice keeps being heard while a camera app records depends on the phone's firmware. What has been checked so far:
| Phone | Android | Samsung Camera | TikTok | |
|---|---|---|---|---|
| Samsung Galaxy S24 FE, One UI 6.1.1 | 14 | works | works | not checked |
Tried it on another phone? Open an issue with the model, the Android version, which apps you recorded in and whether the text followed you. "Everything works" is a useful report too.
More speech packs: Bengali has a streaming model and needs its own word rules. Japanese can be followed by characters like Chinese but has no small streaming model; Polish and Vietnamese wait for one too.
One large pack for many languages: NVIDIA's Nemotron streaming model covers 35 languages (Japanese, Hindi, Ukrainian, Polish, Vietnamese and others). It keeps up with speech on a Galaxy S24 FE, but it is 680 MB and needs six times the computing of the current packs, so it waits for a test on a mid-range phone. The measurements are in docs/speech-models.md.
Ideas are welcome in Issues. Should the app get internet access for one-tap downloads and updates? Vote in the poll.
Found a bug? Open an issue or use the form on olerast.com: Report a bug. The form is in Russian and needs no GitHub account.
Yes: Suflyor listens through the microphone and scrolls to the words you are saying. It is free and open source, and the speech recognition runs on the phone.
Yes. Suflyor floats over any app, and its text starts right under the front camera. Android normally takes the microphone away from other apps while a camera app records; Suflyor's accessibility service is what lets it keep listening (the reel still gets its sound).
It works fully offline. The app has no internet permission, so it can't send anything anywhere; audio is never recorded or stored. See PRIVACY.md.
English, Russian and Turkish speech are built in. Portuguese, Spanish, German, French, Italian, Dutch, Swedish, Hebrew, Korean and Chinese come as speech packs you download once in Settings → Voice following. The language is picked automatically from the script or set in Settings. The interface is in English, Russian, Turkish and Brazilian Portuguese.
Yes: volume keys, Bluetooth selfie remotes, rings, presentation clickers and keyboards can pause, go back or forward a line. Keys can be reassigned. Timed scrolling with a 3-2-1 countdown is there too.
Free, with no ads, no accounts and no paid features. The code is GPL-3.0. If it helps you, you can support it.
Android 10 or newer on a 64-bit ARM phone (almost every phone since 2017). There is no iOS version: iOS doesn't let an app float a window over other apps the way Suflyor needs.
Suflyor is free and always will be: no ads, no paywalls, no "pro" version. If it saves you retakes, you can support its development. Every donation goes into more languages and more devices to test on.
Starring the repository and telling other creators about it helps too.
Bug reports from different phones are the most valuable help. Attach the in-app log: Settings → About → Log → Share. See CONTRIBUTING.md for building, code style and adding a language. Report security problems privately, as described in SECURITY.md.
How this was made: the author designed the app, directed it and tested it on a real phone. Much of the code was written with an AI coding assistant (Claude by Anthropic). The voice tracker (in both languages) and the importers are covered by unit tests in app/src/test.
GNU General Public License v3.0. You may use, study, share and modify Suflyor. Modified versions you distribute must stay open source under the same license.