pimenov.ai

База знаний

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

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

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

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

ℹ️
Для кого: разработчики и команды, которым нужна расшифровка интервью, созвонов, звонков контакт-центра или голосового ввода внутри собственного контура. Материал сверён по официальным источникам 6 сентября 2026 года; практический запуск в рамках этой проверки не выполнялся.

Что входит в gigastt

gigastt — открытая обёртка на Rust вокруг моделей GigaAM. Конвейер включает декодирование аудио, построение мел-спектрограммы, Conformer-энкодер, RNN-T- или CTC-декодер, токенизатор и необязательную постобработку.

Использовать движок можно четырьмя способами:

  • CLI для отдельных файлов, папок и наблюдения за каталогом;
  • HTTP-сервер с REST, SSE и WebSocket;
  • библиотека gigastt-core для Rust;
  • привязки для встраивания: C-ABI, опубликованные пакеты для Node.js и Python.

Проект распространяется по MIT. На 6 сентября 2026 года в опубликованных контейнерах указана версия 2.20.0: доступны теги 2.20.0 и 2.20.0-cuda, а пример зависимости в документации — gigastt-core = "2.20".

gigastt и GigaAM — разные уровни стека

ЧтоКто развиваетНазначение
gigasttEvgeny Khodzitsky, MITЛокальный сервер, CLI и библиотеки на Rust
GigaAMSberDevices, MITСемейство акустических моделей, на которых работает движок
💡
Термины: WER (Word Error Rate) — доля ошибочных слов, где меньшее значение лучше. RTF (Real-Time Factor) показывает отношение времени обработки к длительности записи: RTF 0.10 соответствует примерно шести минутам обработки на час аудио.

Модели и основные возможности

ВозможностьЧто доступно
Варианты моделейrnnt по умолчанию; e2e_rnnt со встроенными пунктуацией, регистром и нормализацией; ml_ctc и ml_ctc_large на базе GigaAM Multilingual
Языкиrnnt и e2e_rnnt ориентированы на русский; многоязычные варианты поддерживают ru/en/kk/ky/uz
Потоковое распознаваниеПромежуточные результаты по WebSocket; REST и SSE для файлов
OpenAI-совместимый API/v1/audio/transcriptions принимает multipart-запрос с файлом и моделью
Пунктуация и ITNВстроены в e2e_rnnt; для rnnt включаются через --punctuation и --itn с дополнительными моделями
ДиаризацияРазметка говорящих через WeSpeaker и polyvoice; для стереозаписей доступен режим «канал = спикер». Режимы взаимоисключающие
АудиоWAV с PCM, G.711, G.722, GSM 06.10, ADPCM и RF64; M4A/AAC, MP3, OGG/Vorbis, OGG/Opus, WebM/Opus, FLAC и необработанные μ-law, A-law и G.722
ЭкспортJSON, TXT, SRT, VTT и Markdown, включая тайминги и оценку уверенности
Пакетная работаtranscribe-batch, watch и необязательная очередь /v1/jobs

Модель ml_ctc имеет энкодер на 220 млн параметров и занимает около 225 МБ в INT8. Вариант ml_ctc_large содержит 600 млн параметров и занимает около 592 МБ. В лабораторных измерениях ml_ctc быстрее стандартной rnnt, но это вариант с приоритетом скорости, а не облегчённая по памяти версия. Его качество следует отдельно проверять на своих данных. Многоязычные CTC-варианты выдают строчный текст, поэтому для пунктуации и нормализации потребуется дополнительная обработка.


Точность, скорость и память

Опубликованные сравнительные измерения сделаны командой проекта на Apple M1, CPU, INT8, с единым тестовым конвейером. Для четырёх основных доменов использовалось около 1000 записей на домен и 95-процентные бутстрап-интервалы.

Метрика gigastt rnntРезультат
WER, чистая начитка3.55%
WER, дальнее поле4.08%
WER, телефонный звук18.50%
WER, YouTube10.91%
Файловый RTFОколо 0.10 на CPU
Модель rnntОколо 225 МБ, INT8
Память, --pool-size 1Около 46 МБ resident; ps показывает около 277 МБ RSS
Память, --pool-size 2Около 66 МБ resident; ps показывает около 510 МБ RSS
Холодный стартОколо 0.94 с

Разница между resident footprint и RSS возникает из-за отображённой в память модели. RSS включает общие страницы memory-mapped-файла, которые операционная система может освободить под давлением. Для планирования нагрузки полезно отслеживать обе метрики и воспроизводить измерения на своём сервере.

