04-11-2026 · projects/stt-yandex.md

stt-yandex: расшифровка записей с разделением по спикерам

У меня накапливались записи созвонов. Не для архива — для работы с ними: найти договорённости, восстановить контекст, передать кому-то кто не был на звонке. Слушать запись заново — дорого. Нужна расшифровка.

Lazy to Text закрывает другое: реальное время, диктовка, текст в активное окно. А здесь задача другая — взять готовый аудиофайл, иногда длинный, и получить транскрипт с пониманием, кто что говорил.

Whisper с этим справляется частично: текст получается хорошим, но спикеров не различает. Яндекс SpeechKit различает — и на русском работает заметно точнее. Но вызывать API руками неудобно: загрузи файл в Object Storage, отправь задачу, жди, забери результат, разбери NDJSON. Шагов много, каждый раз одно и то же.

Так появился stt-yandex.

Даёшь ему аудиофайл — он делает остальное. Конвертирует в моно (API принимает только моно), загружает в Yandex Object Storage, отправляет асинхронную задачу на распознавание, ждёт результата, разбирает ответ и отдаёт нормальный текст с метками спикеров.

uv run stt-cli transcribe meeting.mp3

На выходе — два файла в папке outputs/: .srt с таймкодами и .json с сырыми данными. В расшифровке сразу видно кто говорил:

Спикер 1: Давайте начнём с результатов прошлой недели.

Спикер 2: Да, мы закрыли три задачи из пяти запланированных.

Разделение спикеров работает через channelTag в ответе SpeechKit — API возвращает, на каком канале был каждый фрагмент. Поэтому для стереозаписей, где участники на разных каналах, диаризация получается точной: это не угадывание по голосу, а физическое разделение дорожек.

Есть один нюанс, который не очевидно: перед загрузкой инструмент проверяет, нет ли уже файла с таким именем в бакете, и прерывается если есть. Простая защита от случайного перезатирания — но я был рад, что она там есть.

Из интересного в устройстве: SpeechKit v3 возвращает результат не одним JSON-объектом, а потоком строк — каждая строка отдельный JSON. При этом одни и те же фрагменты могут прийти дважды: сначала сырой вариант, потом нормализованный с заглавными буквами и пунктуацией. Код разбирает это аккуратно — приоритет у версии с нормализацией, дубли отфильтровываются по времени и спикеру.

Это не инструмент для потоковой диктовки — для этого есть Lazy to Text. Это инструмент для работы с готовыми записями, где нужен читаемый протокол, а не просто текст.

Сравнение простое: если диктуешь в моменте — Lazy to Text. Если нужно расшифровать запись разговора — stt-yandex.