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.