kokoro-ru
Russian text-to-speech at 82M parameters, running 9.8x faster than realtime on a laptop CPU with no GPU. Three fixed voices from consented studio actors.
A Russian port of Kokoro-82M.
RTF 0.102 9.8x realtime, CPU only
params 81.81M
peak RAM 2.39 GB
Voices
voice gender checkpoint
sveta female kokoro-ru-v2-base.pth
masha female kokoro-ru-v2-base.pth
dima male kokoro-ru-v2-dima.pth
Sveta — heard in the clip above — is the flagship voice. She and Masha share one checkpoint and differ only by voicepack, so the release is two model files, not three.
Usage
Works with the stock kokoro package, unmodified.
import torch, soundfile as sf
from kokoro import KModel
from ru_g2p import RuG2P # this repo
g2p = RuG2P()
model = KModel(repo_id="hexgrad/Kokoro-82M", model="kokoro-ru-v2-base.pth").eval()
pack = torch.load("voices/sveta.pt", map_location="cpu", weights_only=False)
ipa, oov = g2p("Здравствуйте! Как ваши дела?")
assert not oov
with torch.no_grad():
audio = model(ipa, pack[len(ipa) - 1], 1.0, return_output=True).audio
sf.write("out.wav", audio.cpu().numpy(), 24000)
Russian TTS lives or dies on lexical stress — за́мок is a castle, замо́к is a
padlock. ru_g2p.py resolves stress, ё and homographs with
RUAccent, applies Russian vowel reduction,
then phonemizes. Feed it text, not IPA.
Evaluation
Whisper large-v3 round-trip against Piper, the incumbent free local Russian TTS, on identical sentences with identical ASR and normalisation. We average 2.50% WER against Piper's 4.38% and beat three of its four voices — but Piper's irina transcribes perfectly and we do not.
Two caveats worth stating: the set is 79 words, so these gaps are one or two words; and ASR accuracy measures intelligibility, not naturalness.
Frontend stress and orthoepy — homographs, ё restoration, the -ого/-его rule and its adverb exceptions, silent-consonant clusters: 15/16 correct.
Limitations
Timbre is darker than the source recordings, and varies by voice. Measured in the 6-10 kHz band against Piper irina at -25.4 dB:
dima -23.6 dB brighter than Piper
masha -26.2 dB level with Piper
sveta -33.8 dB noticeably darker, least training data (2.82 h)
Fricative artifact. ж/ш/х carry narrowband spectral ridges where real speech has flat noise, +7.8 dB against +1.2 dB. Around 31 dB below programme level, so audible only at high volume.
Homographs are 93.8%, not perfect. Known failure: "Это была настоящая мука" gives flour rather than torment. Pass explicit stress for critical text.
Prosody is deterministic. Like all Kokoro models the style vector is chosen by phoneme-string length, so identical text always produces identical audio.
Training
base hexgrad/Kokoro-82M, kikiri-tts / StyleTTS2 recipe
corpus 29.28 h, 16 speakers, 53% female, 47% full-band
stage 1 5 epochs val mel 0.230
stage 2 10 epochs val mel 0.318
hardware 1x RTX A6000, ~$16 total
Voices come from the Dialogs corpus (studio, consented actors, OpenRAIL). Russian LibriSpeech contributed phonetic coverage to the base model but supplies no shipped voice. Weights are OpenRAIL, code is Apache-2.0.
Acknowledgements
hexgrad (Kokoro-82M), semidark (kikiri-tts), Den4ikAI (RUAccent), the OpenSLR Russian LibriSpeech contributors, and the Dialogs actors and authors.