⚖️
Ограничения бенчмарков. GigaAM v3 обучалась на большом объёме русской речи, включая Golos. Результаты на Golos и OpenSTT близки к обучающему распределению и могут быть лучше результата на ваших данных. На независимых наборах картина смешанная: gigastt лидирует не в каждом домене, поэтому перед внедрением нужен тест на собственных записях.

Что показывают сравнения

На чистой начитке оценки gigastt 3.55% и Vosk 0.54 2.97% имеют пересекающиеся доверительные интервалы. В опубликованной матрице это статистическая ничья. На дальнем поле, телефонии и YouTube gigastt показывает меньший WER среди участников этой матрицы, но Vosk и T-one работают быстрее.

Whisper полезнее при широкой многоязычности. Преимущество gigastt в сравнении с Whisper связано прежде всего с промежуточными результатами и компактной локальной упаковкой, а не с универсальностью по языкам.

⚠️
Стриминг не равен пакетной обработке. WebSocket использует буферизацию поверх офлайн-RNN-T. Медианное время до первого результата составляет примерно 0.82 с для дальнего поля и 1.65 с для шумной толпы. В тестах на 100 записях потоковый WER был примерно на 11–15 процентных пунктов хуже пакетного. Если точность важнее немедленного отклика, отправляйте готовый файл через REST.

Установка

# 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
cargo install gigastt

# На Debian/Ubuntu вместо brew install protobuf:
# sudo apt install protobuf-compiler

# Готовый CPU-образ, amd64 и arm64
docker pull ghcr.io/ekhodzitsky/gigastt:latest
docker run -p 9876:9876 ghcr.io/ekhodzitsky/gigastt:latest

# CUDA 12+ на Linux x86_64
docker pull ghcr.io/ekhodzitsky/gigastt:cuda

Стандартный INT8-комплект модели размером около 225 МБ загружается при первом запуске или командой gigastt download. Рантайм использует готовые INT8-веса: отдельного FP32-пути загрузки или инференса нет.

Для собственного образа модель можно подготовить во время сборки:

docker build --build-arg GIGASTT_BAKE_MODEL=1 -t gigastt:baked .
docker run -p 9876:9876 gigastt:baked
💡
Изолированный контур: локальность относится к инференсу после загрузки артефактов. Обычная сборка Rust-зависимости ort скачивает ONNX Runtime, а protoc должен быть установлен отдельно. Для автономной сборки используйте заранее подготовленный ONNX Runtime или режим динамической загрузки и перенесите внутрь контура готовые модель и бинарник.

Первые команды и проверка результата

# Один файл
gigastt transcribe recording.wav

# Папка с файлами
gigastt transcribe-batch samples/ out/

# Наблюдение за входной папкой
gigastt watch inbox/ out/ --move-to inbox/done/

# REST, SSE и WebSocket на одном порту
gigastt serve

После запуска проверьте готовность и выполните минимальную расшифровку:

curl http://127.0.0.1:9876/ready
curl -X POST http://127.0.0.1:9876/v1/transcribe -H 'Content-Type: application/octet-stream' --data-binary @recording.wav

Проверка успешна, если после загрузки модели /ready показывает готовность, а /v1/transcribe возвращает результат с распознанным текстом. HTTP-ответ сам по себе не подтверждает качество: сравните результат с ручной расшифровкой своего аудио, особенно если это телефон, переговорная или запись с фоновой музыкой.


Подключение по API

ЭндпоинтМетодНазначение
/healthGETПроверка жизнеспособности процесса
/readyGETГотовность модели принимать запросы
/v1/modelsGETДоступные варианты модели
/v1/transcribePOSTРасшифровка файла с полным ответом
/v1/transcribe/streamPOSTПотоковая выдача результата файла через SSE
/v1/audio/transcriptionsPOSTOpenAI-совместимая расшифровка
/v1/wsGETWebSocket с промежуточными и финальными результатами
/v1/jobsРазныеОчередь длинных задач при --enable-jobs
/v1/admin/reloadPOSTГорячая перезагрузка модели, только для loopback-клиентов

WebSocket-клиент подключается к ws://127.0.0.1:9876/v1/ws, передаёт конфигурацию и аудиокадры, затем получает сообщения partial и final. Для протокола 1.0 опубликованы типизированные клиенты на Go и TypeScript; переподключение учитывает retry_after_ms.

Если HTTP-сервер не нужен, движок можно подключить напрямую:

npm install gigastt
pip install gigastt

Для Rust:

[dependencies]
gigastt-core = "2.20"

Пакеты Node.js и Python опубликованы. Упаковка для SwiftPM и Kotlin AAR на дату проверки ещё находится в разработке.


Аппаратное ускорение и системные требования

