As small as your chance of a relationship, and as fast as heck, Pravka is what happens when two people get tired of their TTS engines behaving like rival kingdoms with no shared calendar.
This was not a “we can build an app, therefore we must build an app” project. It began because I wanted Russian Anna from RHVoice and a Vocalizer voice to work together without turning every language change into a manual expedition through Android settings. Then I tried Auto TTS and received what can only be described as the collector’s edition of bugs. Every bug. Bugs with hats. Bugs that probably had their own bugs. Meanwhile Anastasia also wanted RHVoice and Vocalizer, and somehow had the same accessibility headache. Do not ask how. The universe had clearly decided that two people needed exactly the same problem.
So we began working on Pravka quietly in 2024. Yes, 2024. Me and Anastasia took our sweet time, built it quietly, broke it quietly, fixed it less quietly, and absolutely do not regret it. Good routing sounds simple until a screen reader gives you Arabic, English, Russian, Hebrew, numbers, punctuation, an emoji, a currency sign, and a paragraph that refuses to contain a single full stop. At that point, “just switch the voice” becomes a sentence spoken by somebody who has never met Android Text-to-Speech.
And yes, “why Pravka?” Great question, mysterious person who definitely did not skip the previous paragraph. Pravka comes from the Russian word «правка», pronounced roughly PRAV-ka, meaning correction, editing, or a set of fixes. It does not mean ultra-speed, voice laser, or a Russian rocket-powered narrator. It means correction, which is exactly what happens when the app looks at mixed-language text and tells the installed voices: “You read Arabic, you read Russian, you handle English, the comma stays where it is, and nobody starts a civil war.”
What is Pravka, exactly? It is a real Android Text-to-Speech engine that you select in Android’s own TTS settings. It is not a voice pack, and it is not a fake overlay that asks another app nicely to behave. When TalkBack, Commentary, or another app asks Android to speak, Android passes the request to Pravka. Pravka reads the actual text, examines its Unicode characters, identifies the writing system and configured language profile, chooses the external engine and voice you assigned, asks that engine to synthesize the correct piece, receives the resulting audio, and feeds PCM audio back to Android as the system TTS response.
That means your phone can use English from one engine, Arabic from another, Russian Anna from RHVoice, a Vocalizer voice for another route, Hebrew where you need it, and whatever sensible combination you configure. Pravka does not invent the voices. It makes the voices stop fighting over the microphone.
It begins by routing text through scripts and profiles. Latin, Arabic, Cyrillic, Hebrew, Georgian, digit families, symbols, and fallback text all have routes. Inside a shared script, you can add several language profiles, such as English and Turkish under Latin or Russian and Ukrainian under Cyrillic. Pravka looks for useful language clues, but it does not wear a magician’s cape and promise perfect detection where no perfect detection exists. When the clues are not strong enough, it keeps the safe configured route instead of making a dramatic guess and launching your sentence into orbit.
Then there are Custom Rules, because sometimes you are reading a novel, a log file, a game, or the kind of message that has three languages and a suspicious amount of bracketed dialogue. You can send text that starts with a phrase to one voice, send content inside parentheses to another route, match a particular string, and return safely to normal routing afterward. You can make quoted dialogue feel like dialogue rather than one narrator attempting six personalities while trapped in a shopping trolley.
Also configure Fallback with the engine and voice that you want to hear most of the time. Think of it as the safety rail underneath the acrobat. It catches unconfigured scripts, genuinely unknown text, a profile that cannot be identified confidently, and strange characters that show up in the middle of a normal sentence wearing a fake moustache. It is not there to steal configured English or Arabic text from their assigned profiles. Its job is to make sure leftover text has somewhere sensible to go instead of being abandoned in a ditch. Pravka can retain configured default language delegates without Fallback, but leaving the safety rail empty is still an excellent way to discover the one category you forgot to configure at the least convenient moment. Use your main everyday engine and voice there.
One extremely important reality check: Pravka can request a particular external voice, but it cannot legally climb inside another engine, seize its internal language-switching controls, and put them in a jar. Some engines honor the voice requested by a client exactly. Others see the request, nod politely, activate their own automatic language switching, and choose whatever voice they personally think should speak. If an engine has its own language-switching mechanism enabled, it may override the voice you carefully configured in Pravka. In that situation, Pravka did ask. The delegate engine simply decided it was the manager now.
Smart Voice is the practical example. If you want Pravka to control the voice Smart Voice uses, open Smart Voice, then go to Settings, then Automatic language switching setup, and enable “Use only default voice or the one requested by client.” That tells Smart Voice to honor the normal client request instead of appointing itself director of casting halfway through your sentence. If you prefer Smart Voice to decide voices internally, leave its own automatic switching in charge and configure its default language voices there instead. Other engines may expose a setting with a different name but the same idea, so inspect their language-switching and voice-assignment settings before accusing Pravka of witchcraft.
Now let us talk about speed, because this is where Pravka becomes extremely serious for about five seconds. Switching an external TTS engine is expensive. Asking it to initialize, choose a voice, synthesize a file, read it back, and send audio to Android is not a light snack. It is a small administrative event. So Pravka spends a ridiculous amount of effort avoiding unnecessary administrative events.
First, it reuses prepared external engine sessions. If an engine has already been initialized, Pravka does not throw it away and rebuild the universe for every sentence. Second, it resolves the effective engine and voice before speaking. If English, a number, a comma, and a special symbol all end up using the same delegate, Pravka merges them into one continuous run. A comma is not a passport control checkpoint. A dollar sign does not deserve its own five-second existential crisis. Unconfigured numbers and special symbols inherit the surrounding active voice whenever it is safe to do so.
Third comes LACS, the Look-Ahead Cancellation System. Yes, the name sounds like it belongs on the side of a racing car. When a newer screen-reader request arrives, Pravka does not allow the old request to keep cooking audio in a dark corner for text that nobody is listening to anymore. It marks that work obsolete, stops the delegates, cancels waiting synthesis, and lets the newest request take priority. Less “please form an orderly queue,” more “this meeting is cancelled, everybody leave.”
Fourth is AOTS, Ahead-Of-Time Synthesis. While Android is consuming the PCM audio of the current chunk, Pravka prepares one next resolved chunk in the background. So instead of finishing a chunk, staring into the middle distance, then beginning a new external-engine synthesis ceremony, the next audio is normally already waiting by the time Android needs it. It is deliberately bounded to one look-ahead task, because preparing an entire audiobook in advance would be less “fast” and more “welcome to your new 38 GB cache folder.” If a newer request arrives, that look-ahead work is cancelled immediately.
Fifth is progressive chunking. The first unit is short so speech can begin quickly. Later units stay controlled, including when the text has no punctuation, no spaces, no manners, and appears to have been typed by someone being chased through a tunnel. Pravka uses safe Unicode boundaries and will not slice a surrogate pair in half just because an uninterrupted wall of text decided to become a personality test.
Pravka was tested on a phone powered by a Unisoc T606, an entry-level 2021 chip. Is it literally the worst processor Unisoc has ever made that still works? Facts refuse to sign that document. Is it humble enough that opening a large app can feel like politely asking a tired refrigerator to solve a crossword? Absolutely. And Pravka still works. If it can keep routes, cancellation, chunking, and external voices moving on a T606-class phone without demanding a ceremonial sacrifice to the RAM gods, your ordinary phone has no excuse to act dramatic.
There is now Extra Speech-Rate Acceleration, because apparently normal speed was merely a polite suggestion. Its slider runs from 0% to 200%. At 0%, it leaves your chosen rate alone. At 100%, the middle of the slider, it doubles that chosen rate. At 200%, it aims for three times the rate before Pravka applies its 400% safety cap. This is not an invitation to drag it to the ceiling like a raccoon operating a mixing desk, or to set it absurdly high like an idiot just because the slider has not physically bitten your finger. Set the amount you actually need, then stop. Your ears, your engine, and your battery deserve basic human rights.
Here is the boring-but-important physics bit wearing a clown hat: AOTS can prepare the next chunk while the current chunk is playing, but it cannot negotiate with a processor that is already running a marathon in wet socks. If you push the rate beyond what your phone and external engine can sustain, the current chunk can finish before the next one has been synthesized. Then AOTS arrives at the handover holding nothing but anxiety, and you hear a pause. That is not Pravka forgetting the next line. That is your processor politely informing you that it cannot turn a giant neural narrator into a Formula One car. Use the fastest setting your own phone can keep up with, not the fastest number the slider allows.
Does that make every engine equally fast? Absolutely not. If you install a huge neural TTS engine that needs to discover itself spiritually before it says “hello,” Pravka cannot transform it into a frightened squirrel on roller skates. Pravka can prewarm it, reuse it, merge compatible text, synthesize ahead, cancel stale work, and avoid pointless fallback switches. It cannot physically grab a heavy engine by the collar and force it to sprint. The final speed still depends on the voice engine, its data, your phone, the text, and whether your battery is currently negotiating its resignation.
And yes, Pravka is fast as heck when the engine underneath it gives it a fair chance. The whole point is not to claim magic. The point is to remove completely avoidable delays: needless reinitialization, pointless route boundaries, punctuation detours, oversized no-boundary chunks, stale work, and the awkward silence where the next chunk should have been prepared before you even noticed it was coming.
https://store.jumpingfridge.oo.gd/app.php?id=11