pimenov.ai

База знаний

gigastt — локальный сервер распознавания русской речи на GigaAM v3

gigastt — локальный STT-сервер на Rust: модель GigaAM v3, WebSocket и REST, диаризация и пунктуация, работа без облака и без API-ключей.

Опубликовано Обновлено

gigastt — сервер распознавания русской речи, который работает целиком на вашей машине. Один бинарник на Rust запускает открытую модель GigaAM v3 через ONNX Runtime: без облака, без API-ключей, без Python в рантайме.

ℹ️
Для кого: разработчики и команды, которым нужна расшифровка русской речи внутри своего контура — интервью, созвоны, звонки контакт-центра, голосовой ввод. Достаточно уметь запускать команды в терминале и делать HTTP-запросы.

Что это такое

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» прилетает сразу к трём разным вещам. Разница принципиальная.

ЧтоКто сделалСуть
gigasttEvgeny Khodzitsky, MITЛокальный сервер и библиотека на Rust. Запускает модель у вас на железе
GigaAM v3SberDevices, MITСама акустическая модель. Веса открыты, лежат на Hugging Face
SaluteSpeechСберОблачный сервис распознавания и синтеза речи с тарифами и ключами
💡
Термин: WER (Word Error Rate) — доля ошибочных слов в расшифровке. Чем ниже, тем лучше. RTF (Real-Time Factor) — во сколько раз обработка быстрее длительности записи: RTF 0.10 означает, что час аудио расшифровывается примерно за шесть минут.

Основные возможности

ВозможностьЧто это даёт
Головы модели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, YouTube10.91%
RTF~0.10 (примерно 10× быстрее реального времени на CPU)
Размер модели~850 МБ при скачивании, ~225 МБ после квантизации в INT8
Память~400 МБ на одну сессию, ~790 МБ при --pool-size 2
Холодный старт0.94 с
⚖️
Важный нюанс. GigaAM v3 обучалась в том числе на корпусе Golos, а бенчмарки частично собраны из Golos и OpenSTT. Часть тестовых записей близка к обучающему распределению, поэтому приведённые цифры стоит читать как верхнюю границу качества. На вашем аудио результат будет скромнее, особенно на телефонных записях и шумных переговорках.

Сравнение с альтернативами

ДвижокWER, чистая речьRTFСтримингПунктуацияЯзыки
gigastt (GigaAM v3)3.55%0.10Да, инкрементальныйДаРусский плюс 4 языка опционально
Vosk 0.542.97%~0.03Да (сервер)Отдельный модуль на 1.6 ГБ20+
T-one (beam + LM)6.61%0.065Да, чанки по 300 мсНетРусский
whisper.cpp Large v315.26%0.36–0.77НетДа~99
faster-whisper Large v315.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 .

💡
Совет: обещание «всё локально» относится к инференсу. Во время сборки ONNX Runtime и веса модели всё-таки тянутся из сети. Для изолированного контура собирайте образ на машине с интернетом, а внутрь периметра переносите уже готовый артефакт.

Первые команды

# Один файл
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

ЭндпоинтМетодНазначение
/healthGETПроверка живости сервиса
/v1/modelsGETИнформация о модели, размере пула и возможностях
/v1/transcribePOSTРасшифровка файла, полный JSON в ответе
/v1/transcribe/streamPOSTТо же, но с потоковой выдачей через SSE
/v1/audio/transcriptionsPOSTOpenAI-совместимый режим для готовых клиентов
/v1/wsGETАпгрейд до WebSocket для реального времени
/v1/jobsPOSTОчередь длинных задач, включается флагом --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 coremlCoreML и Neural Engine
macOS ARM64, экспериментально--features aneApple Neural Engine, энкодер до 15× быстрее, только файловый режим
Linux x86_64 + NVIDIA--features cudaCUDA 12+
AndroidC-ABI FFINNAPI

Требования: 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, иначе расшифровка вашего аудио станет публичной услугой.

Практические сценарии

  1. Расшифровка интервью и созвонов внутри контура. Записи клиентских разговоров не покидают машину, что снимает вопросы про персональные данные и коммерческую тайну.
  2. Обработка звонков контакт-центра. Стереозапись разбирается по каналам: левый становится speaker_0, правый speaker_1, дальше текст уходит в аналитику диалогов.
  3. Голосовой ввод в собственном приложении. Через WebSocket и partial-результаты собирается диктовка с откликом меньше секунды.
  4. Конвейер «папка на входе, текст на выходе». Команда watch подхватывает новые файлы и складывает расшифровки рядом, дальше их забирает автоматизация.
  5. Субтитры. Экспорт в SRT и VTT с таймингами по словам закрывает задачу без отдельного инструмента.
  6. Замена облачного 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, и обязательно прокси перед сервисом
Браузер не может подключиться к WebSocketOrigin не в списке разрешённых. Добавьте --allow-origin https://ваш-домен
Текст без знаков препинанияВключите --punctuation и --itn или переключитесь на голову e2e_rnnt
Качество на телефонных записях проселоШтатная ситуация: WER на телефонном домене 18.5%. Помогает предварительное шумоподавление и запись в 16 кГц моно
Памяти не хватаетПереведите сервер в --pool-size 1, это примерно 400 МБ вместо 790 МБ

Ссылки


По теме

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

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov