Blog · 12 min read
How to transcribe Russian speech to text via API: a step-by-step guide
Speech-to-text (STT) turns audio into structured text: words, timestamps, and speakers. This guide walks the full path — from choosing an approach and getting a key to a working Python script, response parsing, and subtitle export.
Why transcription matters
Manual transcription is slow and expensive: an hour of audio takes a person 3–5 hours, and on long recordings with several voices and technical terms mistakes are unavoidable. An STT API finishes in minutes and returns timestamps right away — each word mapped to the second it was spoken.
Typical use cases: call-center call logging and quality monitoring, subtitles for video and webinars, interview, podcast and meeting notes, audio labeling for machine learning, and pronunciation checking in EdTech.
Russian is harder here than English: more word forms, free word order, and plenty of proper names. So the first thing to check is real accuracy on Russian speech — not the numbers from marketing tables.
How to choose an API
Compare providers on five criteria. Accuracy: WER (word error rate) shows the share of misrecognized words — the lower, the better. Price: count per minute of audio, not per request. Russian support: the model should be trained on Russian speech, not just "speak a bit of everything". Features: word-level timestamps, diarization (who is speaking), and keyterms — hints for rare vocabulary. Speed: short files need a synchronous answer, long files need async jobs with status polling.
VoiceKit covers all of these out of the box: Russian with no extra setup, per-word timestamps, speaker diarization, keyterm boosting for domain vocabulary, and streaming transcription over WebSocket for live calls. Details and prices — see pricing.
Getting an API key
Sign up in the dashboard — the key is created automatically and shown in the API section. The Free plan includes 30 transcription minutes per month: enough to test the integration on real files.
Send the key in the X-Api-Key header on every request. Don't hardcode it in source or commit it to a repository — use environment variables or a .env file. If the key leaks, rotate it in the dashboard: the old one stops working immediately.
Python code
Install the SDK with one command — or call the API with plain HTTP requests. The fastest option for short files is the synchronous method:
pip install ttsapi-client
from ttsapi import RussianTtsClient
client = RussianTtsClient(api_key="rtt_…")
transcript = client.transcribe_sync("meeting.mp3")
print(transcript["transcript"])
for segment in transcript["segments"]:
print(segment["start"], segment["end"], segment["text"])
For longer recordings (a few minutes and up) use the asynchronous mode: upload the file, get a job_id, and poll the status until it becomes completed or failed:
job = client.transcribe("meeting.mp3", language="ru", diarization=True, keyterms=["диагноз"])
result = client.get_transcription_job(job["job_id"])
while result["status"] not in ("completed", "failed"):
result = client.get_transcription_job(job["job_id"])
print(result["transcript"])
The same call accepts the language, enables diarization, and takes keyterms — a list of rare words and terms the model should recognize more accurately. This is especially useful for medical, legal, and technical recordings.
What the API returns and how to read it
The response contains transcript — the full text — and segments, a list of time-bounded slices. Each segment contains words — word-level timestamps: word, start, end, and confidence:
{
"transcript": "Сегодня мы обсудим план запуска.",
"segments": [
{
"start": 0.0,
"end": 4.2,
"text": "Сегодня мы обсудим",
"speaker": "Speaker 1",
"words": [
{"word": "Сегодня", "start": 0.0, "end": 0.9, "confidence": 0.98}
]
}
]
}
With diarization on, each segment also has a speaker — the model marks who is talking. For calls and interviews this lets you group the text by participant.
Watch the confidence value: highlight low-confidence words in your UI so an operator can quickly double-check the uncertain spots instead of proofreading the whole text.
Diarization: who is speaking
Diarization answers "who was talking at this moment". The model splits the recording into utterances and assigns speaker labels, even without knowing their names — Speaker 1, Speaker 2, and so on.
Turn it on with a single parameter, diarization=True. It fits support calls, interviews, negotiations, and meetings: you see a dialog, not a wall of text.
Subtitles and export
For video and webinars you don't have to assemble SRT files from timestamps by hand. Call GET /v1/transcribe/{job_id}/subtitles?format=srt — the service returns a ready subtitle file you can attach to a YouTube video or any player.
Errors and limits
Main codes: 401 — wrong or revoked key, 413 — file too large, 429 — plan limit exceeded. Handle them in code: for 429 pause and retry, for 401 rotate the key.
The full list of codes, limits, and request examples — see the docs.
How to improve accuracy
Record at the highest available quality: 16 kHz and above, without heavy compression or echo. One speaker per channel and minimal background noise help more than switching models.
Pass keyterms with domain vocabulary — names, drug names, abbreviations. The model starts "hearing" them even in fast speech. For phone calls use 8 kHz mono, the standard telephony format.
Start for free
The Free plan includes 30 transcription minutes per month — no card required. Create a key and transcribe your first file in five minutes.