ПлатформаФлаг или образИсполнение
ЛюбаяПо умолчаниюCPU
macOS ARM64--features coremlCoreML с автоматическим откатом на CPU при ошибке проверки
macOS ARM64--features aneЭкспериментальный ANE, только файловый режим
macOS ARM64--features candleЭкспериментальный Candle/Metal
Linux x86_64 + NVIDIA--features cuda или образ :cudaCUDA 12+
Android ARM64--features nnapiNNAPI

Актуальные требования: Rust 1.94+, protoc для сборки, macOS 14+ на Apple Silicon, Linux x86_64 или aarch64 либо Windows x86_64. Для минимальной установки с моделью и бинарником закладывайте примерно 250–400 МБ диска. Модели пунктуации, VAD и диаризации потребуют дополнительного места.

Производительность на Raspberry Pi пока не опубликована. Наличие arm64-образа подтверждает возможность установки, но не доказывает пригодность для диктовки в реальном времени. RTF, холодный старт и потоковую задержку нужно измерять на конкретной плате.


Безопасный запуск сервера

Сервер по умолчанию работает на петлевом интерфейсе. Встроены список разрешённых Origin, ограничение частоты запросов, корректное завершение активных сессий и Prometheus-метрики на отдельном адресе, по умолчанию 127.0.0.1:9090.

⚠️
Внимание: не выставляйте сервис в общедоступную сеть без обратного прокси, TLS и аутентификации. Встроенные ограничения запросов не заменяют контроль доступа к аудио и расшифровкам.

При горячей перезагрузке сервер прогревает новый движок и атомарно заменяет старый. Дополнительный пик памяти после отображения модели в память не измерен, поэтому на ограниченном устройстве оставьте запас или перезапускайте процесс.


Полезные сценарии

  1. Расшифровка интервью внутри контура. Передайте WAV, M4A или MP3 через CLI либо REST. Результатом будет текст или JSON с таймингами. Перед рабочим использованием проверьте WER на нескольких типичных записях.
  2. Обработка стереозвонков. Включите --stereo-speakers в CLI или channels=split в REST. Левый и правый каналы получат метки speaker_0 и speaker_1. Этот режим нельзя совмещать с модельной диаризацией.
  3. Голосовой ввод. Отправляйте аудио через WebSocket и показывайте пользователю partial, заменяя его после final. Учитывайте задержку около 0.8–1.7 с и более высокий WER относительно REST.
  4. Папка на входе, текст на выходе. Команда watch подхватывает новые записи, создаёт результаты и переносит исходники в обработанный каталог. Успех можно проверить по появлению файлов в out/ и перемещению записи в inbox/done/.
  5. Субтитры. Экспортируйте SRT или VTT с таймингами. Перед публикацией просмотрите границы сегментов и имена собственные вручную.
  6. Локальная замена Whisper API. Укажите клиенту базовый URL собственного сервера и используйте /v1/audio/transcriptions. Совместимость относится к этому сценарию расшифровки и не означает поддержку всего OpenAI API.

Лицензии

Код gigastt и стандартные веса GigaAM распространяются по MIT, что допускает коммерческое использование при соблюдении условий лицензии. Необязательная модель спикеров WeSpeaker имеет лицензию CC BY 4.0 и требует сохранения атрибуции.

🔴
Данные бенчмарков имеют отдельные условия: транскрипты OpenSTT распространяются по CC BY-NC 4.0, а Golos — по Sber Public License. Лицензия MIT проекта не распространяется автоматически на эти наборы данных.

Что проверить при проблемах

СимптомПроверка
Сборка падает на зависимостяхУбедитесь, что установлен protoc и команда доступна через PATH
Первый запуск ждёт модельЗаранее выполните gigastt download; стандартный INT8-комплект занимает около 225 МБ
Пул занятНастройте размер пула или включите очередь /v1/jobs; клиентские переподключения учитывают retry_after_ms
Браузер отклонён серверомДобавьте точный Origin в список разрешённых
Нет пунктуацииВключите --punctuation и --itn либо выберите e2e_rnnt
Стриминг теряет словаДля готовых файлов используйте REST: потоковый режим имеет отдельный профиль качества
RSS кажется значительно выше resident memoryУчитывайте страницы memory-mapped-модели и измеряйте обе метрики после прогрева
Нужна Raspberry PiНе переносите цифры Apple M1 на Pi; измерьте RTF, холодный старт и TTFP на своей плате

Официальные ссылки

Следующий шаг

Если нужен другой локальный стек распознавания речи, сравните Silero Models — open-source модели речи на русском.

Связанные материалы

Локальное распознавание полезно, когда записи разговоров нельзя передавать внешнему провайдеру или нужно встроить STT в собственное приложение.

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