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

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

≈ 2 минуты

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

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, единого объекта нет. При этом одни и те же фрагменты могут прийти дважды: сначала сырой вариант, потом нормализованный с заглавными буквами и пунктуацией. Код разбирает это аккуратно: приоритет у версии с нормализацией, дубли отфильтровываются по времени и спикеру.

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

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