СейчасЧто это такое
- Что это такое
- Три сущности, которые легко перепутать
- Основные возможности
- Точность и производительность
- Сравнение с альтернативами
- Установка
- Первые команды
- Подключение по API
- REST
- WebSocket
- Железо и ускорение
- Безопасность и запуск в продакшене
- Практические сценарии
- Стоимость и лицензии
- Чеклист «что делать, если…»
- Ссылки
gigastt — сервер распознавания русской речи, который работает целиком на вашей машине. Один бинарник на Rust запускает открытую модель GigaAM v3 через ONNX Runtime: без облака, без API-ключей, без Python в рантайме.
Что это такое
gigastt — обёртка вокруг модели GigaAM v3 от SberDevices, превращающая её в готовый сервис. Внутри бинарника лежит вся цепочка: декодирование аудио, мел-спектрограмма, Conformer-энкодер, RNN-T-декодер, токенизатор и постобработка с пунктуацией.
Наружу это выходит тремя способами: CLI для файлов, HTTP-сервер с REST и WebSocket, а также библиотека gigastt-core и C-ABI FFI для встраивания в приложение, включая Android.
Проект открыт под MIT, автор — Evgeny Khodzitsky. Репозиторий создан 9 апреля 2026 года и развивается быстро: 668 коммитов и 39 версий на crates.io, актуальная ветка — 2.x (gigastt-core = "2.14").
Три сущности, которые легко перепутать
В разговорах слово «GigaSTT» прилетает сразу к трём разным вещам. Разница принципиальная.
| Что | Кто сделал | Суть |
| gigastt | Evgeny Khodzitsky, MIT | Локальный сервер и библиотека на Rust. Запускает модель у вас на железе |
| GigaAM v3 | SberDevices, MIT | Сама акустическая модель. Веса открыты, лежат на Hugging Face |
| SaluteSpeech | Сбер | Облачный сервис распознавания и синтеза речи с тарифами и ключами |
Основные возможности
| Возможность | Что это даёт |
| Головы модели | rnnt по умолчанию (лучший WER), e2e_rnnt со встроенной пунктуацией и нормализацией, ml_ctc для ru/en/kk/ky/uz |
| Стриминг | Инкрементальные partial-результаты по WebSocket, первый примерно через 0.78 с |
| REST и SSE | Загрузка файла с полным ответом или потоковой выдачей по мере распознавания |
| OpenAI-совместимость | Эндпоинт /v1/audio/transcriptions подхватывают клиенты, написанные под Whisper API |
| Пунктуация и ITN | Читаемый текст с числами и датами в нормальном виде: нативно на голове e2e_rnnt либо флагами --punctuation и --itn на rnnt, где модели RuPunct и ITN докачиваются отдельно |
| Диаризация | Разметка спикеров через WeSpeaker-эмбеддинги, для стереозвонков есть режим «канал = спикер»; оба режима взаимоисключающие |
| Форматы аудио | WAV, M4A/AAC, MP3, OGG Vorbis и Opus, FLAC; многоканальное сводится в моно автоматически |
| Экспорт | JSON, TXT, SRT, VTT, Markdown с таймингами по словам и уровнем уверенности |
| Пакетная работа | Команды transcribe-batch и watch для папки, очередь задач /v1/jobs для длинных файлов |
Точность и производительность
Замеры сделаны автором проекта на Apple M1, CPU, INT8, по 1000 сэмплов на домен (чистая начитка — 992), с 95-процентными бутстрап-интервалами. Независимых проверок этих цифр пока нет.
| Метрика | Значение |
| WER, чистая начитка | 3.55% |
| WER, дальнее поле | 4.08% |
| WER, телефонный звук | 18.50% |
| WER, YouTube | 10.91% |
| RTF | ~0.10 (примерно 10× быстрее реального времени на CPU) |
| Размер модели | ~850 МБ при скачивании, ~225 МБ после квантизации в INT8 |
| Память | ~400 МБ на одну сессию, ~790 МБ при --pool-size 2 |
| Холодный старт | 0.94 с |
Сравнение с альтернативами
| Движок | WER, чистая речь | RTF | Стриминг | Пунктуация | Языки |
| gigastt (GigaAM v3) | 3.55% | 0.10 | Да, инкрементальный | Да | Русский плюс 4 языка опционально |
| Vosk 0.54 | 2.97% | ~0.03 | Да (сервер) | Отдельный модуль на 1.6 ГБ | 20+ |
| T-one (beam + LM) | 6.61% | 0.065 | Да, чанки по 300 мс | Нет | Русский |
| whisper.cpp Large v3 | 15.26% | 0.36–0.77 | Нет | Да | ~99 |
| faster-whisper Large v3 | 15.53% | >1.0 | Нет | Да | ~99 |
| SaluteSpeech (облако) | Не публикуется | Зависит от сети | Да | Да | По документации сервиса |
Когда брать другой инструмент. На чистой студийной начитке Vosk немного точнее, и по скорости он тоже впереди. Если нужны десятки языков, смотрите в сторону Whisper или Vosk. Если аудио разрешено отправлять в облако и не хочется держать сервер, проще подключить SaluteSpeech с его фримиум-тарифом на 100 минут в месяц.
Сильная сторона gigastt проявляется на грязном звуке: дальнее поле, телефон, YouTube. Плюс упаковка, где стриминг, диаризация и пунктуация уже лежат в одном бинарнике.
Установка
# Homebrew: macOS arm64 и Linux x86_64
brew tap ekhodzitsky/gigastt https://github.com/ekhodzitsky/gigastt
brew install gigastt
# Из crates.io: нужен protoc в PATH
brew install protobuf # на Linux: apt install protobuf-compiler
cargo install gigastt
# Готовый образ из GHCR (CPU, amd64 и arm64)
docker pull ghcr.io/ekhodzitsky/gigastt:latest
docker run -p 9876:9876 ghcr.io/ekhodzitsky/gigastt:latestМодель скачивается при первом запуске (~850 МБ) и квантуется в INT8 до ~225 МБ. Чтобы не ждать этого в проде, соберите образ с зашитой моделью: docker build --build-arg GIGASTT_BAKE_MODEL=1 -t gigastt:baked .
Первые команды
# Один файл
gigastt transcribe recording.wav
# Целая папка: на выходе txt и json на каждый файл
gigastt transcribe-batch samples/ out/
# Следить за папкой и расшифровывать всё, что туда падает
gigastt watch inbox/ out/ --move-to inbox/done/
# Поднять сервер: WebSocket, REST и SSE на одном порту
gigastt serveПодключение по API
REST
| Эндпоинт | Метод | Назначение |
/health | GET | Проверка живости сервиса |
/v1/models | GET | Информация о модели, размере пула и возможностях |
/v1/transcribe | POST | Расшифровка файла, полный JSON в ответе |
/v1/transcribe/stream | POST | То же, но с потоковой выдачей через SSE |
/v1/audio/transcriptions | POST | OpenAI-совместимый режим для готовых клиентов |
/v1/ws | GET | Апгрейд до WebSocket для реального времени |
/v1/jobs | POST | Очередь длинных задач, включается флагом --enable-jobs |
curl -X POST http://127.0.0.1:9876/v1/transcribe \
-H "Content-Type: application/octet-stream" \
--data-binary @recording.wav
# В ответе JSON: текст, тайминги по словам и уровень уверенностиWebSocket
Клиент подключается к ws://127.0.0.1:9876/v1/ws, шлёт бинарные кадры PCM16 и получает промежуточные и финальные результаты.
Клиент Сервер
|------------ connect -------------->|
|<----------- ready -----------------| {type:"ready", version:"1.0"}
|------------ configure ------------>| {type:"configure", sample_rate:16000}
|------------ PCM16 ---------------->|
|<----------- partial ---------------| {type:"partial", text:"привет"}
|<----------- final -----------------| {type:"final", text:"Привет, как дела?"}Частота дискретизации передаётся в сообщении configure, внутри всё приводится к 16 кГц. В репозитории лежат типизированные клиенты протокола 1.0 для Go и TypeScript (@gigastt/client) с переподключением по retry_after_ms.
Если сервер не нужен, движок встраивается прямо в приложение: npm install gigastt, pip install gigastt или крейт gigastt-core без серверных зависимостей.
Железо и ускорение
| Платформа | Флаг сборки | Провайдер исполнения |
| Любая | по умолчанию | CPU |
| macOS ARM64 (M1–M4) | --features coreml | CoreML и Neural Engine |
| macOS ARM64, экспериментально | --features ane | Apple Neural Engine, энкодер до 15× быстрее, только файловый режим |
| Linux x86_64 + NVIDIA | --features cuda | CUDA 12+ |
| Android | C-ABI FFI | NNAPI |
Требования: Rust 1.88+, protoc в PATH, macOS 14+ (Apple Silicon) или Linux x86_64, около 1.5 ГБ диска. Ускоритель выбирается на этапе компиляции: бинарник несёт тот провайдер, с которым его собрали. На ANE энкодер идёт примерно в 15.6 раза быстрее, сквозной прогон в прогретом состоянии — около 10 раз относительно CPU-сборки, с небольшим расхождением в точности.
Безопасность и запуск в продакшене
Сервер по умолчанию слушает только петлевой интерфейс и отказывается подниматься на внешнем адресе без явного --bind-all. Кросс-доменные запросы из браузера тоже закрыты, пока вы не добавите источник через --allow-origin.
Что ещё встроено: ограничение частоты запросов по IP, лимиты на размер кадра WebSocket и тела REST-запроса, таймаут простоя, отдача Retry-After при переполнении пула, корректное завершение с дозакрытием активных сессий, метрики Prometheus на отдельном порту и горячая перезагрузка модели, доступная только с петлевого интерфейса.
--bind-all открывает сервис наружу без какой-либо аутентификации. Выставляйте его только за обратным прокси с авторизацией и TLS, иначе расшифровка вашего аудио станет публичной услугой.Практические сценарии
- Расшифровка интервью и созвонов внутри контура. Записи клиентских разговоров не покидают машину, что снимает вопросы про персональные данные и коммерческую тайну.
- Обработка звонков контакт-центра. Стереозапись разбирается по каналам: левый становится
speaker_0, правыйspeaker_1, дальше текст уходит в аналитику диалогов. - Голосовой ввод в собственном приложении. Через WebSocket и partial-результаты собирается диктовка с откликом меньше секунды.
- Конвейер «папка на входе, текст на выходе». Команда
watchподхватывает новые файлы и складывает расшифровки рядом, дальше их забирает автоматизация. - Субтитры. Экспорт в SRT и VTT с таймингами по словам закрывает задачу без отдельного инструмента.
- Замена облачного Whisper API. OpenAI-совместимый эндпоинт позволяет переключить существующий код на локальный сервер сменой базового URL.
Стоимость и лицензии
Сам движок бесплатен и распространяется по MIT, веса GigaAM v3 тоже MIT, поэтому коммерческое использование допустимо. Расходы сводятся к железу: около 1.5 ГБ диска и 400–800 МБ памяти на инстанс.
benchmark/ под MIT не подпадают. Транскрипты OpenSTT идут по CC BY-NC 4.0, транскрипты Golos по Sber Public License. Коммерчески использовать можно код и модель, но не эти датасеты.Чеклист «что делать, если…»
| Симптом | Что проверить |
| Сборка падает на этапе зависимостей | Нет protoc в PATH. Поставьте protobuf-компилятор и повторите cargo install |
| Первый запуск долго висит | Скачивается модель на 850 МБ. Прогрейте заранее командой gigastt download |
Приходит HTTP 503 с Retry-After | Переполнен пул сессий. Поднимите --pool-size или разложите нагрузку по очереди /v1/jobs |
| Сервер не поднимается на внешнем адресе | Так задумано. Нужен --bind-all или переменная GIGASTT_ALLOW_BIND_ANY=1, и обязательно прокси перед сервисом |
| Браузер не может подключиться к WebSocket | Origin не в списке разрешённых. Добавьте --allow-origin https://ваш-домен |
| Текст без знаков препинания | Включите --punctuation и --itn или переключитесь на голову e2e_rnnt |
| Качество на телефонных записях просело | Штатная ситуация: WER на телефонном домене 18.5%. Помогает предварительное шумоподавление и запись в 16 кГц моно |
| Памяти не хватает | Переведите сервер в --pool-size 1, это примерно 400 МБ вместо 790 МБ |
Ссылки
- Репозиторий: github.com/ekhodzitsky/gigastt
- Пакет и версии: crates.io/crates/gigastt
- Документация API и бенчмарков: docs в репозитории
- Воркбук со сценариями: ekhodzitsky.github.io/gigastt
- Модель GigaAM: github.com/salute-developers/GigaAM
- Веса на Hugging Face: huggingface.co/ai-sage/GigaAM-v3
- Облачная альтернатива SaluteSpeech: developers.sber.ru/docs/ru/salutespeech/overview
По теме
Если вы работаете с записями разговоров и упираетесь в требования по хранению данных, локальный STT часто снимает вопрос ещё до того, как он дойдёт до службы безопасности.
Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov
Если хотите разобрать свою задачу — напишите мне Если хотите разобрать свою задачу — напишите мне.
Можно прийти с идеей, черновым контекстом или уже живой задачей. Помогу быстро понять, где реальный следующий шаг, а где лишний шум.
Обычно хватает 2–3 сообщений, чтобы понять, могу ли я здесь реально помочь и в каком формате лучше двигаться дальше.