«Войси» — российский ИИ-сервис транскрибации, резидент «Сколково», включён в реестр российского ПО Минцифры. API транскрибации «Войси» поддерживает русский язык с точностью до 98% и, в отличие от классических ASR-API, возвращает структурированный результат: текст разбит на предложения и абзацы, расставлена пунктуация, выделены спикеры и таймкоды. Писать собственный пайплайн нормализации не придётся.
Для команды из 2–3 инженеров это разница между 2–4 неделями разработки и подключением за 15 минут. В статье — quick start на Python и Node.js, сравнение с Яндекс SpeechKit и Nexara, структура ответа и тарификация.
Попробовать API — 45 минут бесплатно → — ключ генерируется сразу, без форм заявок и переговоров.
Где и зачем используют API транскрибации на русском?
API транскрибации нужен там, где объём записей не позволяет обрабатывать их вручную. Пять индустрий, где это работает прямо сейчас.
Колл-центры и отделы продаж. Автоматическая расшифровка всех входящих и исходящих звонков. Транскрипты попадают в CRM, аналитика по менеджерам строится автоматически. Руководитель видит, что говорит каждый менеджер, — без прослушивания сотен записей.
Медтех. Записи консультаций превращаются в структурированный текст для медицинской карты. Врач говорит — система пишет. Экономия 20–30 минут на каждом приёме.
Edtech. Лекции, вебинары, записи курсов — всё транскрибируется автоматически. Студент получает конспект, платформа получает поисковый индекс по контенту. Новые записи обрабатываются сразу после загрузки.
Юртех. Аудиозаписи переговоров, допросов, судебных заседаний. Транскрипт с разметкой спикеров позволяет юристам быстрее находить нужные фрагменты и готовить документы.
Медиа и подкасты. Транскрибация выпусков для SEO, show notes, переформатирования в текст. API встраивается в публикационный пайплайн: залил запись — получил транскрипт — опубликовал статью.
О том, как автоматизировать обработку звонков в CRM, читайте в статье «Аналитика звонков отдела продаж».
Какой API транскрибации лучше для русского языка?
На российском рынке API транскрибации предлагают несколько сервисов: «Войси», Яндекс SpeechKit, Nexara. Главное различие — не в цене за минуту, а в том, что вы получаете на выходе.
Яндекс SpeechKit возвращает текст с базовой пунктуацией, но без разбивки на абзацы и без структурирования по смыслу. Чтобы получить читаемый документ, нужна постобработка: сегментация на абзацы, нормализация структуры, привязка к спикерам. Nexara предлагает LLM-постобработку и диаризацию, но как отдельные платные опции (диаризация — 0,72 ₽/мин сверх базовой цены). Для обоих сервисов — чтобы получить production-ready текст, нужен дополнительный инженерный слой.
«Войси» работает иначе: возвращает готовый текст с предложениями, абзацами и пунктуацией. Диаризация (разметка спикеров) и таймкоды включены.
| Параметр | Войси API | Яндекс SpeechKit | Nexara |
|---|---|---|---|
| Точность на русском | до 98% | н/д (не публикуется) | н/д (не публикуется) |
| Структурированный вывод | Да — предложения, абзацы, пунктуация | Частично — пунктуация есть, абзацев нет | Частично — есть LLM-постобработка (опция) |
| Диаризация спикеров | Да, включена | Ограниченно (до 2 спикеров) | Да (доп. 0,72 ₽/мин) |
| Таймкоды | Да | Да | Да |
| Саммари / постобработка | Да — несколько форматов | Нет (отдельно через YandexGPT) | LLM-постобработка (опция) |
| Цена | от 0,33 ₽/мин (≈20 ₽/час) | от 0,15 ₽/мин (отложенный режим) | от 0,36 ₽/мин (self-service) |
| Нужен постпроцессинг | Нет | Да (абзацы, структура) | Частично |
| Поддержка языков | 55 языков | Русский, английский и несколько других | 57 языков |
| Серверы в России | Да | Да (Яндекс.Облако) | Да |
Цены актуальны на февраль 2026 года. Для Яндекс SpeechKit указана цена отложенного режима (deferred).
Если главный критерий — минимальная цена за минуту и у вас уже есть инфраструктура нормализации текста, Яндекс SpeechKit дешевле. Если важен готовый результат без постобработки и приоритет — русскоязычный контент, «Войси» экономит инженерное время.
Попробовать API бесплатно — 45 минут в подарок →
Как подключить API распознавания речи в приложение за 15 минут?
Подключить API «Войси» можно за 15 минут: получите ключ через бот в Telegram, установите зависимости, отправьте POST-запрос с файлом и дождитесь статуса completed. Ниже — пошаговый quick start с кодом на Python и Node.js.
Шаг 1. Получите API-ключ
Откройте бот @Voicee_AI_Bot в Telegram и запросите API-ключ через меню бота. Ключ генерируется сразу — без форм заявок и переговоров. Баланс API пополняется также в боте. Для юридических лиц можно запросить подключение через @Voicee_B2B — пришлём тестовый ключ, документацию и подпишем договор (или публичная оферта). Сохраните ключ в переменные окружения проекта.
# .env
VOICEE_API_KEY=your_api_key_here
Шаг 2. Установите зависимости
Для Python нужна библиотека requests. Для Node.js — встроенный fetch и FormData (Node 20+), без внешних зависимостей.
# Python
pip install requests
# Node.js 20+ — ничего не нужно, fetch и FormData встроены
Шаг 3. Отправьте файл на транскрибацию
Примеры ниже — иллюстративные. Актуальные endpoint, формат запроса и параметры — в документации API. Общая логика: отправить файл, получить task_id, дождаться результата.
Файл отправляется POST-запросом. В ответ получаете task_id — идентификатор задачи обработки.
Python:
import requests
import os
API_KEY = os.getenv("VOICEE_API_KEY")
BASE_URL = "https://api.voicee.ru/v1"
def submit_transcription(file_path: str, language: str = "ru") -> str:
"""Отправить файл на транскрибацию, вернуть task_id."""
with open(file_path, "rb") as audio_file:
response = requests.post(
f"{BASE_URL}/transcribe",
headers={"Authorization": f"Bearer {API_KEY}"},
files={"file": audio_file},
data={
"language": language,
"diarization": True,
"timecodes": True,
"summary": False,
}
)
response.raise_for_status()
return response.json()["task_id"]
task_id = submit_transcription("interview.mp3")
print(f"Задача создана: {task_id}")
JavaScript / Node.js:
import { readFile } from 'node:fs/promises';
const API_KEY = process.env.VOICEE_API_KEY;
const BASE_URL = 'https://api.voicee.ru/v1';
async function submitTranscription(filePath, language = 'ru') {
const buffer = await readFile(filePath);
const blob = new Blob([buffer]);
const form = new FormData();
form.append('file', blob, filePath.split('/').pop());
form.append('language', language);
form.append('diarization', 'true');
form.append('timecodes', 'true');
const response = await fetch(`${BASE_URL}/transcribe`, {
method: 'POST',
headers: { 'Authorization': `Bearer ${API_KEY}` },
body: form,
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const data = await response.json();
return data.task_id;
}
const taskId = await submitTranscription('interview.mp3');
console.log('Задача создана:', taskId);
Шаг 4. Получите результат
Транскрибация асинхронна: 1 час аудио обрабатывается за 3–4 минуты. Опрашивайте endpoint /transcribe/{task_id} до получения статуса completed.
Python — polling с экспоненциальной задержкой:
import time
def get_result(task_id: str, max_wait: int = 600) -> dict:
"""Дождаться результата транскрибации."""
delay = 5
elapsed = 0
while elapsed < max_wait:
response = requests.get(
f"{BASE_URL}/transcribe/{task_id}",
headers={"Authorization": f"Bearer {API_KEY}"}
)
response.raise_for_status()
data = response.json()
if data["status"] == "completed":
return data["result"]
elif data["status"] == "failed":
raise RuntimeError(f"Транскрибация не удалась: {data.get('error')}")
time.sleep(delay)
elapsed += delay
delay = min(delay * 1.5, 30)
raise TimeoutError("Превышено время ожидания")
result = get_result(task_id)
print(result["text"])
JavaScript — polling с async/await:
async function getResult(taskId, maxWait = 600_000) {
let delay = 5_000;
let elapsed = 0;
while (elapsed < maxWait) {
const response = await fetch(`${BASE_URL}/transcribe/${taskId}`, {
headers: { 'Authorization': `Bearer ${API_KEY}` },
});
const data = await response.json();
if (data.status === 'completed') return data.result;
if (data.status === 'failed') throw new Error(data.error);
await new Promise(r => setTimeout(r, delay));
elapsed += delay;
delay = Math.min(delay * 1.5, 30_000);
}
throw new Error('Timeout');
}
const result = await getResult(taskId);
console.log(result.text);

