Russian spelling hides two things learners get wrong all the time: which consonants are soft and which vowels are reduced. Спасибо is not "spa-see-bo": the с before и is palatalised and the unstressed а and о shrink to ɐ and ə. The Russian pack converts the text to the expected phonemes, stress and reduction included, then reports for every sound what it expected and what it estimates was said.
Dimensions
Pronunciation and completeness at sentence level, word scores and phoneme evidence. Fluency and rhythm are not scored for Russian today. Correction decisions are made per word; phoneme rows are evidence.
Learner errors this pack is built to show
- Soft consonants produced hard — сʲ, тʲ, лʲ said as с, т, л (спасибо, мать, соль).
- Unreduced vowels — a full o in an unstressed syllable where natives say ɐ or ə (молоко, хорошо).
- ы produced as и (мы / ми, быть / бить).
- The trilled р produced as an English or French r.
- Missing final devoicing — хлеб ending in a voiced b.
Phoneme rows are evidence, not validated corrections: they show a learner where a word went wrong, while the word-level decision is what your app should act on.
Coverage notes
The pack is new (October 2026) and labelled experimental. It is built the same way as the Spanish, German, Italian and Portuguese packs, on native read speech, and its calibration is still being tuned, so treat absolute scores as provisional and watch model_version in responses. Stress placement comes from the dictionary transcription of the text; a learner who stresses the wrong syllable will mostly show up through vowel-quality rows, because lexical stress is not scored as its own dimension. A recording of a different sentence scores near zero.
Example request
Reference text: Спасибо за помощь. Send the recording, the text and the locale; nothing else is required.
curl https://api.toneperfect.app/v1/assess \
-H "Authorization: Bearer $TONEPERFECT_API_KEY" \
-H "Idempotency-Key: lesson-42-attempt-1" \
-F "audio=@take.wav" \
-F "text=Спасибо за помощь" \
-F "language=ru-RU"What comes back
The same structure as every other language: sentence-level scores, a words[] array with timestamps and, under each word, phones[] with expected and heard values. Abbreviated to the one flagged word:
{
"language": "ru",
"locale": "ru-RU",
"task": "scripted_speech",
"status": "completed",
"assessable": true,
"model_version": "multilingual-native-v1-ru-…",
"scores": {
"overall": 84,
"pronunciation": 83,
"completeness": 100
},
"words": [
{
"word": "Спасибо",
"expected_ipa": "spɐsʲibə",
"score": 69,
"start_ms": 180,
"end_ms": 560,
"decision": "review",
"phones": [
{
"phone": "s",
"expected": "s",
"heard": "s",
"score": 94,
"diagnosis_status": "experimental"
},
{
"phone": "p",
"expected": "p",
"heard": "p",
"score": 92,
"diagnosis_status": "experimental"
},
{
"phone": "sʲ",
"expected": "sʲ",
"heard": "s",
"score": 57,
"diagnosis_status": "experimental"
},
{
"phone": "i",
"expected": "i",
"heard": "i",
"score": 90,
"diagnosis_status": "experimental"
},
{
"phone": "b",
"expected": "b",
"heard": "b",
"score": 93,
"diagnosis_status": "experimental"
}
]
}
],
"billing": {
"credits": 1,
"balance_credits": 2499
}
}Reference text goes in as text: The Russian sentence the learner was asked to read, in Cyrillic, up to 40 words, with numbers written as words. Stress and vowel reduction come from the transcription of the text, so you do not need to mark stress. See the response reference for every field.